diff options
Diffstat (limited to 'packages')
482 files changed, 17535 insertions, 6395 deletions
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index 2a9f59f..e4054ac 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -97,7 +97,7 @@ public class CaptivePortalLoginActivity extends Activity { final ConnectivityManager cm = ConnectivityManager.from(this); final Network network = new Network(mNetId); // Also initializes proxy system properties. - cm.setProcessDefaultNetwork(network); + cm.bindProcessToNetwork(network); // Proxy system properties must be initialized before setContentView is called because // setContentView initializes the WebView logic which in turn reads the system properties. diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml index 165b11e..bf50017 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -40,6 +40,11 @@ <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.document/root" /> </intent-filter> + <intent-filter> + <action android:name="android.provider.action.BROWSE_DOCUMENT_ROOT" /> + <category android:name="android.intent.category.DEFAULT" /> + <data android:mimeType="vnd.android.document/root" /> + </intent-filter> </activity> <activity @@ -65,5 +70,10 @@ <data android:scheme="package" /> </intent-filter> </receiver> + + <service + android:name=".CopyService" + android:exported="false"> + </service> </application> </manifest> diff --git a/packages/DocumentsUI/res/layout/dialog_create_dir.xml b/packages/DocumentsUI/res/layout/dialog_create_dir.xml index 54e26b4..5ed476f 100644 --- a/packages/DocumentsUI/res/layout/dialog_create_dir.xml +++ b/packages/DocumentsUI/res/layout/dialog_create_dir.xml @@ -22,6 +22,7 @@ <EditText android:id="@android:id/text1" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:inputType="text" /> </FrameLayout> diff --git a/packages/DocumentsUI/res/layout/fragment_pick.xml b/packages/DocumentsUI/res/layout/fragment_pick.xml index 5735871..87dc4f8 100644 --- a/packages/DocumentsUI/res/layout/fragment_pick.xml +++ b/packages/DocumentsUI/res/layout/fragment_pick.xml @@ -21,12 +21,19 @@ android:baselineAligned="false" android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeightSmall"> - + <Button + android:id="@android:id/button2" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:text="@android:string/cancel" + android:visibility="gone" + style="?android:attr/buttonBarNegativeButtonStyle" /> <Button android:id="@android:id/button1" - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="match_parent" + android:layout_weight="1" android:textAllCaps="false" style="?android:attr/buttonBarPositiveButtonStyle" /> - </LinearLayout> diff --git a/packages/DocumentsUI/res/menu/activity.xml b/packages/DocumentsUI/res/menu/activity.xml index b9b8054..5b944ab 100644 --- a/packages/DocumentsUI/res/menu/activity.xml +++ b/packages/DocumentsUI/res/menu/activity.xml @@ -60,4 +60,8 @@ <item android:id="@+id/menu_file_size" android:showAsAction="never" /> + <item + android:id="@+id/menu_settings" + android:title="@string/menu_settings" + android:showAsAction="never" /> </menu> diff --git a/packages/DocumentsUI/res/menu/mode_directory.xml b/packages/DocumentsUI/res/menu/mode_directory.xml index 695060d..4b89823 100644 --- a/packages/DocumentsUI/res/menu/mode_directory.xml +++ b/packages/DocumentsUI/res/menu/mode_directory.xml @@ -33,4 +33,8 @@ android:id="@+id/menu_select_all" android:title="@string/menu_select_all" android:showAsAction="never" /> + <item + android:id="@+id/menu_copy" + android:title="@string/menu_copy" + android:showAsAction="never" /> </menu> diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml index 98e2b2f..14a9721 100644 --- a/packages/DocumentsUI/res/values-af/strings.xml +++ b/packages/DocumentsUI/res/values-af/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Deel"</string> <string name="menu_delete" msgid="8138799623850614177">"Vee uit"</string> <string name="menu_select" msgid="8711270657353563424">"Kies \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Kies almal"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopieer na …"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Wys interne berging"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Wys SD-kaart"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Versteek interne berging"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Versteek SD-kaart"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Wys lêergrootte"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Versteek lêergrootte"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> gekies"</string> <string name="sort_name" msgid="9183560467917256779">"Volgens naam"</string> <string name="sort_date" msgid="586080032956151448">"Volgens datum gewysig"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Kan lêer nie oopmaak nie"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Kan sommige dokumente nie uitvee nie"</string> <string name="share_via" msgid="8966594246261344259">"Deel via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopieer tans lêers"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> oor"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Kopieer tans <xliff:g id="COUNT_1">%1$d</xliff:g> lêers.</item> + <item quantity="one">Kopieer tans <xliff:g id="COUNT_0">%1$d</xliff:g> lêer.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Maak tans gereed vir kopieer …"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml index 88865bc..7e655d0 100644 --- a/packages/DocumentsUI/res/values-am/strings.xml +++ b/packages/DocumentsUI/res/values-am/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"አጋራ"</string> <string name="menu_delete" msgid="8138799623850614177">"ሰርዝ"</string> <string name="menu_select" msgid="8711270657353563424">"«<xliff:g id="DIRECTORY">^1</xliff:g>»ን ይምረጡ"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"ሁሉንም ምረጥ"</string> + <string name="menu_copy" msgid="3612326052677229148">"ቅዳ ወደ…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"ውስጣዊ ማከማቻ አሳይ"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD ካርድ አሳይ"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"ውስጣዊ ማከማቻ ደብቅ"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD ካርድ ደብቅ"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"የፋይል መጠን አሳይ"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"የፋይል መጠን ደብቅ"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ተመርጠዋል"</string> <string name="sort_name" msgid="9183560467917256779">"በስም"</string> <string name="sort_date" msgid="586080032956151448">"በተለወጠበት ቀን"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ፋይል መክፈት አይቻልም"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"አንዳንድ ሰነዶችን መሰረዝ አልተቻለም"</string> <string name="share_via" msgid="8966594246261344259">"በሚከተለው በኩል ያጋሩ"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ፋይሎች በመገልበጥ ላይ"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ቀርቷል"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች በመቅዳት ላይ።</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች በመቅዳት ላይ።</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"ቅጂ በማዘጋጀት ላይ…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ar/strings.xml b/packages/DocumentsUI/res/values-ar/strings.xml index 5162241..4db588d 100644 --- a/packages/DocumentsUI/res/values-ar/strings.xml +++ b/packages/DocumentsUI/res/values-ar/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"مشاركة"</string> <string name="menu_delete" msgid="8138799623850614177">"حذف"</string> <string name="menu_select" msgid="8711270657353563424">"تحديد \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"تحديد الكل"</string> + <string name="menu_copy" msgid="3612326052677229148">"نسخ إلى…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"إظهار وحدة التخزين الداخلية"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"إظهار بطاقة SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"إخفاء وحدة التخزين الداخلية"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"إخفاء بطاقة SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"إظهار حجم الملف"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"إخفاء حجم الملف"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"تم تحديد <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"بحسب الاسم"</string> <string name="sort_date" msgid="586080032956151448">"بحسب تاريخ التعديل"</string> @@ -57,4 +59,24 @@ <string name="toast_no_application" msgid="1339885974067891667">"لا يمكن فتح الملف"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"تعذر حذف بعض المستندات"</string> <string name="share_via" msgid="8966594246261344259">"مشاركة عبر"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"جارٍ نسخ الملفات"</string> + <string name="copy_remaining" msgid="6283790937387975095">"المدة المتبقية: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="zero">جارٍ نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات.</item> + <item quantity="two">جارٍ نسخ ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>).</item> + <item quantity="few">جارٍ نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات.</item> + <item quantity="many">جارٍ نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا.</item> + <item quantity="other">جارٍ نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> من الملفات.</item> + <item quantity="one">جارٍ نسخ ملف واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>).</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"جارٍ التحضير للنسخ ..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml index 14726eb..81ad675 100644 --- a/packages/DocumentsUI/res/values-bg/strings.xml +++ b/packages/DocumentsUI/res/values-bg/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Споделяне"</string> <string name="menu_delete" msgid="8138799623850614177">"Изтриване"</string> <string name="menu_select" msgid="8711270657353563424">"Избиране на „<xliff:g id="DIRECTORY">^1</xliff:g>“"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Избиране на всички"</string> + <string name="menu_copy" msgid="3612326052677229148">"Копиране във…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Вътр. хранилище: Показв."</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD карта: Показване"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Вътр. хранилище: Скрив."</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD карта: Скриване"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Размер на файла: Показв."</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Размер на файла: Скрив."</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Избрахте <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"По име"</string> <string name="sort_date" msgid="586080032956151448">"По дата на промяната"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Файлът не може да се отвори"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Някои документи не могат да бъдат изтрити"</string> <string name="share_via" msgid="8966594246261344259">"Споделяне чрез"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Файловете се копират"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Оставащо време: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Копират се <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> + <item quantity="one">Копира се <xliff:g id="COUNT_0">%1$d</xliff:g> файл.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Подготвя се за копиране…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-bn-rBD/strings.xml b/packages/DocumentsUI/res/values-bn-rBD/strings.xml index 55fe9c7..71443d1 100644 --- a/packages/DocumentsUI/res/values-bn-rBD/strings.xml +++ b/packages/DocumentsUI/res/values-bn-rBD/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"ভাগ করুন"</string> <string name="menu_delete" msgid="8138799623850614177">"মুছুন"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" নির্বাচন করুন"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"সমস্ত নির্বাচন করুন"</string> + <string name="menu_copy" msgid="3612326052677229148">"এতে অনুলিপি করুন…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"অভ্যন্তরীণ সঞ্চয়স্থান দেখান"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD কার্ড দেখান"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"অভ্যন্তরীণ সঞ্চয়স্থান লুকান"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD কার্ড লুকান"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ফাইলের আকার দেখান"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ফাইলের আকার লুকান"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> নির্বাচন করা হয়েছে"</string> <string name="sort_name" msgid="9183560467917256779">"নামের দ্বারা"</string> <string name="sort_date" msgid="586080032956151448">"পরিবর্তনের তারিখ দ্বারা"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ফাইল খোলা যাবে না"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"কিছু দস্তাবেজ মুছতে অসমর্থ"</string> <string name="share_via" msgid="8966594246261344259">"এর মাধ্যমে ভাগ করুন"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ফাইলগুলি অনুলিপি করা হচ্ছে"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> বাকি"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল অনুলিপি করা হচ্ছে৷</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল অনুলিপি করা হচ্ছে৷</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"অনুলিপি করার জন্য প্রস্তুত করা হচ্ছে..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml index a4d4a51..c3e1ff8 100644 --- a/packages/DocumentsUI/res/values-ca/strings.xml +++ b/packages/DocumentsUI/res/values-ca/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Comparteix"</string> <string name="menu_delete" msgid="8138799623850614177">"Suprimeix"</string> <string name="menu_select" msgid="8711270657353563424">"Selecciona \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Selecciona\'ls tots"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copia a…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Mostra emmagatz. intern"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Mostra la targeta SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Amaga emmagatz. intern"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Amaga la targeta SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Mostra la mida de fitxer"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Amaga la mida del fitxer"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Seleccionats: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Per nom"</string> <string name="sort_date" msgid="586080032956151448">"Per data de modificació"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"No es pot obrir el fitxer."</string> <string name="toast_failed_delete" msgid="2180678019407244069">"No es poden suprimir alguns documents."</string> <string name="share_via" msgid="8966594246261344259">"Comparteix mitjançant"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"S\'estan copiant fitxers"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Temps restant: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">S\'estan copiant <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers.</item> + <item quantity="one">S\'està copiant <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"S\'està preparant una còpia…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml index 7261849..ae6e625 100644 --- a/packages/DocumentsUI/res/values-cs/strings.xml +++ b/packages/DocumentsUI/res/values-cs/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Sdílet"</string> <string name="menu_delete" msgid="8138799623850614177">"Smazat"</string> <string name="menu_select" msgid="8711270657353563424">"Vyberte adresář <xliff:g id="DIRECTORY">^1</xliff:g>"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Vybrat vše"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopírovat do…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Zobrazit inter. úložiště"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Zobrazit SD kartu"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Skrýt interní úložiště"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skrýt SD kartu"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Zobrazit velikost souboru"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Skrýt velikost souboru"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Vybráno: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Podle názvu"</string> <string name="sort_date" msgid="586080032956151448">"Podle data úpravy"</string> @@ -57,4 +59,22 @@ <string name="toast_no_application" msgid="1339885974067891667">"Soubor nelze otevřít"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Některé dokumenty nelze smazat"</string> <string name="share_via" msgid="8966594246261344259">"Sdílet pomocí"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopírování souborů"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Zbývající čas: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="few">Kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souborů</item> + <item quantity="many">Kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souboru</item> + <item quantity="other">Kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souborů</item> + <item quantity="one">Kopírování <xliff:g id="COUNT_0">%1$d</xliff:g> souboru</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Příprava na kopírování…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml index f4e59b0..8e9ff6b 100644 --- a/packages/DocumentsUI/res/values-da/strings.xml +++ b/packages/DocumentsUI/res/values-da/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Del"</string> <string name="menu_delete" msgid="8138799623850614177">"Slet"</string> <string name="menu_select" msgid="8711270657353563424">"Vælg \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Vælg alle"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopiér til…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Vis intern lagerplads"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Vis SD-kort"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Skjul intern lagerplads"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skjul SD-kort"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Vis filstørrelse"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Skjul filstørrelse"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> er valgt"</string> <string name="sort_name" msgid="9183560467917256779">"Efter navn"</string> <string name="sort_date" msgid="586080032956151448">"Efter ændringsdato"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Filen kan ikke åbnes"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nogle dokumenter kan ikke slettes"</string> <string name="share_via" msgid="8966594246261344259">"Del via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopierer filer"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> tilbage"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> + <item quantity="other">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Forbereder kopiering…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml index b0e4a14..f6f2514 100644 --- a/packages/DocumentsUI/res/values-de/strings.xml +++ b/packages/DocumentsUI/res/values-de/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Teilen"</string> <string name="menu_delete" msgid="8138799623850614177">"Löschen"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" auswählen"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Alle auswählen"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopieren nach..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Int. Speicher anzeigen"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD-Karte anzeigen"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Int. Speicher ausblenden"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD-Karte ausblenden"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Dateigröße anzeigen"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Dateigröße ausblenden"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ausgewählt"</string> <string name="sort_name" msgid="9183560467917256779">"Nach Name"</string> <string name="sort_date" msgid="586080032956151448">"Nach Änderungsdatum"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Datei kann nicht geöffnet werden."</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Einige Dokumente konnten nicht gelöscht werden."</string> <string name="share_via" msgid="8966594246261344259">"Teilen über"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Dateien werden kopiert"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Noch <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien werden kopiert.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei wird kopiert.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Kopieren wird vorbereitet…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml index 2188dc2..40d4aae 100644 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ b/packages/DocumentsUI/res/values-el/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Κοινή χρήση"</string> <string name="menu_delete" msgid="8138799623850614177">"Διαγραφή"</string> <string name="menu_select" msgid="8711270657353563424">"Επιλογή \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Επιλογή όλων"</string> + <string name="menu_copy" msgid="3612326052677229148">"Αντιγραφή σε…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Εμφ.εσωτ.χώρου αποθήκ."</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Εμφάνιση κάρτας SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Απόκρ.εσωτ.χώρου αποθήκ."</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Απόκρυψη κάρτας SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Εμφ. μεγέθους αρχείου"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Απόκρ. μεγέθους αρχείου"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Επιλέχθηκαν <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Κατά όνομα"</string> <string name="sort_date" msgid="586080032956151448">"Κατά ημερομηνία τροποποίησης"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Δεν είναι δυνατό το άνοιγμα του αρχείου"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Δεν είναι δυνατή η διαγραφή ορισμένων εγγράφων"</string> <string name="share_via" msgid="8966594246261344259">"Κοινή χρήση μέσω"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Αντιγραφή αρχείων"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Απομένουν <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Αντιγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων.</item> + <item quantity="one">Αντιγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Προετοιμασία για αντιγραφή…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-en-rAU/strings.xml b/packages/DocumentsUI/res/values-en-rAU/strings.xml index 89257a1..26af414 100644 --- a/packages/DocumentsUI/res/values-en-rAU/strings.xml +++ b/packages/DocumentsUI/res/values-en-rAU/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Share"</string> <string name="menu_delete" msgid="8138799623850614177">"Delete"</string> <string name="menu_select" msgid="8711270657353563424">"Select \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Select All"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copy to…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Show internal storage"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Show SD card"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Hide internal storage"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Hide SD card"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selected"</string> <string name="sort_name" msgid="9183560467917256779">"By name"</string> <string name="sort_date" msgid="586080032956151448">"By date modified"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Cannot open file"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string> <string name="share_via" msgid="8966594246261344259">"Share via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copying files"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> left"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> + <item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-en-rGB/strings.xml b/packages/DocumentsUI/res/values-en-rGB/strings.xml index 89257a1..26af414 100644 --- a/packages/DocumentsUI/res/values-en-rGB/strings.xml +++ b/packages/DocumentsUI/res/values-en-rGB/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Share"</string> <string name="menu_delete" msgid="8138799623850614177">"Delete"</string> <string name="menu_select" msgid="8711270657353563424">"Select \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Select All"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copy to…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Show internal storage"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Show SD card"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Hide internal storage"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Hide SD card"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selected"</string> <string name="sort_name" msgid="9183560467917256779">"By name"</string> <string name="sort_date" msgid="586080032956151448">"By date modified"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Cannot open file"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string> <string name="share_via" msgid="8966594246261344259">"Share via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copying files"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> left"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> + <item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-en-rIN/strings.xml b/packages/DocumentsUI/res/values-en-rIN/strings.xml index 89257a1..26af414 100644 --- a/packages/DocumentsUI/res/values-en-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-en-rIN/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Share"</string> <string name="menu_delete" msgid="8138799623850614177">"Delete"</string> <string name="menu_select" msgid="8711270657353563424">"Select \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Select All"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copy to…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Show internal storage"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Show SD card"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Hide internal storage"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Hide SD card"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selected"</string> <string name="sort_name" msgid="9183560467917256779">"By name"</string> <string name="sort_date" msgid="586080032956151448">"By date modified"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Cannot open file"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string> <string name="share_via" msgid="8966594246261344259">"Share via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copying files"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> left"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> + <item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml index 693a981..366cee9 100644 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Compartir"</string> <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string> <string name="menu_select" msgid="8711270657353563424">"Seleccionar \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Seleccionar todos"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copiar a…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Mostrar almacen. interno"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Mostrar tarjeta SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ocultar almacen. interno"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar tarjeta SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño archivos"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño archivos"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> seleccionado(s)"</string> <string name="sort_name" msgid="9183560467917256779">"Por nombre"</string> <string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"No se puede abrir el archivo."</string> <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos."</string> <string name="share_via" msgid="8966594246261344259">"Compartir mediante"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copiando archivos"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Faltan <xliff:g id="DURATION">%s</xliff:g>."</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> + <item quantity="one">Copiando <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml index 422c47c..a5db821 100644 --- a/packages/DocumentsUI/res/values-es/strings.xml +++ b/packages/DocumentsUI/res/values-es/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Compartir"</string> <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string> <string name="menu_select" msgid="8711270657353563424">"Selecciona \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Seleccionar todo"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copiar en…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Mostrar almac. interno"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Mostrar tarjeta SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ocultar almac. interno"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar tarjeta SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño archivo"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño archivo"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Seleccionado: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Por nombre"</string> <string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Error al abrir el archivo"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos"</string> <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copiando archivos"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Tiempo restante: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> archivos.</item> + <item quantity="one">Copiando <xliff:g id="COUNT_0">%1$d</xliff:g> archivo.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml index cce47c1..ebf3927 100644 --- a/packages/DocumentsUI/res/values-et-rEE/strings.xml +++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Jaga"</string> <string name="menu_delete" msgid="8138799623850614177">"Kustuta"</string> <string name="menu_select" msgid="8711270657353563424">"Kataloogi „<xliff:g id="DIRECTORY">^1</xliff:g>” valimine"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Vali kõik"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopeeri asukohta ..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Kuva sis. salvestusruum"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Kuva SD-kaart"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Peida sis. salvestusruum"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Peida SD-kaart"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Kuva faili suurus"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Peida faili suurus"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> on valitud"</string> <string name="sort_name" msgid="9183560467917256779">"Nime järgi"</string> <string name="sort_date" msgid="586080032956151448">"Muutmiskuupäeva järgi"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Faili ei saa avada"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Mõnda dokumenti ei õnnestu kustutada"</string> <string name="share_via" msgid="8966594246261344259">"Jagage teenusega"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Failide kopeerimine"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Jäänud on <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> faili kopeerimine.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> faili kopeerimine.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Kopeerimise ettevalmistamine …"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-eu-rES/strings.xml b/packages/DocumentsUI/res/values-eu-rES/strings.xml index 4e0735a..95dca4a 100644 --- a/packages/DocumentsUI/res/values-eu-rES/strings.xml +++ b/packages/DocumentsUI/res/values-eu-rES/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Partekatu"</string> <string name="menu_delete" msgid="8138799623850614177">"Ezabatu"</string> <string name="menu_select" msgid="8711270657353563424">"Hautatu \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Hautatu guztiak"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopiatu hemen…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Erakutsi barneko memoria"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Erakutsi SD txartela"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ezkutatu barneko memoria"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ezkutatu SD txartela"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Erakutsi fitxategi-tamaina"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ezkutatu fitxategi-tamaina"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> hautatuta"</string> <string name="sort_name" msgid="9183560467917256779">"Izenaren arabera"</string> <string name="sort_date" msgid="586080032956151448">"Aldatze-dataren arabera"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Ezin da fitxategia ireki"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ezin izan dira dokumentu batzuk ezabatu"</string> <string name="share_via" msgid="8966594246261344259">"Partekatu honen bidez:"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Fitxategiak kopiatzen"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Falta den denbora: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi kopiatzen.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi kopiatzen.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Kopiatzeko prestatzen…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml index b8874b8..77a8ca1 100644 --- a/packages/DocumentsUI/res/values-fa/strings.xml +++ b/packages/DocumentsUI/res/values-fa/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"اشتراکگذاری"</string> <string name="menu_delete" msgid="8138799623850614177">"حذف"</string> <string name="menu_select" msgid="8711270657353563424">"انتخاب «<xliff:g id="DIRECTORY">^1</xliff:g>»"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"انتخاب همه"</string> + <string name="menu_copy" msgid="3612326052677229148">"کپی در..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"نمایش فضای ذخیرهسازی داخلی"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"نمایش کارت SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"پنهان کردن فضای ذخیرهسازی داخلی"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"پنهان کردن کارت SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"نمایش اندازه فایل"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"پنهان کردن اندازه فایل"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> انتخاب شد"</string> <string name="sort_name" msgid="9183560467917256779">"بر اساس نام"</string> <string name="sort_date" msgid="586080032956151448">"بر اساس تاریخ اصلاح"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"فایل باز نمیشود"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"برخی از اسناد حذف نمیشوند"</string> <string name="share_via" msgid="8966594246261344259">"اشتراکگذاری از طریق"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"در حال کپی کردن فایلها"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> باقیمانده"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">در حال کپی کردن <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item> + <item quantity="other">در حال کپی کردن <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"در حال آمادهسازی برای کپی..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml index 74a0beb..c1e8449 100644 --- a/packages/DocumentsUI/res/values-fi/strings.xml +++ b/packages/DocumentsUI/res/values-fi/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Jaa"</string> <string name="menu_delete" msgid="8138799623850614177">"Poista"</string> <string name="menu_select" msgid="8711270657353563424">"Valitse <xliff:g id="DIRECTORY">^1</xliff:g>"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Valitse kaikki"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopioi kohteeseen…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Näytä sis. tallennustila"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Näytä SD-kortti"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Piilota sis. tallennust."</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Piilota SD-kortti"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Näytä tiedostokoko"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Piilota tiedostokoko"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> valittua"</string> <string name="sort_name" msgid="9183560467917256779">"Nimen mukaan"</string> <string name="sort_date" msgid="586080032956151448">"Muokkauspäivän mukaan"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Tiedostoa ei voi avata"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Joitakin asiakirjoja ei voi poistaa"</string> <string name="share_via" msgid="8966594246261344259">"Jaa sovelluksessa"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopioidaan tiedostoja"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> jäljellä"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Kopioidaan <xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa.</item> + <item quantity="one">Kopioidaan <xliff:g id="COUNT_0">%1$d</xliff:g> tiedosto.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Valmistellaan kopiointia…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index 00e09a2..2d6033b 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Partager"</string> <string name="menu_delete" msgid="8138799623850614177">"Supprimer"</string> <string name="menu_select" msgid="8711270657353563424">"Sélectionner « <xliff:g id="DIRECTORY">^1</xliff:g> »"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Tout sélectionner"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copier vers..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Aff. mém. stock. interne"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Afficher la carte SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Masquer mém. stock. int."</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Masquer la carte SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Afficher taille fichier"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Masquer taille fichier"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> sélectionné(s)"</string> <string name="sort_name" msgid="9183560467917256779">"Par nom"</string> <string name="sort_date" msgid="586080032956151448">"Par date de modification"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Impossible d\'ouvrir le fichier"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents"</string> <string name="share_via" msgid="8966594246261344259">"Partager par"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copie de fichiers..."</string> + <string name="copy_remaining" msgid="6283790937387975095">"Durée restante : <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Copier de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours.</item> + <item quantity="other">Copier de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Préparation de la copie en cours"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml index 5b4b2d8..64feecb 100644 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ b/packages/DocumentsUI/res/values-fr/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Partager"</string> <string name="menu_delete" msgid="8138799623850614177">"Supprimer"</string> <string name="menu_select" msgid="8711270657353563424">"Sélectionner \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Tout sélectionner"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copier vers…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Aff. mém. stock. interne"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Afficher la carte SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Masquer mém. stock. int."</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Masquer la carte SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Afficher taille fichier"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Masquer taille fichier"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> élément(s) sélectionné(s)"</string> <string name="sort_name" msgid="9183560467917256779">"Par nom"</string> <string name="sort_date" msgid="586080032956151448">"Par date de modification"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Impossible d\'ouvrir le fichier."</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents."</string> <string name="share_via" msgid="8966594246261344259">"Partager via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copie de fichiers en cours"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Temps restant : <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours…</item> + <item quantity="other">Copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours…</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Préparation de la copie en cours…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-gl-rES/strings.xml b/packages/DocumentsUI/res/values-gl-rES/strings.xml index 91199e6..518c62c 100644 --- a/packages/DocumentsUI/res/values-gl-rES/strings.xml +++ b/packages/DocumentsUI/res/values-gl-rES/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Compartir"</string> <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string> <string name="menu_select" msgid="8711270657353563424">"Selecciona \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Seleccionar todos"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copiar en…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Mostrar almacen. interno"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Mostrar tarxeta SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ocultar almacen. interno"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar tarxeta SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño ficheiro"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño ficheiro"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> seleccionados"</string> <string name="sort_name" msgid="9183560467917256779">"Por nome"</string> <string name="sort_date" msgid="586080032956151448">"Por data de modificación"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Non se pode abrir o ficheiro"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Non se poden eliminar algúns documentos"</string> <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copiando ficheiros"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Tempo restante: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> + <item quantity="one">Copianto <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-hi/strings.xml b/packages/DocumentsUI/res/values-hi/strings.xml index 5f122f8..b422333 100644 --- a/packages/DocumentsUI/res/values-hi/strings.xml +++ b/packages/DocumentsUI/res/values-hi/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"साझा करें"</string> <string name="menu_delete" msgid="8138799623850614177">"हटाएं"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" चुनें"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"सभी चुनें"</string> + <string name="menu_copy" msgid="3612326052677229148">"इनकी कॉपी बनाएं..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"आंतरिक मेमोरी दिखाएं"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD कार्ड दिखाएं"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"आंतरिक मेमोरी छिपाएं"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD कार्ड छिपाएं"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"फ़ाइल आकार दिखाएं"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"फ़ाइल आकार छिपाएं"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> चयनित"</string> <string name="sort_name" msgid="9183560467917256779">"नाम के अनुसार"</string> <string name="sort_date" msgid="586080032956151448">"बदलाव के दिनांक के अनुसार"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"फ़ाइल नहीं खोली जा सकती"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"कुछ दस्तावेज़ों को हटाने में अक्षम"</string> <string name="share_via" msgid="8966594246261344259">"इसके द्वारा साझा करें"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"फ़ाइलें कॉपी हो रही हैं"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> शेष"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें कॉपी की जा रही हैं.</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें कॉपी की जा रही हैं.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"कॉपी करने की तैयारी हो रही है…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml index 35c8508..518c62d 100644 --- a/packages/DocumentsUI/res/values-hr/strings.xml +++ b/packages/DocumentsUI/res/values-hr/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Dijeli"</string> <string name="menu_delete" msgid="8138799623850614177">"Izbriši"</string> <string name="menu_select" msgid="8711270657353563424">"Odaberi \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Odaberi sve"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopiraj u…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Pokaži internu pohranu"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Pokaži SD karticu"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Sakrij internu pohranu"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Sakrij SD karticu"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Pokaži veličinu datoteke"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Sakrij veličinu datoteke"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Odabrano: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Po korisniku"</string> <string name="sort_date" msgid="586080032956151448">"Po datumu izmjene"</string> @@ -57,4 +59,21 @@ <string name="toast_no_application" msgid="1339885974067891667">"Datoteku nije moguće otvoriti"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nije moguće izbrisati neke dokumente"</string> <string name="share_via" msgid="8966594246261344259">"Dijeli putem"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopiranje datoteka"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Još <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> + <item quantity="few">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> + <item quantity="other">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Priprema za kopiranje…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml index 334e2a0..172402b 100644 --- a/packages/DocumentsUI/res/values-hu/strings.xml +++ b/packages/DocumentsUI/res/values-hu/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Megosztás"</string> <string name="menu_delete" msgid="8138799623850614177">"Törlés"</string> <string name="menu_select" msgid="8711270657353563424">"A(z) „<xliff:g id="DIRECTORY">^1</xliff:g>” mappa kiválasztása"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Az összes kijelölése"</string> + <string name="menu_copy" msgid="3612326052677229148">"Másolás ide…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Belső tárhely"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD-kártya megjelenítése"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Belső tárhely elrejtése"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD-kártya elrejtése"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Fájlméret megjelenítése"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Fájlméret elrejtése"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> kiválasztva"</string> <string name="sort_name" msgid="9183560467917256779">"Név szerint"</string> <string name="sort_date" msgid="586080032956151448">"Módosítás dátuma szerint"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"A fájlt nem lehet megnyitni"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Néhány dokumentumot nem lehet törölni"</string> <string name="share_via" msgid="8966594246261344259">"Megosztás itt:"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Fájlok másolása"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> van hátra"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fájl másolása.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fájl másolása.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Felkészülés a másolásra…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index 1040fd2..89be3b5 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Համօգտագործել"</string> <string name="menu_delete" msgid="8138799623850614177">"Ջնջել"</string> <string name="menu_select" msgid="8711270657353563424">"Ընտրել «<xliff:g id="DIRECTORY">^1</xliff:g>»"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Ընտրել բոլորը"</string> + <string name="menu_copy" msgid="3612326052677229148">"Պատճենել…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Ցույց տալ ներքին պահոցը"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Ցույց տալ SD քարտը"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Թաքցնել ներքին պահոցը"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Թաքցնել SD քարտը"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Ցույց տալ ֆայլի չափը"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Թաքցնել ֆայլի չափը"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ընտրված"</string> <string name="sort_name" msgid="9183560467917256779">"Ըստ անվան"</string> <string name="sort_date" msgid="586080032956151448">"Ըստ փոփոխման ամսաթվի"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Հնարավոր չէ բացել ֆայլը"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Անհնար է ջնջել որոշ փաստաթղթեր"</string> <string name="share_via" msgid="8966594246261344259">"Տարածել"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Ֆայլերի պատճենում"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Մնացել է <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի պատճենում:</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի պատճենում:</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Պատճենման նախապատրաստում…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml index a8c62da..ee15004 100644 --- a/packages/DocumentsUI/res/values-in/strings.xml +++ b/packages/DocumentsUI/res/values-in/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Bagikan"</string> <string name="menu_delete" msgid="8138799623850614177">"Hapus"</string> <string name="menu_select" msgid="8711270657353563424">"Pilih \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Pilih Semua"</string> + <string name="menu_copy" msgid="3612326052677229148">"Salin ke…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Tampilkan simpanan internal"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Tampilkan kartu SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Sembunyikan simpanan internal"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Sembunyikan kartu SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Tampilkan ukuran file"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Sembunyikan ukuran file"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> dipilih"</string> <string name="sort_name" msgid="9183560467917256779">"Menurut nama"</string> <string name="sort_date" msgid="586080032956151448">"Menurut tanggal diubah"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Tidak dapat membuka file"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat menghapus beberapa dokumen"</string> <string name="share_via" msgid="8966594246261344259">"Bagikan melalui"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Menyalin file"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> lagi"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> + <item quantity="one">Menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Menyiapkan salinan..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-is-rIS/strings.xml b/packages/DocumentsUI/res/values-is-rIS/strings.xml index b81b024..eebac4a 100644 --- a/packages/DocumentsUI/res/values-is-rIS/strings.xml +++ b/packages/DocumentsUI/res/values-is-rIS/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Deila"</string> <string name="menu_delete" msgid="8138799623850614177">"Eyða"</string> <string name="menu_select" msgid="8711270657353563424">"Velja „<xliff:g id="DIRECTORY">^1</xliff:g>“"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Velja allt"</string> + <string name="menu_copy" msgid="3612326052677229148">"Afrita í ..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Sýna innbyggða geymslu"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Sýna SD-kort"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Fela innbyggða geymslu"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Fela SD-kort"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Sýna skráarstærð"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Fela skráarstærð"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> valin"</string> <string name="sort_name" msgid="9183560467917256779">"Eftir heiti"</string> <string name="sort_date" msgid="586080032956151448">"Eftir breytingadags."</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Ekki er hægt að opna skrána"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ekki er hægt að eyða einhverjum skjölum"</string> <string name="share_via" msgid="8966594246261344259">"Deila í gegnum"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Afritar skrár"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> eftir"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Afritar <xliff:g id="COUNT_1">%1$d</xliff:g> skrá.</item> + <item quantity="other">Afritar <xliff:g id="COUNT_1">%1$d</xliff:g> skrár.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Undirbúningur fyrir afritun…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml index fa5743f..b905e6d 100644 --- a/packages/DocumentsUI/res/values-it/strings.xml +++ b/packages/DocumentsUI/res/values-it/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Condividi"</string> <string name="menu_delete" msgid="8138799623850614177">"Elimina"</string> <string name="menu_select" msgid="8711270657353563424">"Seleziona \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Seleziona tutti"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copia in…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Mostra memoria interna"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Mostra scheda SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Nascondi memoria interna"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Nascondi scheda SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Mostra dimensioni file"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Nascondi dimensioni file"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selezionati"</string> <string name="sort_name" msgid="9183560467917256779">"Per nome"</string> <string name="sort_date" msgid="586080032956151448">"Per data di modifica"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Impossibile aprire il file"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Impossibile eliminare alcuni documenti"</string> <string name="share_via" msgid="8966594246261344259">"Condividi via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copia di file in corso"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> rimanenti"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Copia di <xliff:g id="COUNT_1">%1$d</xliff:g> file in corso.</item> + <item quantity="one">Copia di <xliff:g id="COUNT_0">%1$d</xliff:g> file in corso.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Preparazione alla copia…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml index 92a0bf4..c7fcea8 100644 --- a/packages/DocumentsUI/res/values-iw/strings.xml +++ b/packages/DocumentsUI/res/values-iw/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"שתף"</string> <string name="menu_delete" msgid="8138799623850614177">"מחק"</string> <string name="menu_select" msgid="8711270657353563424">"בחר ב-\"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"בחר הכל"</string> + <string name="menu_copy" msgid="3612326052677229148">"העתק אל…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"הצג אחסון פנימי"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"הצג כרטיס SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"הסתר אחסון פנימי"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"הסתר כרטיס SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"הצג גודל קובץ"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"הסתר גודל קובץ"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> נבחרו"</string> <string name="sort_name" msgid="9183560467917256779">"לפי שם"</string> <string name="sort_date" msgid="586080032956151448">"לפי תאריך שינוי"</string> @@ -57,4 +59,22 @@ <string name="toast_no_application" msgid="1339885974067891667">"לא ניתן לפתוח את הקובץ"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"לא ניתן למחוק חלק מהמסמכים"</string> <string name="share_via" msgid="8966594246261344259">"שתף באמצעות"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"מעתיק קבצים"</string> + <string name="copy_remaining" msgid="6283790937387975095">"זמן נותר: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="two">מעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> + <item quantity="many">מעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> + <item quantity="other">מעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> + <item quantity="one">מעתיק קובץ <xliff:g id="COUNT_0">%1$d</xliff:g>.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"מתכונן להעתקה..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml index 938dfa4..939ebdc 100644 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ b/packages/DocumentsUI/res/values-ja/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"共有"</string> <string name="menu_delete" msgid="8138799623850614177">"削除"</string> <string name="menu_select" msgid="8711270657353563424">"「<xliff:g id="DIRECTORY">^1</xliff:g>」を選択"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"すべて選択"</string> + <string name="menu_copy" msgid="3612326052677229148">"コピー…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"内部ストレージを表示"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SDカードを表示"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"内部ストレージを非表示"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SDカードを非表示"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ファイルサイズを表示"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ファイルサイズを非表示"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g>件選択済み"</string> <string name="sort_name" msgid="9183560467917256779">"名前順"</string> <string name="sort_date" msgid="586080032956151448">"更新日順"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ファイルを開けません"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"一部のドキュメントを削除できません"</string> <string name="share_via" msgid="8966594246261344259">"共有ツール"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ファイルのコピー中"</string> + <string name="copy_remaining" msgid="6283790937387975095">"残り<xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>個のファイルをコピーしています。</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>個のファイルをコピーしています。</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"コピーの準備をしています…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml index 7f33e7c..92da133 100644 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"გაზიარება"</string> <string name="menu_delete" msgid="8138799623850614177">"წაშლა"</string> <string name="menu_select" msgid="8711270657353563424">"„<xliff:g id="DIRECTORY">^1</xliff:g>“-ის არჩევა"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"ყველას არჩევა"</string> + <string name="menu_copy" msgid="3612326052677229148">"კოპირება…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"შიდა საცავის ჩვენება"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD ბარათის ჩვენება"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"შიდა მეხსიერების დამალვა"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD ბარათის დამალვა"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ფაილის ზომის ჩვენება"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ფაილის ზომის დამალვა"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> მონიშნული"</string> <string name="sort_name" msgid="9183560467917256779">"სახელით"</string> <string name="sort_date" msgid="586080032956151448">"ცვლილების თარიღით"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ფაილის გახსნა ვერ ხერხდება"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ზოგიერთი დოკუმენტის წაშლა ვერ ხერხდება"</string> <string name="share_via" msgid="8966594246261344259">"გაზიარება:"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"მიმდ. ფაილების კოპირება"</string> + <string name="copy_remaining" msgid="6283790937387975095">"დარჩა <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">მიმდინარეობს <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილის კოპირება.</item> + <item quantity="one">მიმდინარეობს <xliff:g id="COUNT_0">%1$d</xliff:g> ფაილის კოპირება.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"მომზადება კოპირებისთვის…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml index 0d91781..b16f6ac 100644 --- a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml +++ b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Бөлісу"</string> <string name="menu_delete" msgid="8138799623850614177">"Жою"</string> <string name="menu_select" msgid="8711270657353563424">"«<xliff:g id="DIRECTORY">^1</xliff:g>» таңдау"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Барлығын таңдау"</string> + <string name="menu_copy" msgid="3612326052677229148">"Көшіру орны…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Ішкі жадты көрсету"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD картасын көрсету"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ішкі жадты жасыру"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD картасын жасыру"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Файл өлшемін көрсету"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Файл өлшемін жасыру"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> таңдалды"</string> <string name="sort_name" msgid="9183560467917256779">"Атауы бойынша"</string> <string name="sort_date" msgid="586080032956151448">"Өзгертілген мерзімі бойынша"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Файлды аша алмады"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Кейбір құжаттарды жою мүмкін болмады"</string> <string name="share_via" msgid="8966594246261344259">"арқылы бөлісу"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Файлдарды көшіру"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> қалды"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды көшіру.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды көшіру.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Көшіруге дайындау…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-km-rKH/strings.xml b/packages/DocumentsUI/res/values-km-rKH/strings.xml index 2b71a57..4fd9a63 100644 --- a/packages/DocumentsUI/res/values-km-rKH/strings.xml +++ b/packages/DocumentsUI/res/values-km-rKH/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"ចែករំលែក"</string> <string name="menu_delete" msgid="8138799623850614177">"លុប"</string> <string name="menu_select" msgid="8711270657353563424">"ជ្រើស \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"ជ្រើសរើសទាំងអស់"</string> + <string name="menu_copy" msgid="3612326052677229148">"ថតចម្លងទៅ…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"បង្ហាញឧបករណ៍ផ្ទុកខាងក្នុង"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"បង្ហាញកាតអេសឌី"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"លាក់ឧបករណ៍ផ្ទុកខាងក្នុង"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"លាក់កាតអេសឌី"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"បង្ហាញទំហំឯកសារ"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"លាក់ទំហំឯកសារ"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"បានជ្រើស <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"តាមឈ្មោះ"</string> <string name="sort_date" msgid="586080032956151448">"តាមកាលបរិច្ឆេទបានកែប្រែ"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"មិនអាចបើកឯកសារ"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"មិនអាចលុបឯកសារមួយចំនួន"</string> <string name="share_via" msgid="8966594246261344259">"ចែករំលែកតាម"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"កំពុងថតចម្លងឯកសារ"</string> + <string name="copy_remaining" msgid="6283790937387975095">"នៅសល់ <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">កំពុងថតចម្លងឯកសារចំនួន <xliff:g id="COUNT_1">%1$d</xliff:g> ។</item> + <item quantity="one">កំពុងថតចម្លងឯកសារចំនួន <xliff:g id="COUNT_0">%1$d</xliff:g> ។</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"កំពុងរៀបចំចម្លង…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-kn-rIN/strings.xml b/packages/DocumentsUI/res/values-kn-rIN/strings.xml index ffedf11..fb0d818 100644 --- a/packages/DocumentsUI/res/values-kn-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-kn-rIN/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"ಹಂಚು"</string> <string name="menu_delete" msgid="8138799623850614177">"ಅಳಿಸು"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" ಆಯ್ಕೆಮಾಡಿ"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"ಎಲ್ಲವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> + <string name="menu_copy" msgid="3612326052677229148">"ಇದಕ್ಕೆ ನಕಲಿಸಿ…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"ಆಂತರಿಕ ಸಂಗ್ರಹಣೆಯನ್ನು ತೋರಿಸು"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD ಕಾಡ್ ಅನ್ನು ತೋರಿಸು"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"ಆಂತರಿಕ ಸಂಗ್ರಹಣೆಯನ್ನು ಮರೆಮಾಡಿ"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD ಕಾರ್ಡ್ ಅನ್ನು ಮರೆಮಾಡಿ"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ಫೈಲ್ ಗಾತ್ರವನ್ನು ತೋರಿಸು"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ಫೈಲ್ ಗಾತ್ರವನ್ನು ಮರೆಮಾಡಿ"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ"</string> <string name="sort_name" msgid="9183560467917256779">"ಹೆಸರಿನ ಪ್ರಕಾರ"</string> <string name="sort_date" msgid="586080032956151448">"ಮಾರ್ಪಡಿಸಿರುವ ದಿನಾಂಕದ ಪ್ರಕಾರ"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ಫೈಲ್ ತೆರೆಯಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ಕೆಲವು ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="share_via" msgid="8966594246261344259">"ಈ ಮೂಲಕ ಹಂಚಿಕೊಳ್ಳಿ"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ಉಳಿದಿದೆ"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗುತ್ತಿದೆ.</item> + <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗುತ್ತಿದೆ.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"ನಕಲಿಸಲು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml index 6b6fc7a..073b9c6 100644 --- a/packages/DocumentsUI/res/values-ko/strings.xml +++ b/packages/DocumentsUI/res/values-ko/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"공유"</string> <string name="menu_delete" msgid="8138799623850614177">"삭제"</string> <string name="menu_select" msgid="8711270657353563424">"\'<xliff:g id="DIRECTORY">^1</xliff:g>\' 선택"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"모두 선택"</string> + <string name="menu_copy" msgid="3612326052677229148">"복사…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"내부 저장소 표시"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD 카드 표시"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"내부 저장소 숨기기"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD 카드 숨기기"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"파일 크기 표시"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"파일 크기 숨기기"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g>개 선택됨"</string> <string name="sort_name" msgid="9183560467917256779">"이름순"</string> <string name="sort_date" msgid="586080032956151448">"수정된 날짜순"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"파일을 열 수 없음"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"일부 문서를 삭제할 수 없음"</string> <string name="share_via" msgid="8966594246261344259">"공유 방법"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"파일 복사 중"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> 남음"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개를 복사합니다.</item> + <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 복사합니다.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"사본 준비 중…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ky-rKG/strings.xml b/packages/DocumentsUI/res/values-ky-rKG/strings.xml index da4049b..5aa4c83 100644 --- a/packages/DocumentsUI/res/values-ky-rKG/strings.xml +++ b/packages/DocumentsUI/res/values-ky-rKG/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Бөлүшүү"</string> <string name="menu_delete" msgid="8138799623850614177">"Өчүрүү"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" тандоо"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Бардыгын тандоо"</string> + <string name="menu_copy" msgid="3612326052677229148">"Төмөнкүгө көчүрүү…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Ички сактагычты көрсөтүү"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD картаны көрсөтүү"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ички эстутумду жашыруу"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD картаны жашыруу"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Файл өлчөмүн көрсөтүү"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Файл өлчөмүн жашыруу"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> тандалды"</string> <string name="sort_name" msgid="9183560467917256779">"Аты боюнча"</string> <string name="sort_date" msgid="586080032956151448">"Өзгөртүлгөн күнү боюнча"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Файл ачылбады"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Кээ бир документтерди өчүрүү кыйрады"</string> <string name="share_via" msgid="8966594246261344259">"Кийинки аркылуу бөлүшүү:"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Файлдар көчүрүлүүдө"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> калды"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл көчүрүлүүдө.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл көчүрүлүүдө.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Көчүрүүгө даярдалууда…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml index 52ae201..f9e39e9 100644 --- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml +++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"ແບ່ງປັນ"</string> <string name="menu_delete" msgid="8138799623850614177">"ລຶບ"</string> <string name="menu_select" msgid="8711270657353563424">"ເລືອກ \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"ເລືອກທັງຫມົດ"</string> + <string name="menu_copy" msgid="3612326052677229148">"ອັດສຳເນົາໃສ່…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"ສະແດງໂຕເກັບຂໍ້ມູນພາຍໃນ"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"ສະແດງ SD Card"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"ເຊື່ອງໂຕເກັບຂໍ້ມູນພາຍໃນ"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"ເຊື່ອງ SD Card"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ສະແດງຂະໜາດໄຟລ໌"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ເຊື່ອງຂະຫນາດໄຟລ໌"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"ເລືອກແລ້ວ <xliff:g id="COUNT">%1$d</xliff:g> ລາຍການ"</string> <string name="sort_name" msgid="9183560467917256779">"ຕາມຊື່"</string> <string name="sort_date" msgid="586080032956151448">"ຕາມວັນທີທີ່ແກ້ໄຂ"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ບໍ່ສາມດາເປີດໄຟລ໌ໄດ້"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ບໍ່ສາມາດລຶບບາງເອກະສານໄດ້"</string> <string name="share_via" msgid="8966594246261344259">"ແບ່ງປັນຜ່ານ"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ກຳລັງອັດສຳເນົາໄຟລ໌"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ຍັງເຫຼືອຢູ່"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">ກຳລັງອັດສຳເນົາ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌.</item> + <item quantity="one">ກຳລັງອັດສຳເນົາ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"ກຳລັງກຽມອັດສຳເນົາ…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml index 31e510b..cb968ad 100644 --- a/packages/DocumentsUI/res/values-lt/strings.xml +++ b/packages/DocumentsUI/res/values-lt/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Bendrinti"</string> <string name="menu_delete" msgid="8138799623850614177">"Ištrinti"</string> <string name="menu_select" msgid="8711270657353563424">"Pasirinkti katalogą „<xliff:g id="DIRECTORY">^1</xliff:g>“"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Pasirinkti viską"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopijuoti į..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Rodyti vidinę atmintį"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Rodyti SD kortelę"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Slėpti vidinę atmintį"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Slėpti SD kortelę"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Rodyti failo dydį"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Slėpti failo dydį"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Pasirinkta: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Pagal pavadinimą"</string> <string name="sort_date" msgid="586080032956151448">"Pagal keitimo datą"</string> @@ -57,4 +59,22 @@ <string name="toast_no_application" msgid="1339885974067891667">"Nepavyksta atidaryti failo"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nepavyko ištrinti kai kurių dokumentų"</string> <string name="share_via" msgid="8966594246261344259">"Bendrinti naudojant"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopijuojami failai"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Liko: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Kopijuojamas <xliff:g id="COUNT_1">%1$d</xliff:g> failas.</item> + <item quantity="few">Kopijuojami <xliff:g id="COUNT_1">%1$d</xliff:g> failai.</item> + <item quantity="many">Kopijuojama <xliff:g id="COUNT_1">%1$d</xliff:g> failo.</item> + <item quantity="other">Kopijuojama <xliff:g id="COUNT_1">%1$d</xliff:g> failų.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Ruošiamasi kopijuoti…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml index 93794fa..6c911fa 100644 --- a/packages/DocumentsUI/res/values-lv/strings.xml +++ b/packages/DocumentsUI/res/values-lv/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Kopīgot"</string> <string name="menu_delete" msgid="8138799623850614177">"Dzēst"</string> <string name="menu_select" msgid="8711270657353563424">"Atlasīt “<xliff:g id="DIRECTORY">^1</xliff:g>”"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Atlasīt visus"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopēt…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Rādīt iekšējo atmiņu"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Rādīt SD karti"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Paslēpt iekšējo atmiņu"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Paslēpt SD karti"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Rādīt failu lielumu"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Paslēpt failu lielumu"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Atlasīts: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Pēc nosaukuma"</string> <string name="sort_date" msgid="586080032956151448">"Pēc pārveidošanas datuma"</string> @@ -57,4 +59,21 @@ <string name="toast_no_application" msgid="1339885974067891667">"Nevar atvērt failu."</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nevar dzēst dažus dokumentus."</string> <string name="share_via" msgid="8966594246261344259">"Kopīgot, izmantojot"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Notiek failu kopēšana"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Atlikušais laiks: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="zero">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu kopēšana.</item> + <item quantity="one">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> faila kopēšana.</item> + <item quantity="other">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu kopēšana.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Gatavošanās kopēšanai…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-mk-rMK/strings.xml b/packages/DocumentsUI/res/values-mk-rMK/strings.xml index 6fe9c86..748ac2e 100644 --- a/packages/DocumentsUI/res/values-mk-rMK/strings.xml +++ b/packages/DocumentsUI/res/values-mk-rMK/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Сподели"</string> <string name="menu_delete" msgid="8138799623850614177">"Избриши"</string> <string name="menu_select" msgid="8711270657353563424">"Одберете „<xliff:g id="DIRECTORY">^1</xliff:g>“"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Избери ги сите"</string> + <string name="menu_copy" msgid="3612326052677229148">"Копирај во…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Прикажи внатрешна мемор."</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Прикажи СД-картичка"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Скриј внатрешна меморија"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Сoкриј СД-картичка"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Прикажи целосна големина"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Сокриј целосна големина"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Избрани се <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"По име"</string> <string name="sort_date" msgid="586080032956151448">"Изменети по датум"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Датотеката не се отвора"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Некои документи не може да се избришат"</string> <string name="share_via" msgid="8966594246261344259">"Сподели преку"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Се копираат датотеки"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Уште <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Се копира <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> + <item quantity="other">Се копираат <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Се подготвува за копирање…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ml-rIN/strings.xml b/packages/DocumentsUI/res/values-ml-rIN/strings.xml index 052dbd2..750c842 100644 --- a/packages/DocumentsUI/res/values-ml-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-ml-rIN/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"പങ്കിടുക"</string> <string name="menu_delete" msgid="8138799623850614177">"ഇല്ലാതാക്കുക"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" തിരഞ്ഞെടുക്കുക"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"എല്ലാം തിരഞ്ഞെടുക്കുക"</string> + <string name="menu_copy" msgid="3612326052677229148">"ഇതിൽ പകർത്തുക…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"ആന്തരിക സംഭരണം കാണിക്കുക"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD കാർഡ് കാണിക്കുക"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"ആന്തരിക സംഭരണം മറയ്ക്കുക"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD കാർഡ് മറയ്ക്കുക"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ഫയൽ വലുപ്പം കാണിക്കുക"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ഫയൽ വലുപ്പം മറയ്ക്കുക"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> തിരഞ്ഞെടുത്തു"</string> <string name="sort_name" msgid="9183560467917256779">"പേര് പ്രകാരം"</string> <string name="sort_date" msgid="586080032956151448">"പരിഷ്ക്കരിച്ച തീയതി പ്രകാരം"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ഫയൽ തുറക്കാനായില്ല"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ചില പ്രമാണങ്ങൾ ഇല്ലാതാക്കാനായില്ല"</string> <string name="share_via" msgid="8966594246261344259">"ഇതുവഴി പങ്കിടുക"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ഫയലുകൾ പകർത്തുന്നു"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ശേഷിക്കുന്നു"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ പകർത്തുന്നു.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ പകർത്തുന്നു.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"പകർപ്പിനായി തയ്യാറെടുക്കുന്നു…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml index 737d4b2..28174ec 100644 --- a/packages/DocumentsUI/res/values-mn-rMN/strings.xml +++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Хуваалцах"</string> <string name="menu_delete" msgid="8138799623850614177">"Устгах"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\"-г сонгох"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Бүгдийг сонгох"</string> + <string name="menu_copy" msgid="3612326052677229148">"...руу хуулах"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Дотоод санг харуулах"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD картыг харуулах"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Дотоод санг нуух"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD картыг нуух"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Файлын хэмжээг харуулах"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Файлын хэмжээг нуух"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> сонгогдсон"</string> <string name="sort_name" msgid="9183560467917256779">"Нэрээр"</string> <string name="sort_date" msgid="586080032956151448">"Өөрчлөгдсөн огноогоор"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Файлыг нээх боломжгүй"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Зарим документуудыг устгах боломжгүй"</string> <string name="share_via" msgid="8966594246261344259">"Дараахаар дамжуулан хуваалцах"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Файлуудыг хуулж байна"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> үлдсэн"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файлуудыг хуулж байна.</item> + <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файл хуулж байна.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Хуулбарлахад бэлтгэж байна..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-mr-rIN/strings.xml b/packages/DocumentsUI/res/values-mr-rIN/strings.xml index 26a65cd..5664515 100644 --- a/packages/DocumentsUI/res/values-mr-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-mr-rIN/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"सामायिक करा"</string> <string name="menu_delete" msgid="8138799623850614177">"हटवा"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" निवडा"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"सर्व निवडा"</string> + <string name="menu_copy" msgid="3612326052677229148">"यावर कॉपी करा…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"अंतर्गत संचयन दर्शवा"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD कार्ड दर्शवा"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"अंतर्गत संचयन लपवा"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD कार्ड लपवा"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"फाईल आकार दर्शवा"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"फाईल आकार लपवा"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> निवडले"</string> <string name="sort_name" msgid="9183560467917256779">"नावानुसार"</string> <string name="sort_date" msgid="586080032956151448">"सुधारित केलेल्या तारखेनुसार"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"फाईल उघडू शकत नाही"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"काही दस्तऐवज हटविण्यात अक्षम"</string> <string name="share_via" msgid="8966594246261344259">"द्वारे सामायिक करा"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"फायली कॉपी करीत आहे"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> शिल्लक"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फाईल कॉपी करीत आहे.</item> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फायली कॉपी करीत आहे.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"कॉपी करण्यासाठी तयार करीत आहे…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml index e9de0e3..69bfd34 100644 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Kongsi"</string> <string name="menu_delete" msgid="8138799623850614177">"Padam"</string> <string name="menu_select" msgid="8711270657353563424">"Pilih \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Pilih Semua"</string> + <string name="menu_copy" msgid="3612326052677229148">"Salin ke..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Papar storan dalaman"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Papar kad SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Sembunyikan storan dlmn"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Sembunyikan kad SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Papar saiz fail"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Sembunyikan saiz fail"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> dipilih"</string> <string name="sort_name" msgid="9183560467917256779">"Mengikut nama"</string> <string name="sort_date" msgid="586080032956151448">"Diubah suai mengikut tarikh"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Tidak dapat membuka fail"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat memadam beberapa dokumen"</string> <string name="share_via" msgid="8966594246261344259">"Kongsi melalui"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Menyalin fail"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> lagi"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> fail.</item> + <item quantity="one">Menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> fail.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Bersedia untuk salin..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-my-rMM/strings.xml b/packages/DocumentsUI/res/values-my-rMM/strings.xml index ae38956..e2513e8 100644 --- a/packages/DocumentsUI/res/values-my-rMM/strings.xml +++ b/packages/DocumentsUI/res/values-my-rMM/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"မျှဝေခြင်း"</string> <string name="menu_delete" msgid="8138799623850614177">"ဖျက်ပစ်ရန်"</string> <string name="menu_select" msgid="8711270657353563424">"ရွေးရန်\"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"အားလုံးရွေးရန်"</string> + <string name="menu_copy" msgid="3612326052677229148">"သို့ကူးယူရန်…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"စက်ရှိစတိုရုံ ပြပါ"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD ကဒ် ပြပါ"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"စက်ရှိစတိုရုံ ဖျောက်ထားပါ"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD ကဒ် ဖျောက်ပါ"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ဖိုင်အရွယ်အစား ပြပါ"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ဖိုင်အရွယ်အစား ဖျောက်ပါ"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ခရွေးချယ်ပြီး"</string> <string name="sort_name" msgid="9183560467917256779">"အမည်ဖြင့်"</string> <string name="sort_date" msgid="586080032956151448">"ပြင်ဆင်မှု ရက်စွဲဖြင့်"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ဖိုင်အား ဖွင့်မရပါ"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"တချို့ စာရွက်စာတန်းများ မဖျက်စီးနိုင်ပါ"</string> <string name="share_via" msgid="8966594246261344259">"မှ ဝေမျှပါ"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ဖိုင်များကူယူနေသည်"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ကျန်ရှိသည်"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ဖိုင်များကို ကူးယူနေသည်။</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ဖိုင် ကူးယူနေသည်။</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"မိတ္တူကူးရန်ပြင်ဆင်နေ..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml index d10b740..4f0c866 100644 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ b/packages/DocumentsUI/res/values-nb/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Del"</string> <string name="menu_delete" msgid="8138799623850614177">"Slett"</string> <string name="menu_select" msgid="8711270657353563424">"Velg «<xliff:g id="DIRECTORY">^1</xliff:g>»"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Velg alle"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopiér til …"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Vis den interne lagringen"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Vis SD-kortet"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Skjul den interne lagringen"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skjul SD-kortet"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Vis filstørrelsen"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Skjul filstørrelsen"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> valgt"</string> <string name="sort_name" msgid="9183560467917256779">"Etter navn"</string> <string name="sort_date" msgid="586080032956151448">"«Etter dato» endret"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Kan ikke åpne filen"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Enkelte dokumenter kunne ikke slettes"</string> <string name="share_via" msgid="8966594246261344259">"Del via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopierer filer"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> gjenstår"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> + <item quantity="one">Kopierer <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Forbereder kopiering …"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ne-rNP/strings.xml b/packages/DocumentsUI/res/values-ne-rNP/strings.xml index 2b6015a..7aa51e6 100644 --- a/packages/DocumentsUI/res/values-ne-rNP/strings.xml +++ b/packages/DocumentsUI/res/values-ne-rNP/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"साझेदारी गर्नुहोस्"</string> <string name="menu_delete" msgid="8138799623850614177">"मेटाउनुहोस्"</string> <string name="menu_select" msgid="8711270657353563424">"चयनगर्नुहोस् \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"सबै चयन गर्नुहोस्"</string> + <string name="menu_copy" msgid="3612326052677229148">"यसमा प्रतिलिपि गर्नुहोस् ..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"आन्तरिक भण्डारण देखाउनुहोस्"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD कार्ड देखाउनुहोस्"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"आन्तरिक भण्डारण लुकाउनुहोस्"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD कार्ड लुकाउनुहोस्"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"फाइल आकार देखाउनुहोस्"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"फाइल आकार लुकाउनुहोस्"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> चयन गरियो"</string> <string name="sort_name" msgid="9183560467917256779">"नाम अनुसार"</string> <string name="sort_date" msgid="586080032956151448">"परिमार्जित मिति अनुसार"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"फाइल खोल्न सक्दैन"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"केही कागजातहरू मेट्न असमर्थ छ"</string> <string name="share_via" msgid="8966594246261344259">"माध्यमबाट साझेदारी गर्नुहोस्"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"फाइलहरू प्रतिलिपि गर्दै:"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g>बाँकी"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g>फाइलहरू प्रतिलिप गर्दै।</item> + <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> फाइल प्रतिलिपि गर्दै।</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"प्रतिलिपिको लागि तयारी गर्दै ..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml index dc5e250..b5e4930 100644 --- a/packages/DocumentsUI/res/values-nl/strings.xml +++ b/packages/DocumentsUI/res/values-nl/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Delen"</string> <string name="menu_delete" msgid="8138799623850614177">"Verwijderen"</string> <string name="menu_select" msgid="8711270657353563424">"<xliff:g id="DIRECTORY">^1</xliff:g> selecteren"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Alles selecteren"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopiëren naar…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Interne opslag weergeven"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD-kaart weergeven"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Interne opslag verbergen"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD-kaart verbergen"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Bestandsgrootte weergeven"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Bestandsgrootte verbergen"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> geselecteerd"</string> <string name="sort_name" msgid="9183560467917256779">"Op naam"</string> <string name="sort_date" msgid="586080032956151448">"Op aanpassingsdatum"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Kan bestand niet openen"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Kan bepaalde documenten niet verwijderen"</string> <string name="share_via" msgid="8966594246261344259">"Delen via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Bestanden kopiëren"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> resterend"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> bestanden kopiëren.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> bestand kopiëren.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Kopiëren voorbereiden…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml index eb84e5d..4d39387 100644 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ b/packages/DocumentsUI/res/values-pl/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Udostępnij"</string> <string name="menu_delete" msgid="8138799623850614177">"Usuń"</string> <string name="menu_select" msgid="8711270657353563424">"Zaznacz „<xliff:g id="DIRECTORY">^1</xliff:g>”"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Wybierz wszystko"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopiuj do…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Pokaż pamięć wewnętrzną"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Pokaż kartę SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ukryj pamięć wewnętrzną"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ukryj kartę SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Pokaż rozmiar pliku"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ukryj rozmiar pliku"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Wybrano: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Według nazwy"</string> <string name="sort_date" msgid="586080032956151448">"Według daty edycji"</string> @@ -57,4 +59,22 @@ <string name="toast_no_application" msgid="1339885974067891667">"Nie można otworzyć pliku"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nie można usunąć niektórych dokumentów"</string> <string name="share_via" msgid="8966594246261344259">"Udostępnij przez"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopiowanie plików"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Pozostało: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="few">Kopiowanie <xliff:g id="COUNT_1">%1$d</xliff:g> plików.</item> + <item quantity="many">Kopiowanie <xliff:g id="COUNT_1">%1$d</xliff:g> plików.</item> + <item quantity="other">Kopiowanie <xliff:g id="COUNT_1">%1$d</xliff:g> pliku.</item> + <item quantity="one">Kopiowanie <xliff:g id="COUNT_0">%1$d</xliff:g> pliku.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Przygotowuję do kopiowania…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml index b0edad6..c145be9 100644 --- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Partilhar"</string> <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string> <string name="menu_select" msgid="8711270657353563424">"Selecionar \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Selecionar tudo"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copiar para…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Mostrar mem. armaz. int."</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Mostrar cartão SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ocultar mem. armaz. int."</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar cartão SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tam. de fich."</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tam. de fich."</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selecionado(s)"</string> <string name="sort_name" msgid="9183560467917256779">"Por nome"</string> <string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Não é possível abrir o ficheiro"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Não é possível eliminar alguns documentos"</string> <string name="share_via" msgid="8966594246261344259">"Partilhar através de"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"A copiar ficheiros"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Faltam <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">A copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> + <item quantity="one">A copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"A preparar para copiar…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml index f35bd19..b47a084 100644 --- a/packages/DocumentsUI/res/values-pt/strings.xml +++ b/packages/DocumentsUI/res/values-pt/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Compartilhar"</string> <string name="menu_delete" msgid="8138799623850614177">"Excluir"</string> <string name="menu_select" msgid="8711270657353563424">"Selecionar \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Selecionar tudo"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copiar para..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Mostrar armaz. interno"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Mostrar cartão SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ocultar armaz. interno"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ocultar cartão SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tam. do arquivo"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tam. do arquivo"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selecionados"</string> <string name="sort_name" msgid="9183560467917256779">"Por nome"</string> <string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Não é possível abrir o arquivo"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Não foi possível excluir alguns documentos"</string> <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Copiando arquivos"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> restantes"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> + <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index 646d537..9dd4abc 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Distribuiți"</string> <string name="menu_delete" msgid="8138799623850614177">"Ștergeți"</string> <string name="menu_select" msgid="8711270657353563424">"Selectați „<xliff:g id="DIRECTORY">^1</xliff:g>”"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Selectați-le pe toate"</string> + <string name="menu_copy" msgid="3612326052677229148">"Copiați în…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Afișați stocarea internă"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Afișați cardul SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ascundeți stocarea internă"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ascundeți cardul SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Afișați mărime fișiere"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ascundeți mărime fișiere"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> selectate"</string> <string name="sort_name" msgid="9183560467917256779">"După nume"</string> <string name="sort_date" msgid="586080032956151448">"După data modificării"</string> @@ -57,4 +59,21 @@ <string name="toast_no_application" msgid="1339885974067891667">"Fișierul nu poate fi deschis"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Unele documente nu au putut fi șterse"</string> <string name="share_via" msgid="8966594246261344259">"Distribuiți prin"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Se copiază fișierele"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Timp rămas: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="few">Se copiază <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere.</item> + <item quantity="other">Se copiază <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere.</item> + <item quantity="one">Se copiază <xliff:g id="COUNT_0">%1$d</xliff:g> fișier.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Se pregătește copierea..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml index 0cc90de..839dd27 100644 --- a/packages/DocumentsUI/res/values-ru/strings.xml +++ b/packages/DocumentsUI/res/values-ru/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Поделиться"</string> <string name="menu_delete" msgid="8138799623850614177">"Удалить"</string> <string name="menu_select" msgid="8711270657353563424">"Выбрать папку \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Выбрать все"</string> + <string name="menu_copy" msgid="3612326052677229148">"Копировать в…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Внутренняя память"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD-карта"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Скрыть внутреннюю память"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Скрыть SD-карту"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Показать размер файлов"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Скрыть размер файлов"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Выбрано: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"По названию"</string> <string name="sort_date" msgid="586080032956151448">"По дате изменения"</string> @@ -57,4 +59,22 @@ <string name="toast_no_application" msgid="1339885974067891667">"Не удалось открыть файл"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Не удалось удалить некоторые документы"</string> <string name="share_via" msgid="8966594246261344259">"Поделиться"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Копирование файлов"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Осталось <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файл...</item> + <item quantity="few">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файла...</item> + <item quantity="many">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файлов...</item> + <item quantity="other">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файла...</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Подготовка к копированию…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml index fe2c66f..d7b6cd9 100644 --- a/packages/DocumentsUI/res/values-si-rLK/strings.xml +++ b/packages/DocumentsUI/res/values-si-rLK/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"බෙදාගන්න"</string> <string name="menu_delete" msgid="8138799623850614177">"මකන්න"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" තෝරන්න"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"සියල්ල තෝරන්න"</string> + <string name="menu_copy" msgid="3612326052677229148">"වෙත පිටපත් කරන්න..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"අභ්යන්තර ආචයනය පෙන්වන්න"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD කාඩ් පත පෙන්වන්න"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"අභ්යන්තර ආචයනය සඟවන්න"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD කාඩ් පත සඟවන්න"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ගොනු ප්රමණය පෙන්වන්න"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ගොනු ප්රමණය සඟවන්න"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ක් තෝරාගන්නා ලදි"</string> <string name="sort_name" msgid="9183560467917256779">"නමින්"</string> <string name="sort_date" msgid="586080032956151448">"වෙනස් කරන ලද දිනයෙන්"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ගොනුව විවෘත කළ නොහැක"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"සමහර ලේඛන මැකීමට නොහැකි විය"</string> <string name="share_via" msgid="8966594246261344259">"හරහා බෙදාගන්න"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ගොනු පිටපත් කරමින්"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ඉතිරියි"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කරමින්.</item> + <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කරමින්.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"පිටපතක් සඳහා සූදානම් කරමින්..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml index b68a493..f4e401a 100644 --- a/packages/DocumentsUI/res/values-sk/strings.xml +++ b/packages/DocumentsUI/res/values-sk/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Zdieľať"</string> <string name="menu_delete" msgid="8138799623850614177">"Odstrániť"</string> <string name="menu_select" msgid="8711270657353563424">"Vyberte adresár <xliff:g id="DIRECTORY">^1</xliff:g>"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Vybrať všetko"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopírovať do…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Zobraziť interné úložisko"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Zobraziť kartu SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Skryť interné úložisko"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skryť kartu SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Zobraziť veľkosť súboru"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Skryť veľkosť súboru"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Vybraté: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Podľa názvu"</string> <string name="sort_date" msgid="586080032956151448">"Podľa dátumu zmeny"</string> @@ -57,4 +59,22 @@ <string name="toast_no_application" msgid="1339885974067891667">"Súbor sa nepodarilo otvoriť"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Niektoré dokumenty sa nepodarilo odstrániť"</string> <string name="share_via" msgid="8966594246261344259">"Zdieľať pomocou"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopírovanie súborov"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Zostáva: <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="few">Kopírujú sa <xliff:g id="COUNT_1">%1$d</xliff:g> súbory.</item> + <item quantity="many">Kopíruje sa <xliff:g id="COUNT_1">%1$d</xliff:g> súboru.</item> + <item quantity="other">Kopíruje sa <xliff:g id="COUNT_1">%1$d</xliff:g> súborov.</item> + <item quantity="one">Kopíruje sa <xliff:g id="COUNT_0">%1$d</xliff:g> súbor.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Pripravuje sa na kopírovanie..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml index f289e64..2e57114 100644 --- a/packages/DocumentsUI/res/values-sl/strings.xml +++ b/packages/DocumentsUI/res/values-sl/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Skupna raba"</string> <string name="menu_delete" msgid="8138799623850614177">"Izbriši"</string> <string name="menu_select" msgid="8711270657353563424">"Izbira mape »<xliff:g id="DIRECTORY">^1</xliff:g>«"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Izberi vse"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopiranje v …"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Pokaži notranjo shrambo"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Pokaži kartico SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Skrij notranjo shrambo"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Skrij kartico SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Pokaži velikost datoteke"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Skrij velikost datoteke"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Št. izbranih: <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Po imenu"</string> <string name="sort_date" msgid="586080032956151448">"Po datumu spremembe"</string> @@ -57,4 +59,22 @@ <string name="toast_no_application" msgid="1339885974067891667">"Datoteke ni mogoče odpreti"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Nekaterih dokumentov ni mogoče izbrisati"</string> <string name="share_via" msgid="8966594246261344259">"Deli z drugimi prek"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopiranje datotek"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Še <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> + <item quantity="two">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> + <item quantity="few">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> + <item quantity="other">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Pripravljanje na kopiranje …"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index d18a227..7c3f2c9 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Дели"</string> <string name="menu_delete" msgid="8138799623850614177">"Избриши"</string> <string name="menu_select" msgid="8711270657353563424">"Изабери „<xliff:g id="DIRECTORY">^1</xliff:g>“"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Изабери све"</string> + <string name="menu_copy" msgid="3612326052677229148">"Копирај на..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Прикажи интерну меморију"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Прикажи SD картицу"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Сакриј интерну меморију"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Сакриј SD картицу"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Прикажи величину датотеке"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Сакриј величину датотеке"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Изабрано је <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Према имену"</string> <string name="sort_date" msgid="586080032956151448">"Према датуму измене"</string> @@ -57,4 +59,21 @@ <string name="toast_no_application" msgid="1339885974067891667">"Није могуће отворити датотеку"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Није могуће избрисати неке документе"</string> <string name="share_via" msgid="8966594246261344259">"Делите преко"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Копирање датотека"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Још <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item> + <item quantity="few">Копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item> + <item quantity="other">Копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Припрема се копирање…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml index e2d0e2a..cafba2c 100644 --- a/packages/DocumentsUI/res/values-sv/strings.xml +++ b/packages/DocumentsUI/res/values-sv/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Dela"</string> <string name="menu_delete" msgid="8138799623850614177">"Ta bort"</string> <string name="menu_select" msgid="8711270657353563424">"Välj <xliff:g id="DIRECTORY">^1</xliff:g>"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Markera alla"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopiera till …"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Visa internminne"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Visa SD-kort"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Dölj internminne"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Dölj SD-kort"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Visa filstorlek"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Dölj filstorlek"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Har valt <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Efter namn"</string> <string name="sort_date" msgid="586080032956151448">"Efter ändringsdatum"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Det går inte att öppna filen"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Det gick inte att ta bort vissa dokument"</string> <string name="share_via" msgid="8966594246261344259">"Dela via"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kopierar filer"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> återstår"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Kopierar <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> + <item quantity="one">Kopierar <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Kopieringen förbereds …"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml index 65fe404..61f5874 100644 --- a/packages/DocumentsUI/res/values-sw/strings.xml +++ b/packages/DocumentsUI/res/values-sw/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Shiriki"</string> <string name="menu_delete" msgid="8138799623850614177">"Futa"</string> <string name="menu_select" msgid="8711270657353563424">"Chagua \" <xliff:g id="DIRECTORY">^1</xliff:g> \""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Chagua Zote"</string> + <string name="menu_copy" msgid="3612326052677229148">"Nakili kwenda..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Onyesha hifadhi ya ndani"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Onyesha kadi ya SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ficha hifadhi ya ndani"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ficha kadi ya SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Onyesha ukubwa wa faili"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ficha ukubwa wa faili"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> zimechaguliwa"</string> <string name="sort_name" msgid="9183560467917256779">"Kwa jina"</string> <string name="sort_date" msgid="586080032956151448">"Kwa tarehe viliporekebishwa"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Haiwezi kufungua faili"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Imeshindwa kufuta baadhi ya hati"</string> <string name="share_via" msgid="8966594246261344259">"Shiriki kupitia"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Inanakili faili"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Zimesalia <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Inanakili faili <xliff:g id="COUNT_1">%1$d</xliff:g>.</item> + <item quantity="one">Inanakili faili <xliff:g id="COUNT_0">%1$d</xliff:g>.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Inaanda kunakili..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ta-rIN/strings.xml b/packages/DocumentsUI/res/values-ta-rIN/strings.xml index dc20e84..6ce4983 100644 --- a/packages/DocumentsUI/res/values-ta-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-ta-rIN/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"பகிர்"</string> <string name="menu_delete" msgid="8138799623850614177">"நீக்கு"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" ஐத் தேர்ந்தெடு"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"எல்லாவற்றையும் தேர்ந்தெடு"</string> + <string name="menu_copy" msgid="3612326052677229148">"இங்கு நகலெடு…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"அகச் சேமிப்பகத்தைக் காட்டு"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD கார்டைக் காட்டு"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"அகச் சேமிப்பகத்தை மறை"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD கார்டை மறை"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"கோப்பு அளவைக் காட்டு"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"கோப்பு அளவை மறை"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டன"</string> <string name="sort_name" msgid="9183560467917256779">"பெயரின்படி"</string> <string name="sort_date" msgid="586080032956151448">"தேதியின்படி திருத்தப்பட்டது"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"கோப்பைத் திறக்க முடியவில்லை"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"சில ஆவணங்களை நீக்க முடியவில்லை"</string> <string name="share_via" msgid="8966594246261344259">"இதன் வழியாகப் பகிர்"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"கோப்புகளை நகலெடுத்தல்"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> மீதமுள்ளது"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நகலெடுக்கிறது.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகலெடுக்கிறது.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"நகல் தயாராகிறது…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-te-rIN/strings.xml b/packages/DocumentsUI/res/values-te-rIN/strings.xml index 24acc24..8215fcd 100644 --- a/packages/DocumentsUI/res/values-te-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-te-rIN/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"భాగస్వామ్యం చేయి"</string> <string name="menu_delete" msgid="8138799623850614177">"తొలగించు"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\"ని ఎంచుకోండి"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"అన్నీ ఎంచుకోండి"</string> + <string name="menu_copy" msgid="3612326052677229148">"ఇక్కడికి కాపీ చేయి…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"అంతర్గత నిల్వను చూపు"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD కార్డ్ను చూపు"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"అంతర్గత నిల్వను దాచు"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD కార్డ్ను దాచు"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"ఫైల్ పరిమాణాన్ని చూపు"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ఫైల్ పరిమాణాన్ని దాచు"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ఎంచుకోబడ్డాయి"</string> <string name="sort_name" msgid="9183560467917256779">"పేరు ద్వారా"</string> <string name="sort_date" msgid="586080032956151448">"సవరించిన తేదీ ద్వారా"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ఫైల్ను తెరవడం సాధ్యపడదు"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"కొన్ని పత్రాలను తొలగించడం సాధ్యపడలేదు"</string> <string name="share_via" msgid="8966594246261344259">"దీని ద్వారా భాగస్వామ్యం చేయండి"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"ఫైల్లు కాపీ అవుతున్నాయి"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> మిగిలి ఉంది"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను కాపీ చేస్తోంది.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను కాపీ చేస్తోంది.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"కాపీ చేయడానికి సిద్ధం చేస్తోంది…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml index e692cb7..eb2c2ed 100644 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ b/packages/DocumentsUI/res/values-th/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"แชร์"</string> <string name="menu_delete" msgid="8138799623850614177">"ลบ"</string> <string name="menu_select" msgid="8711270657353563424">"เลือก \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"เลือกทั้งหมด"</string> + <string name="menu_copy" msgid="3612326052677229148">"คัดลอกไปยัง…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"แสดงที่จัดเก็บภายใน"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"แสดงการ์ด SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"ซ่อนที่จัดเก็บภายใน"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"ซ่อนการ์ด SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"แสดงขนาดไฟล์"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"ซ่อนขนาดไฟล์"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"เลือกไว้ <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"ตามชื่อ"</string> <string name="sort_date" msgid="586080032956151448">"ตามวันที่ที่ปรับเปลี่ยน"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"ไม่สามารถเปิดไฟล์ได้"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"ไม่สามารถลบเอกสารบางรายการ"</string> <string name="share_via" msgid="8966594246261344259">"แชร์ผ่าน"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"กำลังคัดลอกไฟล์"</string> + <string name="copy_remaining" msgid="6283790937387975095">"เหลือ <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">กำลังคัดลอก <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> + <item quantity="one">กำลังคัดลอก <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"กำลังเตรียมการคัดลอก…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index e55d552..27cfc6c 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Ibahagi"</string> <string name="menu_delete" msgid="8138799623850614177">"Tanggalin"</string> <string name="menu_select" msgid="8711270657353563424">"Piliin ang \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Piliin Lahat"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopyahin sa..."</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Ipakita internal storage"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Ipakita ang SD card"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Itago internal storage"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Itago ang SD card"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Ipakita ang laki ng file"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Itago ang laki ng file"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ang pinili"</string> <string name="sort_name" msgid="9183560467917256779">"Ayon sa pangalan"</string> <string name="sort_date" msgid="586080032956151448">"Ayon sa petsa ng pagbago"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Hindi mabuksan ang file"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Hindi matanggal ang ilang dokumento"</string> <string name="share_via" msgid="8966594246261344259">"Ibahagi sa pamamagitan ng"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Kinokopya ang mga file"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> na lang ang natitira"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Kumokopya ng <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> + <item quantity="other">Kumokopya ng <xliff:g id="COUNT_1">%1$d</xliff:g> na file.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Naghahanda para sa pagkopya…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index b80904c..cb18930 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Paylaş"</string> <string name="menu_delete" msgid="8138799623850614177">"Sil"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" dizinini seç"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Tümünü Seç"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopyala…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Dahili depolamayı göster"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD kartı göster"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Dahili depolamayı gizle"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD kartı gizle"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Dosya boyutunu göster"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Dosya boyutunu gizle"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> tane seçildi"</string> <string name="sort_name" msgid="9183560467917256779">"Ada göre"</string> <string name="sort_date" msgid="586080032956151448">"Değişiklik tarihine göre"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Dosya açılamıyor"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Bazı dokümanlar silinemiyor"</string> <string name="share_via" msgid="8966594246261344259">"Şunu kullanarak paylaş:"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Dosyalar kopyalanıyor"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> kaldı"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya kopyalanıyor.</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya kopyalanıyor.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Kopyalanmak için hazırlanıyor…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml index 77654fd..9c4f1b0 100644 --- a/packages/DocumentsUI/res/values-uk/strings.xml +++ b/packages/DocumentsUI/res/values-uk/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Поділитися"</string> <string name="menu_delete" msgid="8138799623850614177">"Видалити"</string> <string name="menu_select" msgid="8711270657353563424">"Вибрати каталог \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Вибрати все"</string> + <string name="menu_copy" msgid="3612326052677229148">"Копіювати в…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Показати внутр. пам’ять"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Показати карту SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Сховати внутр. пам’ять"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Сховати карту SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Показати розмір файлу"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Сховати розмір файлу"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Вибрано <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"За назвою"</string> <string name="sort_date" msgid="586080032956151448">"За датою змінення"</string> @@ -57,4 +59,22 @@ <string name="toast_no_application" msgid="1339885974067891667">"Не вдалося відкрити файл"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Не вдалося видалити деякі документи"</string> <string name="share_via" msgid="8966594246261344259">"Надіслати через"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Копіювання файлів"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Залишилося <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлу.</item> + <item quantity="few">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> + <item quantity="many">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> + <item quantity="other">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлу.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Підготовка до копіювання…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml index d20f14c..33710c5 100644 --- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml +++ b/packages/DocumentsUI/res/values-ur-rPK/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"اشتراک کریں"</string> <string name="menu_delete" msgid="8138799623850614177">"حذف کریں"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" منتخب کریں"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"سبھی منتخب کریں"</string> + <string name="menu_copy" msgid="3612326052677229148">"اس پر کاپی ہو رہی ہے…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"داخلی اسٹوریج دکھائیں"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD کارڈ دکھائیں"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"داخلی اسٹوریج چھپائیں"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD کارڈ چھپائیں"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"فائل سائز دکھائیں"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"فائل سائز چھپائیں"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> کو منتخب کیا گیا"</string> <string name="sort_name" msgid="9183560467917256779">"نام کے لحاظ سے"</string> <string name="sort_date" msgid="586080032956151448">"ترمیم کی تاریخ کے لحاظ سے"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"فائل نہيں کھول سکتے ہیں"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"کچھ دستاویزات کو حذف کرنے سے قاصر"</string> <string name="share_via" msgid="8966594246261344259">"اشتراک کریں بذریعہ"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"فائلیں کاپی ہو رہی ہیں"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> باقی ہے"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں کاپی کی جا رہی ہیں۔</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل کاپی کی جا رہی ہے۔</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"کاپی کیلئے تیار ہو رہا ہے…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml index 96241de..1b73b34 100644 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Ulashish"</string> <string name="menu_delete" msgid="8138799623850614177">"O‘chirish"</string> <string name="menu_select" msgid="8711270657353563424">"“<xliff:g id="DIRECTORY">^1</xliff:g>” jildini tanlash"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Barchasini tanlash"</string> + <string name="menu_copy" msgid="3612326052677229148">"...ga nusxalash"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Ichki xotirani ko‘rsatish"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD kartani ko‘rsatish"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ichki xotirani berkitish"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"SD kartani berkitish"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Fayl hajmini ko‘rsatish"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Fayl hajmini berkitish"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> belgilandi"</string> <string name="sort_name" msgid="9183560467917256779">"Nomi bo‘yicha"</string> <string name="sort_date" msgid="586080032956151448">"Tahrir sanasi bo‘yicha"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Fayl ochilmadi"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ba’zi hujjatlar o‘chirilmadi"</string> <string name="share_via" msgid="8966594246261344259">"Quyidagi orqali ulashish"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Fayllar nusxalanmoqda"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> qoldi"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ta fayl nusxalanmoqda</item> + <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> ta fayl nusxalanmoqda</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Nuxsa olishga tayyorgarlik..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml index 581e2c9..70a7af3 100644 --- a/packages/DocumentsUI/res/values-vi/strings.xml +++ b/packages/DocumentsUI/res/values-vi/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Chia sẻ"</string> <string name="menu_delete" msgid="8138799623850614177">"Xóa"</string> <string name="menu_select" msgid="8711270657353563424">"Chọn \"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Chọn tất cả"</string> + <string name="menu_copy" msgid="3612326052677229148">"Sao chép vào…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Hiển thị bộ nhớ trong"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Hiển thị thẻ SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ẩn bộ nhớ trong"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Ẩn thẻ SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Hiển thị kích thước tệp"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Ẩn kích thước tệp"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"Đã chọn <xliff:g id="COUNT">%1$d</xliff:g>"</string> <string name="sort_name" msgid="9183560467917256779">"Theo tên"</string> <string name="sort_date" msgid="586080032956151448">"Theo ngày sửa đổi"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Không thể mở tệp"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Không thể xóa một số tài liệu"</string> <string name="share_via" msgid="8966594246261344259">"Chia sẻ qua"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Đang sao chép tệp"</string> + <string name="copy_remaining" msgid="6283790937387975095">"Còn <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">Đang sao chép <xliff:g id="COUNT_1">%1$d</xliff:g> tệp.</item> + <item quantity="one">Đang sao chép <xliff:g id="COUNT_0">%1$d</xliff:g> tệp.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Đang chuẩn bị sao chép…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml index 1b81ba4..0097017 100644 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"分享"</string> <string name="menu_delete" msgid="8138799623850614177">"删除"</string> <string name="menu_select" msgid="8711270657353563424">"选择“<xliff:g id="DIRECTORY">^1</xliff:g>”"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"全选"</string> + <string name="menu_copy" msgid="3612326052677229148">"复制到…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"显示内部存储设备"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"显示SD卡"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"隐藏内部存储设备"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"隐藏SD卡"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"显示文件大小"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"隐藏文件大小"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"已选择<xliff:g id="COUNT">%1$d</xliff:g>项"</string> <string name="sort_name" msgid="9183560467917256779">"按名称"</string> <string name="sort_date" msgid="586080032956151448">"按修改日期"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"无法打开文件"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"无法删除部分文档"</string> <string name="share_via" msgid="8966594246261344259">"分享方式"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"正在复制文件"</string> + <string name="copy_remaining" msgid="6283790937387975095">"剩余时间:<xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">正在复制 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件。</item> + <item quantity="one">正在复制 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件。</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"正在准备复制…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml index 19460c1..34dcfa5 100644 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"分享"</string> <string name="menu_delete" msgid="8138799623850614177">"刪除"</string> <string name="menu_select" msgid="8711270657353563424">"選取「<xliff:g id="DIRECTORY">^1</xliff:g>」"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"全部選取"</string> + <string name="menu_copy" msgid="3612326052677229148">"複製到…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"顯示內部儲存空間"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"顯示 SD 卡"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"隱藏內部儲存空間"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"隱藏 SD 卡"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"顯示檔案大小"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"隱藏檔案大小"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"已選取 <xliff:g id="COUNT">%1$d</xliff:g> 個"</string> <string name="sort_name" msgid="9183560467917256779">"按名稱"</string> <string name="sort_date" msgid="586080032956151448">"按修改日期"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"無法開啟檔案"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string> <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"正在複製檔案"</string> + <string name="copy_remaining" msgid="6283790937387975095">"剩餘 <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">正在複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> + <item quantity="one">正在複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"正在準備複製…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml index ca844c4..62a6488 100644 --- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"共用"</string> <string name="menu_delete" msgid="8138799623850614177">"刪除"</string> <string name="menu_select" msgid="8711270657353563424">"選取「<xliff:g id="DIRECTORY">^1</xliff:g>」"</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"全選"</string> + <string name="menu_copy" msgid="3612326052677229148">"複製到…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"顯示內部儲存空間"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"顯示 SD 卡"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"隱藏內部儲存空間"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"隱藏 SD 卡"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"顯示檔案大小"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"隱藏檔案大小"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"已選取 <xliff:g id="COUNT">%1$d</xliff:g> 個項目"</string> <string name="sort_name" msgid="9183560467917256779">"依名稱"</string> <string name="sort_date" msgid="586080032956151448">"依修改日期"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"無法開啟檔案"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string> <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"複製檔案"</string> + <string name="copy_remaining" msgid="6283790937387975095">"剩餘 <xliff:g id="DURATION">%s</xliff:g>"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="other">正在複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> + <item quantity="one">正在複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"正在準備複製…"</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml index d21f07e..c97e0bf 100644 --- a/packages/DocumentsUI/res/values-zu/strings.xml +++ b/packages/DocumentsUI/res/values-zu/strings.xml @@ -30,14 +30,16 @@ <string name="menu_share" msgid="3075149983979628146">"Yabelana"</string> <string name="menu_delete" msgid="8138799623850614177">"Susa"</string> <string name="menu_select" msgid="8711270657353563424">"Khetha i-\"<xliff:g id="DIRECTORY">^1</xliff:g>\""</string> - <!-- no translation found for menu_select_all (4320518282375109902) --> - <skip /> + <string name="menu_select_all" msgid="4320518282375109902">"Khetha konke"</string> + <string name="menu_copy" msgid="3612326052677229148">"Kopishela ku…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Bonisa isitoreji sangaphakathi"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"Bonisa ikhadi le-SD"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Fihla isitoreji sangaphakathi"</string> <string name="menu_advanced_hide" product="default" msgid="4845869969015718848">"Fihla ikhadi le-SD"</string> <string name="menu_file_size_show" msgid="3240323619260823076">"Bonisa usayizi wefayela"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Fihla usayizi wefayela"</string> + <!-- no translation found for button_copy (8706475544635021302) --> + <skip /> <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> okukhethiwe"</string> <string name="sort_name" msgid="9183560467917256779">"Ngegama"</string> <string name="sort_date" msgid="586080032956151448">"Ngedethi yokuguqula"</string> @@ -57,4 +59,20 @@ <string name="toast_no_application" msgid="1339885974067891667">"Ayikwazi ukuvula ifayela"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ayikwazi ukususa amanye amadokhumenti"</string> <string name="share_via" msgid="8966594246261344259">"Yabelana nge-"</string> + <string name="copy_notification_title" msgid="6374299806748219777">"Ikopisha amafayela"</string> + <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> okusele"</string> + <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> + <item quantity="one">Ikopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> + <item quantity="other">Ikopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> + </plurals> + <string name="copy_preparing" msgid="3896202461003039386">"Ilungiselela ukukopisha..."</string> + <!-- no translation found for copy_error_notification_title (4911333304372840735) --> + <!-- no translation found for notification_touch_for_details (4483108577842961665) --> + <skip /> + <!-- no translation found for retry (7564024179122207376) --> + <skip /> + <!-- no translation found for copy_failure_alert_title (616726451967793549) --> + <skip /> + <!-- no translation found for copy_failure_alert_content (2655232627616241542) --> + <skip /> </resources> diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml index 4ad337d..062d433 100644 --- a/packages/DocumentsUI/res/values/strings.xml +++ b/packages/DocumentsUI/res/values/strings.xml @@ -48,6 +48,8 @@ <string name="menu_select">Select \"<xliff:g id="directory" example="My Directory">^1</xliff:g>\"</string> <!-- Menu item title that selects all documents in the current directory [CHAR LIMIT=24] --> <string name="menu_select_all">Select All</string> + <!-- Menu item title that copies the selected documents [CHAR LIMIT=24] --> + <string name="menu_copy">Copy to\u2026</string> <!-- Menu item that reveals internal storage built into the device [CHAR LIMIT=24] --> <string name="menu_advanced_show" product="nosdcard">Show internal storage</string> @@ -63,6 +65,9 @@ <!-- Menu item that hides the sizes of displayed files [CHAR LIMIT=24] --> <string name="menu_file_size_hide">Hide file size</string> + <!-- Button label that copies files to the current directory [CHAR LIMIT=48] --> + <string name="button_copy">Copy</string> + <!-- Action mode title summarizing the number of documents selected [CHAR LIMIT=32] --> <string name="mode_selected_count"><xliff:g id="count" example="3">%1$d</xliff:g> selected</string> @@ -110,4 +115,28 @@ <!-- Title of dialog when prompting user to select an app to share documents with [CHAR LIMIT=32] --> <string name="share_via">Share via</string> + <!-- Title of the copy notification [CHAR LIMIT=24] --> + <string name="copy_notification_title">Copying files</string> + <!-- Text shown on the copy notification to indicate remaining time, in minutes [CHAR LIMIT=24] --> + <string name="copy_remaining"><xliff:g id="duration" example="3 minutes">%s</xliff:g> left</string> + <!-- Toast shown when a file copy is kicked off --> + <plurals name="copy_begin"> + <item quantity="one">Copying <xliff:g id="count" example="1">%1$d</xliff:g> file.</item> + <item quantity="other">Copying <xliff:g id="count" example="3">%1$d</xliff:g> files.</item> + </plurals> + <!-- Text shown on the copy notification while DocumentsUI performs setup in preparation for copying files [CHAR LIMIT=32] --> + <string name="copy_preparing">Preparing for copy\u2026</string> + <!-- Title of the copy error notification [CHAR LIMIT=48] --> + <plurals name="copy_error_notification_title"> + <item quantity="one">Error copying <xliff:g id="count" example="1">%1$d</xliff:g> file.</item> + <item quantity="other">Error copying <xliff:g id="count" example="1">%1$d</xliff:g> files.</item> + </plurals> + <!-- Second line for notifications saying that more information will be shown after touching [CHAR LIMIT=48] --> + <string name="notification_touch_for_details">Touch to view details</string> + <!-- Label of a dialog button for retrying a failed operation [CHAR LIMIT=24] --> + <string name="retry">Retry</string> + <!-- Title of the copying failure alert dialog. [CHAR LIMIT=48] --> + <string name="copy_failure_alert_title">Error copying files</string> + <!-- Contents of the copying failure alert dialog. [CHAR LIMIT=48] --> + <string name="copy_failure_alert_content">Following files are not copied: <xliff:g id="list">%1$s</xliff:g></string> </resources> diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml index bf01bf1..39c958e 100644 --- a/packages/DocumentsUI/res/values/styles.xml +++ b/packages/DocumentsUI/res/values/styles.xml @@ -43,7 +43,7 @@ <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item> </style> - <style name="StandaloneTheme" parent="android:Theme.Light"> + <style name="StandaloneTheme" parent="android:Theme.DeviceDefault.Light"> <item name="android:actionBarWidgetTheme">@null</item> <item name="android:actionBarTheme">@*android:style/ThemeOverlay.Material.Dark.ActionBar</item> <item name="android:actionBarPopupTheme">@*android:style/ThemeOverlay.Material.Light</item> diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java index a8a0c1d..66792da 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -33,7 +33,6 @@ import com.android.documentsui.model.RootInfo; import com.google.common.collect.Maps; abstract class BaseActivity extends Activity { - public abstract State getDisplayState(); public abstract RootInfo getCurrentRoot(); public abstract void onStateChanged(); @@ -53,6 +52,18 @@ abstract class BaseActivity extends Activity { return (BaseActivity) fragment.getActivity(); } + public static abstract class DocumentsIntent { + /** Intent action name to open copy destination. */ + public static String ACTION_OPEN_COPY_DESTINATION = + "com.android.documentsui.OPEN_COPY_DESTINATION"; + + /** + * Extra boolean flag for ACTION_OPEN_COPY_DESTINATION_STRING, which + * specifies if the destination directory needs to create new directory or not. + */ + public static String EXTRA_DIRECTORY_COPY = "com.android.documentsui.DIRECTORY_COPY"; + } + public static class State implements android.os.Parcelable { public int action; public String[] acceptMimes; @@ -74,6 +85,7 @@ abstract class BaseActivity extends Activity { public boolean showAdvanced = false; public boolean stackTouched = false; public boolean restored = false; + public boolean directoryCopy = false; /** Current user navigation stack; empty implies recents. */ public DocumentStack stack = new DocumentStack(); @@ -88,7 +100,9 @@ abstract class BaseActivity extends Activity { public static final int ACTION_GET_CONTENT = 3; public static final int ACTION_OPEN_TREE = 4; public static final int ACTION_MANAGE = 5; - public static final int ACTION_MANAGE_ALL = 6; + public static final int ACTION_BROWSE = 6; + public static final int ACTION_BROWSE_ALL = 7; + public static final int ACTION_OPEN_COPY_DESTINATION = 8; public static final int MODE_UNKNOWN = 0; public static final int MODE_LIST = 1; diff --git a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java new file mode 100644 index 0000000..a9f03b6 --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java @@ -0,0 +1,467 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import static com.android.documentsui.model.DocumentInfo.getCursorLong; +import static com.android.documentsui.model.DocumentInfo.getCursorString; + +import android.app.IntentService; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.ContentProviderClient; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.CancellationSignal; +import android.os.ParcelFileDescriptor; +import android.os.Parcelable; +import android.os.RemoteException; +import android.os.SystemClock; +import android.provider.DocumentsContract; +import android.provider.DocumentsContract.Document; +import android.text.format.DateUtils; +import android.util.Log; + +import com.android.documentsui.model.DocumentInfo; +import com.android.documentsui.model.DocumentStack; + +import libcore.io.IoUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class CopyService extends IntentService { + public static final String TAG = "CopyService"; + + private static final String EXTRA_CANCEL = "com.android.documentsui.CANCEL"; + public static final String EXTRA_SRC_LIST = "com.android.documentsui.SRC_LIST"; + public static final String EXTRA_STACK = "com.android.documentsui.STACK"; + public static final String EXTRA_FAILURE = "com.android.documentsui.FAILURE"; + + // TODO: Move it to a shared file when more operations are implemented. + public static final int FAILURE_COPY = 1; + + private NotificationManager mNotificationManager; + private Notification.Builder mProgressBuilder; + + // Jobs are serialized but a job ID is used, to avoid mixing up cancellation requests. + private String mJobId; + private volatile boolean mIsCancelled; + // Parameters of the copy job. Requests to an IntentService are serialized so this code only + // needs to deal with one job at a time. + private final ArrayList<Uri> mFailedFiles; + private long mBatchSize; + private long mBytesCopied; + private long mStartTime; + private long mLastNotificationTime; + // Speed estimation + private long mBytesCopiedSample; + private long mSampleTime; + private long mSpeed; + private long mRemainingTime; + // Provider clients are acquired for the duration of each copy job. Note that there is an + // implicit assumption that all srcs come from the same authority. + private ContentProviderClient mSrcClient; + private ContentProviderClient mDstClient; + + public CopyService() { + super("CopyService"); + + mFailedFiles = new ArrayList<Uri>(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent.hasExtra(EXTRA_CANCEL)) { + handleCancel(intent); + } + return super.onStartCommand(intent, flags, startId); + } + + @Override + protected void onHandleIntent(Intent intent) { + if (intent.hasExtra(EXTRA_CANCEL)) { + handleCancel(intent); + return; + } + + final ArrayList<DocumentInfo> srcs = intent.getParcelableArrayListExtra(EXTRA_SRC_LIST); + final DocumentStack stack = intent.getParcelableExtra(EXTRA_STACK); + + try { + // Acquire content providers. + mSrcClient = DocumentsApplication.acquireUnstableProviderOrThrow(getContentResolver(), + srcs.get(0).authority); + mDstClient = DocumentsApplication.acquireUnstableProviderOrThrow(getContentResolver(), + stack.peek().authority); + + setupCopyJob(srcs, stack); + + for (int i = 0; i < srcs.size() && !mIsCancelled; ++i) { + copy(srcs.get(i), stack.peek()); + } + } catch (Exception e) { + // Catch-all to prevent any copy errors from wedging the app. + Log.e(TAG, "Exceptions occurred during copying", e); + } finally { + ContentProviderClient.releaseQuietly(mSrcClient); + ContentProviderClient.releaseQuietly(mDstClient); + + // Dismiss the ongoing copy notification when the copy is done. + mNotificationManager.cancel(mJobId, 0); + + if (mFailedFiles.size() > 0) { + final Context context = getApplicationContext(); + final Intent navigateIntent = new Intent(context, StandaloneActivity.class); + navigateIntent.putExtra(EXTRA_STACK, (Parcelable) stack); + navigateIntent.putExtra(EXTRA_FAILURE, FAILURE_COPY); + navigateIntent.putParcelableArrayListExtra(EXTRA_SRC_LIST, mFailedFiles); + + final Notification.Builder errorBuilder = new Notification.Builder(this) + .setContentTitle(context.getResources(). + getQuantityString(R.plurals.copy_error_notification_title, + mFailedFiles.size(), mFailedFiles.size())) + .setContentText(getString(R.string.notification_touch_for_details)) + .setContentIntent(PendingIntent.getActivity(context, 0, navigateIntent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT)) + .setCategory(Notification.CATEGORY_ERROR) + .setSmallIcon(R.drawable.ic_menu_copy) + .setAutoCancel(true); + mNotificationManager.notify(mJobId, 0, errorBuilder.build()); + } + + // TODO: Display a toast if the copy was cancelled. + } + } + + @Override + public void onCreate() { + super.onCreate(); + mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + } + + /** + * Sets up the CopyService to start tracking and sending notifications for the given batch of + * files. + * + * @param srcs A list of src files to copy. + * @param stack The copy destination stack. + * @throws RemoteException + */ + private void setupCopyJob(ArrayList<DocumentInfo> srcs, DocumentStack stack) + throws RemoteException { + // Create an ID for this copy job. Use the timestamp. + mJobId = String.valueOf(SystemClock.elapsedRealtime()); + // Reset the cancellation flag. + mIsCancelled = false; + + final Context context = getApplicationContext(); + final Intent navigateIntent = new Intent(context, StandaloneActivity.class); + navigateIntent.putExtra(EXTRA_STACK, (Parcelable) stack); + + mProgressBuilder = new Notification.Builder(this) + .setContentTitle(getString(R.string.copy_notification_title)) + .setContentIntent(PendingIntent.getActivity(context, 0, navigateIntent, 0)) + .setCategory(Notification.CATEGORY_PROGRESS) + .setSmallIcon(R.drawable.ic_menu_copy) + .setOngoing(true); + + final Intent cancelIntent = new Intent(this, CopyService.class); + cancelIntent.putExtra(EXTRA_CANCEL, mJobId); + mProgressBuilder.addAction(R.drawable.ic_cab_cancel, + getString(android.R.string.cancel), PendingIntent.getService(this, 0, + cancelIntent, + PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT)); + + // Send an initial progress notification. + mProgressBuilder.setProgress(0, 0, true); // Indeterminate progress while setting up. + mProgressBuilder.setContentText(getString(R.string.copy_preparing)); + mNotificationManager.notify(mJobId, 0, mProgressBuilder.build()); + + // Reset batch parameters. + mFailedFiles.clear(); + mBatchSize = calculateFileSizes(srcs); + mBytesCopied = 0; + mStartTime = SystemClock.elapsedRealtime(); + mLastNotificationTime = 0; + mBytesCopiedSample = 0; + mSampleTime = 0; + mSpeed = 0; + mRemainingTime = 0; + + // TODO: Check preconditions for copy. + // - check that the destination has enough space and is writeable? + // - check MIME types? + } + + /** + * Calculates the cumulative size of all the documents in the list. Directories are recursed + * into and totaled up. + * + * @param srcs + * @return Size in bytes. + * @throws RemoteException + */ + private long calculateFileSizes(List<DocumentInfo> srcs) throws RemoteException { + long result = 0; + for (DocumentInfo src : srcs) { + if (Document.MIME_TYPE_DIR.equals(src.mimeType)) { + // Directories need to be recursed into. + result += calculateFileSizesHelper(src.derivedUri); + } else { + result += src.size; + } + } + return result; + } + + /** + * Calculates (recursively) the cumulative size of all the files under the given directory. + * + * @throws RemoteException + */ + private long calculateFileSizesHelper(Uri uri) throws RemoteException { + final String authority = uri.getAuthority(); + final Uri queryUri = DocumentsContract.buildChildDocumentsUri(authority, + DocumentsContract.getDocumentId(uri)); + final String queryColumns[] = new String[] { + Document.COLUMN_DOCUMENT_ID, + Document.COLUMN_MIME_TYPE, + Document.COLUMN_SIZE + }; + + long result = 0; + Cursor cursor = null; + try { + cursor = mSrcClient.query(queryUri, queryColumns, null, null, null); + while (cursor.moveToNext()) { + if (Document.MIME_TYPE_DIR.equals( + getCursorString(cursor, Document.COLUMN_MIME_TYPE))) { + // Recurse into directories. + final Uri subdirUri = DocumentsContract.buildDocumentUri(authority, + getCursorString(cursor, Document.COLUMN_DOCUMENT_ID)); + result += calculateFileSizesHelper(subdirUri); + } else { + // This may return -1 if the size isn't defined. Ignore those cases. + long size = getCursorLong(cursor, Document.COLUMN_SIZE); + result += size > 0 ? size : 0; + } + } + } finally { + IoUtils.closeQuietly(cursor); + } + + return result; + } + + /** + * Cancels the current copy job, if its ID matches the given ID. + * + * @param intent The cancellation intent. + */ + private void handleCancel(Intent intent) { + final String cancelledId = intent.getStringExtra(EXTRA_CANCEL); + // Do nothing if the cancelled ID doesn't match the current job ID. This prevents racey + // cancellation requests from affecting unrelated copy jobs. + if (Objects.equals(mJobId, cancelledId)) { + // Set the cancel flag. This causes the copy loops to exit. + mIsCancelled = true; + // Dismiss the progress notification here rather than in the copy loop. This preserves + // interactivity for the user in case the copy loop is stalled. + mNotificationManager.cancel(mJobId, 0); + } + } + + /** + * Logs progress on the current copy operation. Displays/Updates the progress notification. + * + * @param bytesCopied + */ + private void makeProgress(long bytesCopied) { + mBytesCopied += bytesCopied; + double done = (double) mBytesCopied / mBatchSize; + String percent = NumberFormat.getPercentInstance().format(done); + + // Update time estimate + long currentTime = SystemClock.elapsedRealtime(); + long elapsedTime = currentTime - mStartTime; + + // Send out progress notifications once a second. + if (currentTime - mLastNotificationTime > 1000) { + updateRemainingTimeEstimate(elapsedTime); + mProgressBuilder.setProgress(100, (int) (done * 100), false); + mProgressBuilder.setContentInfo(percent); + if (mRemainingTime > 0) { + mProgressBuilder.setContentText(getString(R.string.copy_remaining, + DateUtils.formatDuration(mRemainingTime))); + } else { + mProgressBuilder.setContentText(null); + } + mNotificationManager.notify(mJobId, 0, mProgressBuilder.build()); + mLastNotificationTime = currentTime; + } + } + + /** + * Generates an estimate of the remaining time in the copy. + * + * @param elapsedTime The time elapsed so far. + */ + private void updateRemainingTimeEstimate(long elapsedTime) { + final long sampleDuration = elapsedTime - mSampleTime; + final long sampleSpeed = ((mBytesCopied - mBytesCopiedSample) * 1000) / sampleDuration; + if (mSpeed == 0) { + mSpeed = sampleSpeed; + } else { + mSpeed = ((3 * mSpeed) + sampleSpeed) / 4; + } + + if (mSampleTime > 0 && mSpeed > 0) { + mRemainingTime = ((mBatchSize - mBytesCopied) * 1000) / mSpeed; + } else { + mRemainingTime = 0; + } + + mSampleTime = elapsedTime; + mBytesCopiedSample = mBytesCopied; + } + + /** + * Copies a the given documents to the given location. + * + * @param srcInfo DocumentInfos for the documents to copy. + * @param dstDirInfo The destination directory. + * @throws RemoteException + */ + private void copy(DocumentInfo srcInfo, DocumentInfo dstDirInfo) throws RemoteException { + final Uri dstUri = DocumentsContract.createDocument(mDstClient, dstDirInfo.derivedUri, + srcInfo.mimeType, srcInfo.displayName); + if (dstUri == null) { + // If this is a directory, the entire subdir will not be copied over. + Log.e(TAG, "Error while copying " + srcInfo.displayName); + mFailedFiles.add(srcInfo.derivedUri); + return; + } + + if (Document.MIME_TYPE_DIR.equals(srcInfo.mimeType)) { + copyDirectoryHelper(srcInfo.derivedUri, dstUri); + } else { + copyFileHelper(srcInfo.derivedUri, dstUri); + } + } + + /** + * Handles recursion into a directory and copying its contents. Note that in linux terms, this + * does the equivalent of "cp src/* dst", not "cp -r src dst". + * + * @param srcDirUri URI of the directory to copy from. The routine will copy the directory's + * contents, not the directory itself. + * @param dstDirUri URI of the directory to copy to. Must be created beforehand. + * @throws RemoteException + */ + private void copyDirectoryHelper(Uri srcDirUri, Uri dstDirUri) throws RemoteException { + // Recurse into directories. Copy children into the new subdirectory. + final String queryColumns[] = new String[] { + Document.COLUMN_DISPLAY_NAME, + Document.COLUMN_DOCUMENT_ID, + Document.COLUMN_MIME_TYPE, + Document.COLUMN_SIZE + }; + final Uri queryUri = DocumentsContract.buildChildDocumentsUri(srcDirUri.getAuthority(), + DocumentsContract.getDocumentId(srcDirUri)); + Cursor cursor = null; + try { + // Iterate over srcs in the directory; copy to the destination directory. + cursor = mSrcClient.query(queryUri, queryColumns, null, null, null); + while (cursor.moveToNext()) { + final String childMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); + final Uri dstUri = DocumentsContract.createDocument(mDstClient, dstDirUri, + childMimeType, getCursorString(cursor, Document.COLUMN_DISPLAY_NAME)); + final Uri childUri = DocumentsContract.buildDocumentUri(srcDirUri.getAuthority(), + getCursorString(cursor, Document.COLUMN_DOCUMENT_ID)); + if (Document.MIME_TYPE_DIR.equals(childMimeType)) { + copyDirectoryHelper(childUri, dstUri); + } else { + copyFileHelper(childUri, dstUri); + } + } + } finally { + IoUtils.closeQuietly(cursor); + } + } + + /** + * Handles copying a single file. + * + * @param srcUri URI of the file to copy from. + * @param dstUri URI of the *file* to copy to. Must be created beforehand. + * @throws RemoteException + */ + private void copyFileHelper(Uri srcUri, Uri dstUri) throws RemoteException { + // Copy an individual file. + CancellationSignal canceller = new CancellationSignal(); + ParcelFileDescriptor srcFile = null; + ParcelFileDescriptor dstFile = null; + InputStream src = null; + OutputStream dst = null; + + boolean errorOccurred = false; + try { + srcFile = mSrcClient.openFile(srcUri, "r", canceller); + dstFile = mDstClient.openFile(dstUri, "w", canceller); + src = new ParcelFileDescriptor.AutoCloseInputStream(srcFile); + dst = new ParcelFileDescriptor.AutoCloseOutputStream(dstFile); + + byte[] buffer = new byte[8192]; + int len; + while (!mIsCancelled && ((len = src.read(buffer)) != -1)) { + dst.write(buffer, 0, len); + makeProgress(len); + } + srcFile.checkError(); + dstFile.checkError(); + } catch (IOException e) { + errorOccurred = true; + Log.e(TAG, "Error while copying " + srcUri.toString(), e); + mFailedFiles.add(srcUri); + } finally { + // This also ensures the file descriptors are closed. + IoUtils.closeQuietly(src); + IoUtils.closeQuietly(dst); + } + + if (errorOccurred || mIsCancelled) { + // Clean up half-copied files. + canceller.cancel(); + try { + DocumentsContract.deleteDocument(mDstClient, dstUri); + } catch (RemoteException e) { + Log.w(TAG, "Failed to clean up: " + srcUri, e); + // RemoteExceptions usually signal that the connection is dead, so there's no point + // attempting to continue. Propagate the exception up so the copy job is cancelled. + throw e; + } + } + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index a75dc42..e2e9807 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -16,17 +16,20 @@ package com.android.documentsui; -import static com.android.documentsui.DocumentsActivity.TAG; +import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE; +import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE_ALL; import static com.android.documentsui.BaseActivity.State.ACTION_CREATE; import static com.android.documentsui.BaseActivity.State.ACTION_MANAGE; import static com.android.documentsui.BaseActivity.State.MODE_GRID; import static com.android.documentsui.BaseActivity.State.MODE_LIST; import static com.android.documentsui.BaseActivity.State.MODE_UNKNOWN; import static com.android.documentsui.BaseActivity.State.SORT_ORDER_UNKNOWN; +import static com.android.documentsui.DocumentsActivity.TAG; import static com.android.documentsui.model.DocumentInfo.getCursorInt; import static com.android.documentsui.model.DocumentInfo.getCursorLong; import static com.android.documentsui.model.DocumentInfo.getCursorString; +import android.app.Activity; import android.app.ActivityManager; import android.app.Fragment; import android.app.FragmentManager; @@ -50,6 +53,7 @@ import android.os.Bundle; import android.os.CancellationSignal; import android.os.OperationCanceledException; import android.os.Parcelable; +import android.os.SystemProperties; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; import android.text.format.DateUtils; @@ -97,6 +101,8 @@ public class DirectoryFragment extends Fragment { private AbsListView mCurrentView; + private List<DocumentInfo> mSelectedDocumentsForCopy; + public static final int TYPE_NORMAL = 1; public static final int TYPE_SEARCH = 2; public static final int TYPE_RECENT_OPEN = 3; @@ -106,6 +112,8 @@ public class DirectoryFragment extends Fragment { public static final int ANIM_DOWN = 3; public static final int ANIM_UP = 4; + public static final int REQUEST_COPY_DESTINATION = 1; + private int mType = TYPE_NORMAL; private String mStateKey; @@ -335,6 +343,33 @@ public class DirectoryFragment extends Fragment { } @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + final Context context = getActivity(); + final Resources res = context.getResources(); + + // There's only one request code right now. Replace this with a switch statement or + // something more scalable when more codes are added. + if (requestCode != REQUEST_COPY_DESTINATION) { + return; + } + if (resultCode == Activity.RESULT_CANCELED || data == null) { + // User pressed the back button or otherwise cancelled the destination pick. Don't + // proceed with the copy. + return; + } + + final List<DocumentInfo> docs = mSelectedDocumentsForCopy; + final Intent copyIntent = new Intent(context, CopyService.class); + copyIntent.putParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST, new ArrayList<DocumentInfo>(docs)); + copyIntent.putExtra(CopyService.EXTRA_STACK, data.getParcelableExtra(CopyService.EXTRA_STACK)); + + Toast.makeText(context, + res.getQuantityString(R.plurals.copy_begin, docs.size(), docs.size()), + Toast.LENGTH_SHORT).show(); + context.startService(copyIntent); + } + + @Override public void onStop() { super.onStop(); @@ -463,11 +498,18 @@ public class DirectoryFragment extends Fragment { final MenuItem open = menu.findItem(R.id.menu_open); final MenuItem share = menu.findItem(R.id.menu_share); final MenuItem delete = menu.findItem(R.id.menu_delete); + final MenuItem copy = menu.findItem(R.id.menu_copy); - final boolean manageMode = state.action == ACTION_MANAGE; - open.setVisible(!manageMode); - share.setVisible(manageMode); - delete.setVisible(manageMode); + final boolean manageOrBrowse = (state.action == ACTION_MANAGE + || state.action == ACTION_BROWSE || state.action == ACTION_BROWSE_ALL); + + open.setVisible(!manageOrBrowse); + share.setVisible(manageOrBrowse); + delete.setVisible(manageOrBrowse); + + // TODO: unhide copying when ready + copy.setVisible(manageOrBrowse && + SystemProperties.getBoolean("debug.documentsui.enable_copy", false)); return true; } @@ -501,6 +543,11 @@ public class DirectoryFragment extends Fragment { mode.finish(); return true; + } else if (id == R.id.menu_copy) { + onCopyDocuments(docs); + mode.finish(); + return true; + } else if (id == R.id.menu_select_all) { int count = mCurrentView.getCount(); for (int i = 0; i < count; i++) { @@ -530,9 +577,7 @@ public class DirectoryFragment extends Fragment { if (cursor != null) { final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - if (!Document.MIME_TYPE_DIR.equals(docMimeType)) { - valid = isDocumentEnabled(docMimeType, docFlags); - } + valid = isDocumentEnabled(docMimeType, docFlags); } if (!valid) { @@ -561,8 +606,17 @@ public class DirectoryFragment extends Fragment { private void onShareDocuments(List<DocumentInfo> docs) { Intent intent; - if (docs.size() == 1) { - final DocumentInfo doc = docs.get(0); + + // Filter out directories - those can't be shared. + List<DocumentInfo> docsForSend = Lists.newArrayList(); + for (DocumentInfo doc: docs) { + if (!Document.MIME_TYPE_DIR.equals(doc.mimeType)) { + docsForSend.add(doc); + } + } + + if (docsForSend.size() == 1) { + final DocumentInfo doc = docsForSend.get(0); intent = new Intent(Intent.ACTION_SEND); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); @@ -570,14 +624,14 @@ public class DirectoryFragment extends Fragment { intent.setType(doc.mimeType); intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri); - } else if (docs.size() > 1) { + } else if (docsForSend.size() > 1) { intent = new Intent(Intent.ACTION_SEND_MULTIPLE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addCategory(Intent.CATEGORY_DEFAULT); final ArrayList<String> mimeTypes = Lists.newArrayList(); final ArrayList<Uri> uris = Lists.newArrayList(); - for (DocumentInfo doc : docs) { + for (DocumentInfo doc : docsForSend) { mimeTypes.add(doc.mimeType); uris.add(doc.derivedUri); } @@ -623,6 +677,27 @@ public class DirectoryFragment extends Fragment { } } + private void onCopyDocuments(List<DocumentInfo> docs) { + mSelectedDocumentsForCopy = docs; + + // Pop up a dialog to pick a destination. This is inadequate but works for now. + // TODO: Implement a picker that is to spec. + final Intent intent = new Intent( + BaseActivity.DocumentsIntent.ACTION_OPEN_COPY_DESTINATION, + Uri.EMPTY, + getActivity(), + DocumentsActivity.class); + boolean directoryCopy = false; + for (DocumentInfo info : docs) { + if (Document.MIME_TYPE_DIR.equals(info.mimeType)) { + directoryCopy = true; + break; + } + } + intent.putExtra(BaseActivity.DocumentsIntent.EXTRA_DIRECTORY_COPY, directoryCopy); + startActivityForResult(intent, REQUEST_COPY_DESTINATION); + } + private static State getDisplayState(Fragment fragment) { return ((BaseActivity) fragment.getActivity()).getDisplayState(); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index 2245b16..a2a789f 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -16,19 +16,21 @@ package com.android.documentsui; -import static com.android.documentsui.DirectoryFragment.ANIM_DOWN; -import static com.android.documentsui.DirectoryFragment.ANIM_NONE; -import static com.android.documentsui.DirectoryFragment.ANIM_SIDE; -import static com.android.documentsui.DirectoryFragment.ANIM_UP; +import static com.android.documentsui.BaseActivity.State.ACTION_BROWSE; import static com.android.documentsui.BaseActivity.State.ACTION_CREATE; import static com.android.documentsui.BaseActivity.State.ACTION_GET_CONTENT; import static com.android.documentsui.BaseActivity.State.ACTION_MANAGE; import static com.android.documentsui.BaseActivity.State.ACTION_OPEN; import static com.android.documentsui.BaseActivity.State.ACTION_OPEN_TREE; +import static com.android.documentsui.BaseActivity.State.ACTION_OPEN_COPY_DESTINATION; import static com.android.documentsui.BaseActivity.State.MODE_GRID; import static com.android.documentsui.BaseActivity.State.MODE_LIST; +import static com.android.documentsui.DirectoryFragment.ANIM_DOWN; +import static com.android.documentsui.DirectoryFragment.ANIM_NONE; +import static com.android.documentsui.DirectoryFragment.ANIM_SIDE; +import static com.android.documentsui.DirectoryFragment.ANIM_UP; + import android.app.Activity; -import android.app.Fragment; import android.app.FragmentManager; import android.content.ActivityNotFoundException; import android.content.ClipData; @@ -45,6 +47,7 @@ import android.graphics.Point; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Parcelable; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Root; import android.support.v4.app.ActionBarDrawerToggle; @@ -69,6 +72,8 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.Toolbar; +import libcore.io.IoUtils; + import com.android.documentsui.RecentsProvider.RecentColumns; import com.android.documentsui.RecentsProvider.ResumeColumns; import com.android.documentsui.model.DocumentInfo; @@ -76,8 +81,6 @@ import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.RootInfo; -import libcore.io.IoUtils; - import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; @@ -176,7 +179,7 @@ public class DocumentsActivity extends BaseActivity { setActionBar(mToolbar); // Hide roots when we're managing a specific root - if (mState.action == ACTION_MANAGE) { + if (mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE) { if (mShowAsDialog) { findViewById(R.id.container_roots).setVisibility(View.GONE); } else { @@ -188,7 +191,8 @@ public class DocumentsActivity extends BaseActivity { final String mimeType = getIntent().getType(); final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE); SaveFragment.show(getFragmentManager(), mimeType, title); - } else if (mState.action == ACTION_OPEN_TREE) { + } else if (mState.action == ACTION_OPEN_TREE || + mState.action == ACTION_OPEN_COPY_DESTINATION) { PickFragment.show(getFragmentManager()); } @@ -197,13 +201,15 @@ public class DocumentsActivity extends BaseActivity { moreApps.setComponent(null); moreApps.setPackage(null); RootsFragment.show(getFragmentManager(), moreApps); - } else if (mState.action == ACTION_OPEN - || mState.action == ACTION_CREATE || mState.action == ACTION_OPEN_TREE) { + } else if (mState.action == ACTION_OPEN || + mState.action == ACTION_CREATE || + mState.action == ACTION_OPEN_TREE || + mState.action == ACTION_OPEN_COPY_DESTINATION) { RootsFragment.show(getFragmentManager(), null); } if (!mState.restored) { - if (mState.action == ACTION_MANAGE) { + if (mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE) { final Uri rootUri = getIntent().getData(); new RestoreRootTask(rootUri).executeOnExecutor(getCurrentExecutor()); } else { @@ -229,6 +235,10 @@ public class DocumentsActivity extends BaseActivity { mState.action = ACTION_OPEN_TREE; } else if (DocumentsContract.ACTION_MANAGE_ROOT.equals(action)) { mState.action = ACTION_MANAGE; + } else if (DocumentsContract.ACTION_BROWSE_DOCUMENT_ROOT.equals(action)) { + mState.action = ACTION_BROWSE; + } else if (DocumentsIntent.ACTION_OPEN_COPY_DESTINATION.equals(action)) { + mState.action = ACTION_OPEN_COPY_DESTINATION; } if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { @@ -236,7 +246,7 @@ public class DocumentsActivity extends BaseActivity { Intent.EXTRA_ALLOW_MULTIPLE, false); } - if (mState.action == ACTION_MANAGE) { + if (mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE) { mState.acceptMimes = new String[] { "*/*" }; mState.allowMultiple = true; } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) { @@ -250,11 +260,15 @@ public class DocumentsActivity extends BaseActivity { mState.showAdvanced = mState.forceAdvanced | LocalPreferences.getDisplayAdvancedDevices(this); - if (mState.action == ACTION_MANAGE) { + if (mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE) { mState.showSize = true; } else { mState.showSize = LocalPreferences.getDisplayFileSize(this); } + if (mState.action == ACTION_OPEN_COPY_DESTINATION) { + mState.directoryCopy = intent.getBooleanExtra( + BaseActivity.DocumentsIntent.EXTRA_DIRECTORY_COPY, false); + } } private class RestoreRootTask extends AsyncTask<Void, Void, RootInfo> { @@ -404,16 +418,19 @@ public class DocumentsActivity extends BaseActivity { public void updateActionBar() { if (mRootsToolbar != null) { - if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT - || mState.action == ACTION_OPEN_TREE) { + if (mState.action == ACTION_OPEN || + mState.action == ACTION_GET_CONTENT || + mState.action == ACTION_OPEN_TREE) { mRootsToolbar.setTitle(R.string.title_open); - } else if (mState.action == ACTION_CREATE) { + } else if (mState.action == ACTION_CREATE || + mState.action == ACTION_OPEN_COPY_DESTINATION) { mRootsToolbar.setTitle(R.string.title_save); } } final RootInfo root = getCurrentRoot(); - final boolean showRootIcon = mShowAsDialog || (mState.action == ACTION_MANAGE); + final boolean showRootIcon = mShowAsDialog + || (mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE); if (showRootIcon) { mToolbar.setNavigationIcon( root != null ? root.loadToolbarIcon(mToolbar.getContext()) : null); @@ -544,6 +561,7 @@ public class DocumentsActivity extends BaseActivity { final MenuItem list = menu.findItem(R.id.menu_list); final MenuItem advanced = menu.findItem(R.id.menu_advanced); final MenuItem fileSize = menu.findItem(R.id.menu_file_size); + final MenuItem settings = menu.findItem(R.id.menu_settings); sort.setVisible(cwd != null); grid.setVisible(mState.derivedMode != MODE_GRID); @@ -571,7 +589,8 @@ public class DocumentsActivity extends BaseActivity { sortSize.setVisible(mState.showSize); boolean searchVisible; - boolean fileSizeVisible = mState.action != ACTION_MANAGE; + boolean fileSizeVisible = !(mState.action == ACTION_MANAGE + || mState.action == ACTION_BROWSE); if (mState.action == ACTION_CREATE || mState.action == ACTION_OPEN_TREE) { createDir.setVisible(cwd != null && cwd.isCreateSupported()); searchVisible = false; @@ -601,9 +620,12 @@ public class DocumentsActivity extends BaseActivity { fileSize.setTitle(LocalPreferences.getDisplayFileSize(this) ? R.string.menu_file_size_hide : R.string.menu_file_size_show); - advanced.setVisible(mState.action != ACTION_MANAGE); + advanced.setVisible(!(mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE)); fileSize.setVisible(fileSizeVisible); + settings.setVisible((mState.action == ACTION_MANAGE || mState.action == ACTION_BROWSE) + && (root.flags & Root.FLAG_HAS_SETTINGS) != 0); + return true; } @@ -643,6 +665,13 @@ public class DocumentsActivity extends BaseActivity { } else if (id == R.id.menu_file_size) { setDisplayFileSize(!LocalPreferences.getDisplayFileSize(this)); return true; + } else if (id == R.id.menu_settings) { + final RootInfo root = getCurrentRoot(); + final Intent intent = new Intent(DocumentsContract.ACTION_DOCUMENT_ROOT_SETTINGS); + intent.setDataAndType(DocumentsContract.buildRootUri(root.authority, root.rootId), + DocumentsContract.Root.MIME_TYPE_ITEM); + startActivity(intent); + return true; } else { return super.onOptionsItemSelected(item); } @@ -844,7 +873,9 @@ public class DocumentsActivity extends BaseActivity { if (cwd == null) { // No directory means recents - if (mState.action == ACTION_CREATE || mState.action == ACTION_OPEN_TREE) { + if (mState.action == ACTION_CREATE || + mState.action == ACTION_OPEN_TREE || + mState.action == ACTION_OPEN_COPY_DESTINATION) { RecentsCreateFragment.show(fm); } else { DirectoryFragment.showRecentsOpen(fm, anim); @@ -873,12 +904,13 @@ public class DocumentsActivity extends BaseActivity { } } - if (mState.action == ACTION_OPEN_TREE) { + if (mState.action == ACTION_OPEN_TREE || + mState.action == ACTION_OPEN_COPY_DESTINATION) { final PickFragment pick = PickFragment.get(fm); if (pick != null) { final CharSequence displayName = (mState.stack.size() <= 1) ? root.title : cwd.displayName; - pick.setPickTarget(cwd, displayName); + pick.setPickTarget(mState.action, cwd, displayName); } } @@ -1018,6 +1050,17 @@ public class DocumentsActivity extends BaseActivity { Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show(); } } + } else if (mState.action == ACTION_BROWSE) { + // Go straight to viewing + final Intent view = new Intent(Intent.ACTION_VIEW); + view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + view.setData(doc.derivedUri); + + try { + startActivity(view); + } catch (ActivityNotFoundException ex) { + Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show(); + } } } @@ -1045,9 +1088,17 @@ public class DocumentsActivity extends BaseActivity { @Override public void onPickRequested(DocumentInfo pickTarget) { - final Uri viaUri = DocumentsContract.buildTreeDocumentUri(pickTarget.authority, - pickTarget.documentId); - new PickFinishTask(viaUri).executeOnExecutor(getCurrentExecutor()); + Uri result; + if (mState.action == ACTION_OPEN_TREE) { + result = DocumentsContract.buildTreeDocumentUri( + pickTarget.authority, pickTarget.documentId); + } else if (mState.action == ACTION_OPEN_COPY_DESTINATION) { + result = pickTarget.derivedUri; + } else { + // Should not be reached. + throw new IllegalStateException("Invalid mState.action."); + } + new PickFinishTask(result).executeOnExecutor(getCurrentExecutor()); } private void saveStackBlocking() { @@ -1055,7 +1106,9 @@ public class DocumentsActivity extends BaseActivity { final ContentValues values = new ContentValues(); final byte[] rawStack = DurableUtils.writeToArrayOrNull(mState.stack); - if (mState.action == ACTION_CREATE || mState.action == ACTION_OPEN_TREE) { + if (mState.action == ACTION_CREATE || + mState.action == ACTION_OPEN_TREE || + mState.action == ACTION_OPEN_COPY_DESTINATION) { // Remember stack for last create values.clear(); values.put(RecentColumns.KEY, mState.stack.buildKey()); @@ -1088,11 +1141,14 @@ public class DocumentsActivity extends BaseActivity { if (mState.action == ACTION_GET_CONTENT) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - } else if (mState.action == ACTION_OPEN_TREE) { + } else if (mState.action == ACTION_OPEN_TREE || + mState.action == ACTION_OPEN_COPY_DESTINATION) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); + // TODO: Move passing the stack to the separate ACTION_COPY action once it's implemented. + intent.putExtra(CopyService.EXTRA_STACK, (Parcelable)mState.stack); } else { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION diff --git a/packages/DocumentsUI/src/com/android/documentsui/FailureDialogFragment.java b/packages/DocumentsUI/src/com/android/documentsui/FailureDialogFragment.java new file mode 100644 index 0000000..1748c9c --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/FailureDialogFragment.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.content.DialogInterface; +import android.net.Uri; +import android.os.Bundle; +import android.text.Html; + +import com.android.documentsui.model.DocumentInfo; + +import java.io.FileNotFoundException; +import java.util.ArrayList; + +/** + * Alert dialog for failed operations. + */ +public class FailureDialogFragment extends DialogFragment + implements DialogInterface.OnClickListener { + private static final String TAG = "FailureDialogFragment"; + + private int mFailure; + private ArrayList<Uri> mFailedSrcList; + + public static void show(FragmentManager fm, int failure, ArrayList<Uri> failedSrcList) { + // TODO: Add support for other failures than copy. + if (failure != CopyService.FAILURE_COPY) { + return; + } + + final Bundle args = new Bundle(); + args.putInt(CopyService.EXTRA_FAILURE, failure); + args.putParcelableArrayList(CopyService.EXTRA_SRC_LIST, failedSrcList); + + final FragmentTransaction ft = fm.beginTransaction(); + final FailureDialogFragment fragment = new FailureDialogFragment(); + fragment.setArguments(args); + + ft.add(fragment, TAG); + ft.commitAllowingStateLoss(); + } + + @Override + public void onClick(DialogInterface dialog, int whichButton) { + // TODO: Pass mFailure and mFailedSrcList to the parent fragment. + } + + @Override + public Dialog onCreateDialog(Bundle inState) { + super.onCreate(inState); + + mFailure = getArguments().getInt(CopyService.EXTRA_FAILURE); + mFailedSrcList = getArguments().getParcelableArrayList(CopyService.EXTRA_SRC_LIST); + + final StringBuilder list = new StringBuilder("<p>"); + for (Uri documentUri : mFailedSrcList) { + try { + final DocumentInfo documentInfo = DocumentInfo.fromUri( + getActivity().getContentResolver(), documentUri); + list.append(String.format("• %s<br>", documentInfo.displayName)); + } + catch (FileNotFoundException ignore) { + // Source file most probably gone. + } + } + list.append("</p>"); + final String message = String.format(getString(R.string.copy_failure_alert_content), + list.toString()); + + return new AlertDialog.Builder(getActivity()) + .setTitle(getString(R.string.copy_failure_alert_title)) + .setMessage(Html.fromHtml(message)) + // TODO: Implement retrying the copy operation. + .setPositiveButton(R.string.retry, this) + .setNegativeButton(android.R.string.cancel, this) + .setIcon(android.R.drawable.ic_dialog_alert) + .create(); + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java b/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java index 4b008ca..7ea51b9 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java @@ -16,6 +16,8 @@ package com.android.documentsui; +import android.R.string; +import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; @@ -40,6 +42,7 @@ public class PickFragment extends Fragment { private View mContainer; private Button mPick; + private Button mCancel; public static void show(FragmentManager fm) { final PickFragment fragment = new PickFragment(); @@ -61,7 +64,10 @@ public class PickFragment extends Fragment { mPick = (Button) mContainer.findViewById(android.R.id.button1); mPick.setOnClickListener(mPickListener); - setPickTarget(null, null); + mCancel = (Button) mContainer.findViewById(android.R.id.button2); + mCancel.setOnClickListener(mCancelListener); + + setPickTarget(0, null, null); return mContainer; } @@ -74,18 +80,44 @@ public class PickFragment extends Fragment { } }; - public void setPickTarget(DocumentInfo pickTarget, CharSequence displayName) { - mPickTarget = pickTarget; + private View.OnClickListener mCancelListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + final BaseActivity activity = BaseActivity.get(PickFragment.this); + activity.setResult(Activity.RESULT_CANCELED); + activity.finish(); + } + }; + /** + * @param action Which action defined in BaseActivity.State is the picker shown for. + */ + public void setPickTarget(int action, + DocumentInfo pickTarget, + CharSequence displayName) { if (mContainer != null) { - if (mPickTarget != null) { - mContainer.setVisibility(View.VISIBLE); + if (pickTarget != null) { final Locale locale = getResources().getConfiguration().locale; - final String raw = getString(R.string.menu_select).toUpperCase(locale); - mPick.setText(TextUtils.expandTemplate(raw, displayName)); + switch (action) { + case BaseActivity.State.ACTION_OPEN_TREE: + final String raw = getString(R.string.menu_select).toUpperCase(locale); + mPick.setText(TextUtils.expandTemplate(raw, displayName)); + mCancel.setVisibility(View.GONE); + break; + case BaseActivity.State.ACTION_OPEN_COPY_DESTINATION: + mPick.setText(getString(R.string.button_copy).toUpperCase(locale)); + mCancel.setVisibility(View.VISIBLE); + break; + default: + throw new IllegalArgumentException("Illegal action for PickFragment."); + } + } + if (pickTarget != null && pickTarget.isCreateSupported()) { + mContainer.setVisibility(View.VISIBLE); } else { mContainer.setVisibility(View.GONE); } } + mPickTarget = pickTarget; } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index ec71a04..27e8f20 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -360,14 +360,20 @@ public class RootsCache { // Exclude read-only devices when creating if (state.action == State.ACTION_CREATE && !supportsCreate) continue; + if (state.action == State.ACTION_OPEN_COPY_DESTINATION && !supportsCreate) continue; // Exclude roots that don't support directory picking if (state.action == State.ACTION_OPEN_TREE && !supportsIsChild) continue; // Exclude advanced devices when not requested if (!state.showAdvanced && advanced) continue; // Exclude non-local devices when local only if (state.localOnly && !localOnly) continue; + // Exclude downloads roots that don't support directory creation + // TODO: Add flag to check the root supports directory creation or not. + if (state.directoryCopy && root.isDownloads()) continue; // Only show empty roots when creating - if (state.action != State.ACTION_CREATE && empty) continue; + if ((state.action != State.ACTION_CREATE || + state.action != State.ACTION_OPEN_TREE || + state.action != State.ACTION_OPEN_COPY_DESTINATION) && empty) continue; // Only include roots that serve requested content final boolean overlap = diff --git a/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java b/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java index e01328d..976f21d 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java @@ -63,6 +63,7 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.Toolbar; +import com.android.documentsui.FailureDialogFragment; import com.android.documentsui.RecentsProvider.ResumeColumns; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; @@ -73,6 +74,7 @@ import libcore.io.IoUtils; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -153,6 +155,13 @@ public class StandaloneActivity extends BaseActivity { RootsFragment.show(getFragmentManager(), null); if (!mState.restored) { new RestoreStackTask().execute(); + final Intent intent = getIntent(); + final int failure = intent.getIntExtra(CopyService.EXTRA_FAILURE, 0); + if (failure != 0) { + final ArrayList<Uri> failedSrcList = intent.getParcelableArrayListExtra( + CopyService.EXTRA_SRC_LIST); + FailureDialogFragment.show(getFragmentManager(), failure, failedSrcList); + } } else { onCurrentDirectoryChanged(ANIM_NONE); } @@ -162,7 +171,7 @@ public class StandaloneActivity extends BaseActivity { mState = new State(); final Intent intent = getIntent(); - mState.action = State.ACTION_MANAGE_ALL; + mState.action = State.ACTION_BROWSE_ALL; mState.acceptMimes = new String[] { "*/*" }; mState.allowMultiple = true; mState.acceptMimes = new String[] { intent.getType() }; @@ -171,33 +180,9 @@ public class StandaloneActivity extends BaseActivity { mState.showAdvanced = mState.forceAdvanced | LocalPreferences.getDisplayAdvancedDevices(this); mState.showSize = true; - } - - private class RestoreRootTask extends AsyncTask<Void, Void, RootInfo> { - private Uri mRootUri; - - public RestoreRootTask(Uri rootUri) { - mRootUri = rootUri; - } - - @Override - protected RootInfo doInBackground(Void... params) { - final String rootId = DocumentsContract.getRootId(mRootUri); - return mRoots.getRootOneshot(mRootUri.getAuthority(), rootId); - } - - @Override - protected void onPostExecute(RootInfo root) { - if (isDestroyed()) return; - mState.restored = true; - - if (root != null) { - onRootPicked(root, true); - } else { - Log.w(TAG, "Failed to find root: " + mRootUri); - finish(); - } - } + final DocumentStack stack = intent.getParcelableExtra(CopyService.EXTRA_STACK); + if (stack != null) + mState.stack = stack; } private class RestoreStackTask extends AsyncTask<Void, Void, Void> { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java index 1c5ca86..5d5f2eb 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java @@ -24,6 +24,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; +import android.provider.DocumentsContract.Root; import android.provider.DocumentsProvider; import android.text.TextUtils; @@ -161,8 +162,6 @@ public class DocumentInfo implements Durable, Parcelable { this.authority = authority; this.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); this.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - this.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); - this.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); this.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); this.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); this.flags = getCursorInt(cursor, Document.COLUMN_FLAGS); diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java index 28bab6c..34bd696 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java @@ -17,6 +17,8 @@ package com.android.documentsui.model; import android.content.ContentResolver; +import android.os.Parcel; +import android.os.Parcelable; import android.provider.DocumentsProvider; import java.io.DataInputStream; @@ -31,7 +33,7 @@ import java.util.LinkedList; * Representation of a stack of {@link DocumentInfo}, usually the result of a * user-driven traversal. */ -public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { +public class DocumentStack extends LinkedList<DocumentInfo> implements Durable, Parcelable { private static final int VERSION_INIT = 1; private static final int VERSION_ADD_ROOT = 2; @@ -135,4 +137,28 @@ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { doc.write(out); } } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + DurableUtils.writeToParcel(dest, this); + } + + public static final Creator<DocumentStack> CREATOR = new Creator<DocumentStack>() { + @Override + public DocumentStack createFromParcel(Parcel in) { + final DocumentStack stack = new DocumentStack(); + DurableUtils.readFromParcel(in, stack); + return stack; + } + + @Override + public DocumentStack[] newArray(int size) { + return new DocumentStack[size]; + } + }; } diff --git a/packages/DocumentsUI/tests/AndroidManifest.xml b/packages/DocumentsUI/tests/AndroidManifest.xml index 81a2889..a312427 100644 --- a/packages/DocumentsUI/tests/AndroidManifest.xml +++ b/packages/DocumentsUI/tests/AndroidManifest.xml @@ -4,6 +4,17 @@ <application> <uses-library android:name="android.test.runner" /> + <provider + android:name="com.android.documentsui.StubProvider" + android:authorities="com.android.documentsui.stubprovider" + android:exported="true" + android:grantUriPermissions="true" + android:permission="android.permission.MANAGE_DOCUMENTS" + android:enabled="true"> + <intent-filter> + <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> + </intent-filter> + </provider> </application> <instrumentation android:name="android.test.InstrumentationTestRunner" diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java index cdb6b33..7faa3ce 100644 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java @@ -19,7 +19,7 @@ package com.android.documentsui; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; -import com.android.documentsui.DocumentsActivity.State; +import com.android.documentsui.BaseActivity.State; import com.android.documentsui.model.RootInfo; import com.google.android.collect.Lists; diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java b/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java new file mode 100644 index 0000000..75effa7 --- /dev/null +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java @@ -0,0 +1,316 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.documentsui; + +import android.content.Context; +import android.content.pm.ProviderInfo; +import android.content.res.AssetFileDescriptor; +import android.database.Cursor; +import android.database.MatrixCursor.RowBuilder; +import android.database.MatrixCursor; +import android.graphics.Point; +import android.os.CancellationSignal; +import android.os.FileUtils; +import android.os.ParcelFileDescriptor; +import android.provider.DocumentsContract; +import android.provider.DocumentsContract.Document; +import android.provider.DocumentsContract.Root; +import android.provider.DocumentsContract.Root; +import android.provider.DocumentsProvider; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +public class StubProvider extends DocumentsProvider { + private static int STORAGE_SIZE = 1024 * 1024; // 1 MB. + private static final String TAG = "StubProvider"; + private static final String MY_ROOT_ID = "myRoot"; + + private static final String[] DEFAULT_ROOT_PROJECTION = new String[] { + Root.COLUMN_ROOT_ID, Root.COLUMN_FLAGS, Root.COLUMN_TITLE, Root.COLUMN_DOCUMENT_ID, + Root.COLUMN_AVAILABLE_BYTES + }; + private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] { + Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE, Document.COLUMN_DISPLAY_NAME, + Document.COLUMN_LAST_MODIFIED, Document.COLUMN_FLAGS, Document.COLUMN_SIZE, + }; + + private String mRootDocumentId; + private HashMap<String, StubDocument> mStorage = new HashMap<String, StubDocument>(); + private int mStorageUsedBytes; + private Object mWriteLock = new Object(); + private String mAuthority; + + @Override + public void attachInfo(Context context, ProviderInfo info) { + mAuthority = info.authority; + super.attachInfo(context, info); + } + + @Override + public boolean onCreate() { + final File cacheDir = getContext().getCacheDir(); + removeRecursively(cacheDir); + final StubDocument document = new StubDocument(cacheDir, Document.MIME_TYPE_DIR, null); + mRootDocumentId = document.documentId; + mStorage.put(mRootDocumentId, document); + return true; + } + + @Override + public Cursor queryRoots(String[] projection) throws FileNotFoundException { + final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_ROOT_PROJECTION); + final RowBuilder row = result.newRow(); + row.add(Root.COLUMN_ROOT_ID, MY_ROOT_ID); + row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_IS_CHILD); + row.add(Root.COLUMN_TITLE, "Foobar SD 4GB"); + row.add(Root.COLUMN_DOCUMENT_ID, mRootDocumentId); + row.add(Root.COLUMN_AVAILABLE_BYTES, STORAGE_SIZE - mStorageUsedBytes); + return result; + } + + @Override + public Cursor queryDocument(String documentId, String[] projection) throws FileNotFoundException { + final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION); + final StubDocument file = mStorage.get(documentId); + if (file == null) { + throw new FileNotFoundException(); + } + includeDocument(result, file); + return result; + } + + @Override + public boolean isChildDocument(String parentDocId, String docId) { + final StubDocument parentDocument = mStorage.get(parentDocId); + final StubDocument childDocument = mStorage.get(docId); + return FileUtils.contains(parentDocument.file, childDocument.file); + } + + @Override + public String createDocument(String parentDocumentId, String mimeType, String displayName) + throws FileNotFoundException { + final StubDocument parentDocument = mStorage.get(parentDocumentId); + if (parentDocument == null || !parentDocument.file.isDirectory()) { + throw new FileNotFoundException(); + } + final File file = new File(parentDocument.file, displayName); + if (mimeType.equals(Document.MIME_TYPE_DIR)) { + if (!file.mkdirs()) { + throw new FileNotFoundException(); + } + } else { + try { + if (!file.createNewFile()) { + throw new FileNotFoundException(); + } + } + catch (IOException e) { + throw new FileNotFoundException(); + } + } + + final StubDocument document = new StubDocument(file, mimeType, parentDocument); + mStorage.put(document.documentId, document); + notifyParentChanged(document.parentId); + return document.documentId; + } + + @Override + public void deleteDocument(String documentId) + throws FileNotFoundException { + final StubDocument document = mStorage.get(documentId); + final long fileSize = document.file.length(); + if (document == null || !document.file.delete()) + throw new FileNotFoundException(); + synchronized (mWriteLock) { + mStorageUsedBytes -= fileSize; + } + notifyParentChanged(document.parentId); + } + + @Override + public Cursor queryChildDocuments(String parentDocumentId, String[] projection, String sortOrder) + throws FileNotFoundException { + final StubDocument parentDocument = mStorage.get(parentDocumentId); + if (parentDocument == null || parentDocument.file.isFile()) { + throw new FileNotFoundException(); + } + final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION); + result.setNotificationUri(getContext().getContentResolver(), + DocumentsContract.buildChildDocumentsUri(mAuthority, parentDocumentId)); + StubDocument document; + for (File file : parentDocument.file.listFiles()) { + document = mStorage.get(StubDocument.getDocumentIdForFile(file)); + if (document != null) { + includeDocument(result, document); + } + } + return result; + } + + @Override + public Cursor queryRecentDocuments(String rootId, String[] projection) + throws FileNotFoundException { + throw new FileNotFoundException(); + } + + @Override + public ParcelFileDescriptor openDocument(String docId, String mode, CancellationSignal signal) + throws FileNotFoundException { + final StubDocument document = mStorage.get(docId); + if (document == null || !document.file.isFile()) + throw new FileNotFoundException(); + + if ("r".equals(mode)) { + return ParcelFileDescriptor.open(document.file, ParcelFileDescriptor.MODE_READ_ONLY); + } + if ("w".equals(mode)) { + return startWrite(document); + } + + throw new FileNotFoundException(); + } + + @Override + public AssetFileDescriptor openDocumentThumbnail( + String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException { + throw new FileNotFoundException(); + } + + private ParcelFileDescriptor startWrite(final StubDocument document) + throws FileNotFoundException { + ParcelFileDescriptor[] pipe; + try { + pipe = ParcelFileDescriptor.createReliablePipe(); + } + catch (IOException exception) { + throw new FileNotFoundException(); + } + final ParcelFileDescriptor readPipe = pipe[0]; + final ParcelFileDescriptor writePipe = pipe[1]; + + new Thread() { + @Override + public void run() { + try { + final FileInputStream inputStream = new FileInputStream(readPipe.getFileDescriptor()); + final FileOutputStream outputStream = new FileOutputStream(document.file); + byte[] buffer = new byte[32 * 1024]; + int bytesToRead; + int bytesRead = 0; + while (bytesRead != -1) { + synchronized (mWriteLock) { + bytesToRead = Math.min(STORAGE_SIZE - mStorageUsedBytes, buffer.length); + if (bytesToRead == 0) { + closePipeWithErrorSilently(readPipe, "Not enough space."); + break; + } + bytesRead = inputStream.read(buffer, 0, bytesToRead); + if (bytesRead == -1) { + break; + } + outputStream.write(buffer, 0, bytesRead); + mStorageUsedBytes += bytesRead; + } + } + } + catch (IOException e) { + closePipeWithErrorSilently(readPipe, e.getMessage()); + } + finally { + closePipeSilently(readPipe); + notifyParentChanged(document.parentId); + } + } + }.start(); + + return writePipe; + } + + private void closePipeWithErrorSilently(ParcelFileDescriptor pipe, String error) { + try { + pipe.closeWithError(error); + } + catch (IOException ignore) { + } + } + + private void closePipeSilently(ParcelFileDescriptor pipe) { + try { + pipe.close(); + } + catch (IOException ignore) { + } + } + + private void notifyParentChanged(String parentId) { + getContext().getContentResolver().notifyChange( + DocumentsContract.buildChildDocumentsUri(mAuthority, parentId), null, false); + // Notify also about possible change in remaining space on the root. + getContext().getContentResolver().notifyChange(DocumentsContract.buildRootsUri(mAuthority), null, false); + } + + private void includeDocument(MatrixCursor result, StubDocument document) { + final RowBuilder row = result.newRow(); + row.add(Document.COLUMN_DOCUMENT_ID, document.documentId); + row.add(Document.COLUMN_DISPLAY_NAME, document.file.getName()); + row.add(Document.COLUMN_SIZE, document.file.length()); + row.add(Document.COLUMN_MIME_TYPE, document.mimeType); + int flags = Document.FLAG_SUPPORTS_DELETE; + // TODO: Add support for renaming. + if (document.file.isDirectory()) { + flags |= Document.FLAG_DIR_SUPPORTS_CREATE; + } else { + flags |= Document.FLAG_SUPPORTS_WRITE; + } + row.add(Document.COLUMN_FLAGS, flags); + row.add(Document.COLUMN_LAST_MODIFIED, document.file.lastModified()); + } + + private void removeRecursively(File file) { + for (File childFile : file.listFiles()) { + if (childFile.isDirectory()) { + removeRecursively(childFile); + } + childFile.delete(); + } + } +} + +class StubDocument { + public final File file; + public final String mimeType; + public final String documentId; + public final String parentId; + + StubDocument(File file, String mimeType, StubDocument parent) { + this.file = file; + this.mimeType = mimeType; + this.documentId = getDocumentIdForFile(file); + this.parentId = parent != null ? parent.documentId : null; + } + + public static String getDocumentIdForFile(File file) { + return file.getAbsolutePath(); + } +} diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 073d9c7..8f73118 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -162,6 +162,7 @@ public class ExternalStorageProvider extends DocumentsProvider { } else { root.title = volume.getDescription(getContext()); } + root.flags |= Root.FLAG_HAS_SETTINGS; } root.docId = getDocIdForFile(path); mRoots.add(root); diff --git a/packages/Keyguard/Android.mk b/packages/Keyguard/Android.mk index 96ed2e7..9083212 100644 --- a/packages/Keyguard/Android.mk +++ b/packages/Keyguard/Android.mk @@ -22,6 +22,8 @@ LOCAL_MODULE := Keyguard LOCAL_CERTIFICATE := platform +LOCAL_JAVA_LIBRARIES := SettingsLib + LOCAL_PRIVILEGED_MODULE := true LOCAL_PROGUARD_FLAG_FILES := proguard.flags @@ -30,4 +32,4 @@ LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res include $(BUILD_STATIC_JAVA_LIBRARY) -#include $(call all-makefiles-under,$(LOCAL_PATH))
\ No newline at end of file +#include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/packages/Keyguard/res/layout/keyguard_emergency_carrier_area.xml b/packages/Keyguard/res/layout/keyguard_emergency_carrier_area.xml index 7e09a5b..9b55e5b 100644 --- a/packages/Keyguard/res/layout/keyguard_emergency_carrier_area.xml +++ b/packages/Keyguard/res/layout/keyguard_emergency_carrier_area.xml @@ -46,7 +46,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginTop="@dimen/eca_overlap" - android:text="@string/kg_emergency_call_label" + android:text="@*android:string/lockscreen_emergency_call" style="?android:attr/buttonBarButtonStyle" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="@dimen/kg_status_line_font_size" diff --git a/packages/Keyguard/res/values-af/strings.xml b/packages/Keyguard/res/values-af/strings.xml index e4b543b..0eb378f 100644 --- a/packages/Keyguard/res/values-af/strings.xml +++ b/packages/Keyguard/res/values-af/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Volgende wekker gestel vir <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Vee uit"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Invoersleutel"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Noodoproep"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Het jy die patroon vergeet?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Verkeerde patroon"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Verkeerde wagwoord"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kode is aanvaar!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Geen diens nie."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Knoppie vir wissel van invoermetode."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Vliegtuigmodus"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nie herken nie"</string> </resources> diff --git a/packages/Keyguard/res/values-am/strings.xml b/packages/Keyguard/res/values-am/strings.xml index c54656e..c95b404 100644 --- a/packages/Keyguard/res/values-am/strings.xml +++ b/packages/Keyguard/res/values-am/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ቀጣዩ ማንቂያ ለ<xliff:g id="ALARM">%1$s</xliff:g> ተዘጋጅቷል"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ሰርዝ"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"አስገባ"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"የአደጋ ጊዜ ጥሪ"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ስርዓተ ጥለቱን እርሳ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"የተሳሳተ ስርዓተ ጥለት"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"የተሳሳተ ይለፍ ቃል"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"ኮዱ ተቀባይነት አግኝቷል!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"ከአገልግሎት መስጫ ክልል ውጪ።"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"የግቤት ስልት አዝራር ቀይር"</string> + <string name="airplane_mode" msgid="3122107900897202805">"የአውሮፕላን ሁነታ"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"አልታወቀም"</string> </resources> diff --git a/packages/Keyguard/res/values-ar/strings.xml b/packages/Keyguard/res/values-ar/strings.xml index 153f08e..5b919ba 100644 --- a/packages/Keyguard/res/values-ar/strings.xml +++ b/packages/Keyguard/res/values-ar/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"تم ضبط التنبيه التالي على <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"حذف"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"الاتصال بالطوارئ"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"نسيت النقش"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"نقش خاطئ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"كلمة مرور خاطئة"</string> @@ -117,4 +116,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"تم قبول الرمز!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"لا تتوفر خدمة"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"زر تبديل طريقة الإدخال."</string> + <string name="airplane_mode" msgid="3122107900897202805">"وضع الطائرة"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"لم يتم التعرف عليها"</string> </resources> diff --git a/packages/Keyguard/res/values-bg/strings.xml b/packages/Keyguard/res/values-bg/strings.xml index 5dcb82c..97b04e4 100644 --- a/packages/Keyguard/res/values-bg/strings.xml +++ b/packages/Keyguard/res/values-bg/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Следващият будилник е зададен за <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Изтриване"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Спешно обаждане"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забравена фигура"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Грешна фигура"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Грешна парола"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Кодът е приет!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Няма покритие."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Бутон за превключване на метода на въвеждане."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Самолетен режим"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не е разпознато"</string> </resources> diff --git a/packages/Keyguard/res/values-bn-rBD/strings.xml b/packages/Keyguard/res/values-bn-rBD/strings.xml index 2b13a07..a67143a 100644 --- a/packages/Keyguard/res/values-bn-rBD/strings.xml +++ b/packages/Keyguard/res/values-bn-rBD/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> এ পরবর্তী অ্যালার্ম সেট করা হয়েছে"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"মুছুন"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"জরুরি কল"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"প্যাটার্ন ভুলে গেছেন"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ভুল প্যাটার্ন"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ভুল পাসওয়ার্ড"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"কোড স্বীকৃত হয়েছে!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"কোনো পরিষেবা নেই৷"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ইনপুট পদ্ধতির বোতাম পরিবর্তন করুন৷"</string> + <string name="airplane_mode" msgid="3122107900897202805">"বিমান মোড"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"স্বীকৃত নয়"</string> </resources> diff --git a/packages/Keyguard/res/values-ca/strings.xml b/packages/Keyguard/res/values-ca/strings.xml index e675c7a..6541d80 100644 --- a/packages/Keyguard/res/values-ca/strings.xml +++ b/packages/Keyguard/res/values-ca/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"S\'ha definit la pròxima alarma per a les: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Suprimeix"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Retorn"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Trucada d\'emergència"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Patró oblidat"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Patró incorrecte"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contrasenya incorrecta"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"S\'ha acceptat el codi."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Sense servei."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Botó de canvi del mètode d\'entrada."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Mode d\'avió"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"No s\'ha reconegut"</string> </resources> diff --git a/packages/Keyguard/res/values-cs/strings.xml b/packages/Keyguard/res/values-cs/strings.xml index e1fa6f9..b264141 100644 --- a/packages/Keyguard/res/values-cs/strings.xml +++ b/packages/Keyguard/res/values-cs/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Další budík je nastaven na <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Smazat"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Tísňové volání"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zapomenuté gesto"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávné gesto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nesprávné heslo"</string> @@ -113,4 +112,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kód byl přijat."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Žádný signál."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Tlačítko přepnutí metody zadávání"</string> + <string name="airplane_mode" msgid="3122107900897202805">"Režim Letadlo"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nerozpoznáno"</string> </resources> diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml index 77e8ce3..a60a433 100644 --- a/packages/Keyguard/res/values-da/strings.xml +++ b/packages/Keyguard/res/values-da/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Næste alarm er indstillet til <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Slet"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Angiv"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Nødopkald"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Glemt mønster"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Forkert mønster"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Forkert adgangskode"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koden blev accepteret."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ingen dækning."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Skift indtastningsmetode-knappen."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Flytilstand"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Kan ikke genkendes"</string> </resources> diff --git a/packages/Keyguard/res/values-de/strings.xml b/packages/Keyguard/res/values-de/strings.xml index e21961d..b46284a 100644 --- a/packages/Keyguard/res/values-de/strings.xml +++ b/packages/Keyguard/res/values-de/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Nächster Wecker gestellt für <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Löschen"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Eingabetaste"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Notruf"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Muster vergessen"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Falsches Muster"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Falsches Passwort"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code akzeptiert"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Kein Dienst"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Schaltfläche zum Ändern der Eingabemethode"</string> + <string name="airplane_mode" msgid="3122107900897202805">"Flugmodus"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nicht erkannt"</string> </resources> diff --git a/packages/Keyguard/res/values-el/strings.xml b/packages/Keyguard/res/values-el/strings.xml index 7084c84..ff67a6f 100644 --- a/packages/Keyguard/res/values-el/strings.xml +++ b/packages/Keyguard/res/values-el/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Το επόμενο ξυπνητήρι ορίστηκε στις <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Διαγραφή"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Κλήσεις επείγουσας ανάγκης"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ξεχάσατε το μοτίβο"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Εσφαλμένο μοτίβο"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Εσφαλμένος κωδικός πρόσβασης"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Αποδεκτός κωδικός!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Καμία υπηρεσία."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Κουμπί εναλλαγής μεθόδου εισόδου"</string> + <string name="airplane_mode" msgid="3122107900897202805">"Λειτουργία πτήσης"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Δεν αναγνωρίστηκε"</string> </resources> diff --git a/packages/Keyguard/res/values-en-rAU/strings.xml b/packages/Keyguard/res/values-en-rAU/strings.xml index ee5da13..3b1adc9 100644 --- a/packages/Keyguard/res/values-en-rAU/strings.xml +++ b/packages/Keyguard/res/values-en-rAU/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Emergency call"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepted"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"No service."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Switch input method button."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Aeroplane mode"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Not recognised"</string> </resources> diff --git a/packages/Keyguard/res/values-en-rGB/strings.xml b/packages/Keyguard/res/values-en-rGB/strings.xml index ee5da13..3b1adc9 100644 --- a/packages/Keyguard/res/values-en-rGB/strings.xml +++ b/packages/Keyguard/res/values-en-rGB/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Emergency call"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepted"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"No service."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Switch input method button."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Aeroplane mode"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Not recognised"</string> </resources> diff --git a/packages/Keyguard/res/values-en-rIN/strings.xml b/packages/Keyguard/res/values-en-rIN/strings.xml index ee5da13..3b1adc9 100644 --- a/packages/Keyguard/res/values-en-rIN/strings.xml +++ b/packages/Keyguard/res/values-en-rIN/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Emergency call"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Wrong Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Wrong Password"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepted"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"No service."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Switch input method button."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Aeroplane mode"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Not recognised"</string> </resources> diff --git a/packages/Keyguard/res/values-es-rUS/strings.xml b/packages/Keyguard/res/values-es-rUS/strings.xml index b34dd05..e130c90 100644 --- a/packages/Keyguard/res/values-es-rUS/strings.xml +++ b/packages/Keyguard/res/values-es-rUS/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próxima alarma establecida: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Eliminar"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ingresar"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Realizar llamada de emergencia"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Olvidaste el patrón?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Patrón incorrecto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceptado"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Sin servicio"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Botón Cambiar método de entrada"</string> + <string name="airplane_mode" msgid="3122107900897202805">"Modo de avión"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"No reconocido"</string> </resources> diff --git a/packages/Keyguard/res/values-es/strings.xml b/packages/Keyguard/res/values-es/strings.xml index be3c113..e7f0a50 100644 --- a/packages/Keyguard/res/values-es/strings.xml +++ b/packages/Keyguard/res/values-es/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próxima alarma: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Eliminar"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Intro"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Llamada de emergencia"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Has olvidado el patrón?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"El patrón es incorrecto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceptado"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Sin servicio"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Botón Cambiar método de entrada"</string> + <string name="airplane_mode" msgid="3122107900897202805">"Modo avión"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"No reconocido"</string> </resources> diff --git a/packages/Keyguard/res/values-et-rEE/strings.xml b/packages/Keyguard/res/values-et-rEE/strings.xml index 402fc14..3175e7b 100644 --- a/packages/Keyguard/res/values-et-rEE/strings.xml +++ b/packages/Keyguard/res/values-et-rEE/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Järgmine alarm on määratud ajaks <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Kustuta"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Sisestusklahv"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Hädaabikõne"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unustasin mustri"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Vale muster"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Vale parool"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kood on õige."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Teenus puudub."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Sisestusmeetodi vahetamise nupp."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Lennukirežiim"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ei tuvastatud"</string> </resources> diff --git a/packages/Keyguard/res/values-eu-rES/strings.xml b/packages/Keyguard/res/values-eu-rES/strings.xml index 86850bb..6a18667 100644 --- a/packages/Keyguard/res/values-eu-rES/strings.xml +++ b/packages/Keyguard/res/values-eu-rES/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Hurrengo alarmak ordu honetan joko du: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ezabatu"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Sartu"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Larrialdi-deia"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Eredua ahaztu zaizu"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Eredu okerra"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Pasahitz okerra"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kodea onartu da!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Zerbitzurik gabe."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Idazketa-metodoa aldatzeko botoia."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Hegaldi modua"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ez da ezagutzen"</string> </resources> diff --git a/packages/Keyguard/res/values-fa/strings.xml b/packages/Keyguard/res/values-fa/strings.xml index 367c411..b0bb6e6 100644 --- a/packages/Keyguard/res/values-fa/strings.xml +++ b/packages/Keyguard/res/values-fa/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"زنگ هشدار بعدی برای <xliff:g id="ALARM">%1$s</xliff:g> تنظیم شد"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"تماس اضطراری"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"الگو را فراموش کردهاید"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"الگوی اشتباه"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"گذرواژه اشتباه"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"کد پذیرفته شد!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"خدماتی وجود ندارد."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"کلید تغییر روش ورود متن."</string> + <string name="airplane_mode" msgid="3122107900897202805">"حالت هواپیما"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"شناخته نشد"</string> </resources> diff --git a/packages/Keyguard/res/values-fi/strings.xml b/packages/Keyguard/res/values-fi/strings.xml index 68f7016..459b32b 100644 --- a/packages/Keyguard/res/values-fi/strings.xml +++ b/packages/Keyguard/res/values-fi/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Seuraava hälytys asetettu: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Poista"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Hätäpuhelu"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Unohtunut kuvio"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Väärä kuvio"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Väärä salasana"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koodi hyväksytty!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ei yhteyttä."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Syöttötavan vaihtopainike."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Lentokonetila"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ei tunnistettu"</string> </resources> diff --git a/packages/Keyguard/res/values-fr-rCA/strings.xml b/packages/Keyguard/res/values-fr-rCA/strings.xml index 2c24f7a..992faf8 100644 --- a/packages/Keyguard/res/values-fr-rCA/strings.xml +++ b/packages/Keyguard/res/values-fr-rCA/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Heure de la prochaine alarme : <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Supprimer"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Entrée"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Appel d\'urgence"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepté"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Aucun service"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Bouton \"Changer le mode de saisie\""</string> + <string name="airplane_mode" msgid="3122107900897202805">"Mode Avion"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Doigt non reconnu"</string> </resources> diff --git a/packages/Keyguard/res/values-fr/strings.xml b/packages/Keyguard/res/values-fr/strings.xml index 77a2d06..48b5bc3 100644 --- a/packages/Keyguard/res/values-fr/strings.xml +++ b/packages/Keyguard/res/values-fr/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Prochaine alarme définie à <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Supprimer"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Entrée"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Appel d\'urgence"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"J\'ai oublié le schéma"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Schéma incorrect."</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Mot de passe incorrect."</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code accepté."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Aucun service"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Bouton \"Changer le mode de saisie\""</string> + <string name="airplane_mode" msgid="3122107900897202805">"Mode Avion"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non reconnu"</string> </resources> diff --git a/packages/Keyguard/res/values-gl-rES/strings.xml b/packages/Keyguard/res/values-gl-rES/strings.xml index 8e8f5c5..8b6b0ba 100644 --- a/packages/Keyguard/res/values-gl-rES/strings.xml +++ b/packages/Keyguard/res/values-gl-rES/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próxima alarma definida para <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Eliminar"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Intro"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Chamada de emerxencia"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueciches o padrón"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrón incorrecto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contrasinal incorrecto"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceptado"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Non hai servizo."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Cambiar o botón do método de entrada."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Modo avión"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non se recoñece"</string> </resources> diff --git a/packages/Keyguard/res/values-hi/strings.xml b/packages/Keyguard/res/values-hi/strings.xml index 0cd65b8..aa32759 100644 --- a/packages/Keyguard/res/values-hi/strings.xml +++ b/packages/Keyguard/res/values-hi/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"अगला अलार्म <xliff:g id="ALARM">%1$s</xliff:g> के लिए सेट किया गया"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"हटाएं"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"आपातकालीन कॉल"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"आकार भूल गए"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत आकार"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"कोड स्वीकार किया गया!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"कोई सेवा नहीं."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"इनपुट पद्धति बटन स्विच करें."</string> + <string name="airplane_mode" msgid="3122107900897202805">"हवाई जहाज़ मोड"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"पहचाना नहीं गया"</string> </resources> diff --git a/packages/Keyguard/res/values-hr/strings.xml b/packages/Keyguard/res/values-hr/strings.xml index 71410c5..cd280e3 100644 --- a/packages/Keyguard/res/values-hr/strings.xml +++ b/packages/Keyguard/res/values-hr/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Sljedeći alarm postavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Izbriši"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Hitan poziv"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravili ste obrazac"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan obrazac"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna zaporka"</string> @@ -111,4 +110,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kôd je prihvaćen!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Nema usluge."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Gumb za promjenu načina unosa."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Način rada u zrakoplovu"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nije prepoznat"</string> </resources> diff --git a/packages/Keyguard/res/values-hu/strings.xml b/packages/Keyguard/res/values-hu/strings.xml index dd43dba..ead2f87 100644 --- a/packages/Keyguard/res/values-hu/strings.xml +++ b/packages/Keyguard/res/values-hu/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"A következő riasztás beállított ideje: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Segélyhívás"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Elfelejtett minta"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Helytelen minta"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Helytelen jelszó"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kód elfogadva."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Nincs szolgáltatás."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Beviteli mód váltása gomb."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Repülős üzemmód"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nem sikerült felismerni"</string> </resources> diff --git a/packages/Keyguard/res/values-hy-rAM/strings.xml b/packages/Keyguard/res/values-hy-rAM/strings.xml index e56642a..9b94ba0 100644 --- a/packages/Keyguard/res/values-hy-rAM/strings.xml +++ b/packages/Keyguard/res/values-hy-rAM/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Հաջորդ զարթուցիչը դրված է <xliff:g id="ALARM">%1$s</xliff:g>-ի վրա"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ջնջել"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Մուտք"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Արտակարգ իրավիճակի հեռախոսազանգ"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Մոռացել եմ սխեման"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Սխալ սխեմա"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Սխալ գաղտնաբառ"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Կոդն ընդունվեց:"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ծառայություն չկա:"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Միացնել մուտքագրման եղանակի կոճակը:"</string> + <string name="airplane_mode" msgid="3122107900897202805">"Ինքնաթիռային ռեժիմ"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Չճանաչվեց"</string> </resources> diff --git a/packages/Keyguard/res/values-in/strings.xml b/packages/Keyguard/res/values-in/strings.xml index 29a56ef..93484d2 100644 --- a/packages/Keyguard/res/values-in/strings.xml +++ b/packages/Keyguard/res/values-in/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Alarm berikutnya disetel untuk <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Hapus"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Panggilan darurat"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Pola?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Pola Salah"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Sandi Salah"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kode Diterima!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Tidak ada layanan."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Tombol beralih metode masukan."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Mode pesawat"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Tidak dikenali"</string> </resources> diff --git a/packages/Keyguard/res/values-is-rIS/strings.xml b/packages/Keyguard/res/values-is-rIS/strings.xml index 5741cd0..9e88318 100644 --- a/packages/Keyguard/res/values-is-rIS/strings.xml +++ b/packages/Keyguard/res/values-is-rIS/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Næsti vekjari stilltur á <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Eyða"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Neyðarsímtal"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Man ekki mynstrið"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Rangt mynstur"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Rangt aðgangsorð"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Númer samþykkt!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ekkert símasamband."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Hnappur til að skipta um innsláttaraðferð."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Flugstilling"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Þekktist ekki"</string> </resources> diff --git a/packages/Keyguard/res/values-it/strings.xml b/packages/Keyguard/res/values-it/strings.xml index c5c476c..c0c690b 100644 --- a/packages/Keyguard/res/values-it/strings.xml +++ b/packages/Keyguard/res/values-it/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Prossima sveglia impostata a: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Canc"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Invio"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Chiamata di emergenza"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Sequenza dimenticata"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequenza sbagliata"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Password sbagliata"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Codice accettato."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Nessun servizio."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Pulsante per cambiare metodo di immissione."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Modalità aereo"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non riconosciuto"</string> </resources> diff --git a/packages/Keyguard/res/values-iw/strings.xml b/packages/Keyguard/res/values-iw/strings.xml index a856ccb..f817096 100644 --- a/packages/Keyguard/res/values-iw/strings.xml +++ b/packages/Keyguard/res/values-iw/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ההתראה הבאה נקבעה לשעה <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"מחק"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"שיחת חירום"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"שכחת את הקו"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"קו ביטול נעילה שגוי"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"סיסמה שגויה"</string> @@ -113,4 +112,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"הקוד התקבל!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"אין קליטה."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"לחצן החלפת שיטת קלט."</string> + <string name="airplane_mode" msgid="3122107900897202805">"מצב טיסה"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"לא זוהתה"</string> </resources> diff --git a/packages/Keyguard/res/values-ja/strings.xml b/packages/Keyguard/res/values-ja/strings.xml index 5c76034..5f92356 100644 --- a/packages/Keyguard/res/values-ja/strings.xml +++ b/packages/Keyguard/res/values-ja/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"次のアラームは<xliff:g id="ALARM">%1$s</xliff:g>に設定されました"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"削除"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"緊急通報"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"パターンを忘れた場合"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"パターンが正しくありません"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"パスワードが正しくありません"</string> @@ -88,10 +87,10 @@ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="6945823186629369880">"携帯電話のロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、このユーザーは削除され、ユーザーのデータがすべて削除されます。"</string> <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="3963486905355778734">"タブレットのロック解除に<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。このユーザーは削除され、ユーザーのデータがすべて削除されます。"</string> <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="7729009752252111673">"携帯電話のロック解除に<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。このユーザーは削除され、ユーザーのデータがすべて削除されます。"</string> - <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="4621778507387853694">"タブレットのロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、ワークプロフィールが削除され、プロフィールのデータがすべて削除されます。"</string> - <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="6853071165802933545">"携帯電話のロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、ワークプロフィールが削除され、プロフィールのデータがすべて削除されます。"</string> - <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4686386497449912146">"タブレットのロック解除に<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。ワークプロフィールが削除され、プロフィールのデータがすべて削除されます。"</string> - <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"携帯電話のロック解除に<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。ワークプロフィールが削除され、プロフィールのデータがすべて削除されます。"</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="4621778507387853694">"タブレットのロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、仕事用プロファイルが削除され、プロファイルのデータがすべて削除されます。"</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="6853071165802933545">"スマートフォンのロック解除に<xliff:g id="NUMBER_0">%d</xliff:g>回失敗しました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回失敗すると、仕事用プロファイルが削除され、プロファイルのデータがすべて削除されます。"</string> + <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4686386497449912146">"タブレットのロック解除に<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。仕事用プロファイルが削除され、プロファイルのデータがすべて削除されます。"</string> + <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"スマートフォンのロック解除に<xliff:g id="NUMBER">%d</xliff:g>回失敗しました。仕事用プロファイルが削除され、プロファイルのデータがすべて削除されます。"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、タブレットのロック解除にメールアカウントが必要になります。\n\n<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"ロック解除パターンの入力を<xliff:g id="NUMBER_0">%d</xliff:g>回間違えました。あと<xliff:g id="NUMBER_1">%d</xliff:g>回間違えると、携帯端末のロック解除にメールアカウントが必要になります。\n\n<xliff:g id="NUMBER_2">%d</xliff:g>秒後にもう一度お試しください。"</string> <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM PINコードが無効です。お使いの端末をロック解除するには携帯通信会社にお問い合わせいただく必要があります。"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"コードが承認されました。"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"通信サービスはありません。"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"入力方法の切り替えボタン。"</string> + <string name="airplane_mode" msgid="3122107900897202805">"機内モード"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"認識されませんでした"</string> </resources> diff --git a/packages/Keyguard/res/values-ka-rGE/strings.xml b/packages/Keyguard/res/values-ka-rGE/strings.xml index e9c77fd..8ed74c7 100644 --- a/packages/Keyguard/res/values-ka-rGE/strings.xml +++ b/packages/Keyguard/res/values-ka-rGE/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"შემდეგი მაღვიძარა დაყენებულია <xliff:g id="ALARM">%1$s</xliff:g>-ზე"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"წაშლა"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"შეყვანა"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"გადაუდებელი დახმარების ზარი"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"დაგავიწყდათ ნიმუში"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"არასწორი ნიმუში"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"არასწორი პაროლი"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"კოდი მიღებულია!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"არ არის სერვისი."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"შეყვანის მეთოდის გადართვის ღილაკი."</string> + <string name="airplane_mode" msgid="3122107900897202805">"თვითმფრინავის რეჟიმი"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"არ არის ამოცნობილი"</string> </resources> diff --git a/packages/Keyguard/res/values-kk-rKZ/strings.xml b/packages/Keyguard/res/values-kk-rKZ/strings.xml index 85443f6..2b38a2a 100644 --- a/packages/Keyguard/res/values-kk-rKZ/strings.xml +++ b/packages/Keyguard/res/values-kk-rKZ/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Келесі дабыл <xliff:g id="ALARM">%1$s</xliff:g> уақытына орнатылған"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Жою"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Енгізу"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Төтенше қоңырау"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Кескінді ұмытып қалу"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Қате кескін"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Қате кілтсөз"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Код қабылданды!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Қызмет көрсетілмейді."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Енгізу әдісі түймесін ауыстыру."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Ұшақ режимі"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Анықталмаған"</string> </resources> diff --git a/packages/Keyguard/res/values-km-rKH/strings.xml b/packages/Keyguard/res/values-km-rKH/strings.xml index be72fd6..c278a47 100644 --- a/packages/Keyguard/res/values-km-rKH/strings.xml +++ b/packages/Keyguard/res/values-km-rKH/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ការជូនដំណឹងបន្ទាប់កំណត់សម្រាប់ <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"លុប"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"ការហៅពេលអាសន្ន"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ភ្លេចលំនាំ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"លំនាំមិនត្រឹមត្រូវ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ពាក្យសម្ងាត់មិនត្រឹមត្រូវ"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"បានទទួលយកលេខកូដ!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"គ្មានសេវា"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ប្ដូរប៊ូតុងវិធីសាស្ត្របញ្ចូល។"</string> + <string name="airplane_mode" msgid="3122107900897202805">"របៀបក្នុងយន្តហោះ"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"មិនអាចសម្គាល់បានទេ"</string> </resources> diff --git a/packages/Keyguard/res/values-kn-rIN/strings.xml b/packages/Keyguard/res/values-kn-rIN/strings.xml index cfa1ac0..a5631a6 100644 --- a/packages/Keyguard/res/values-kn-rIN/strings.xml +++ b/packages/Keyguard/res/values-kn-rIN/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> ಗೆ ಮುಂದಿನ ಅಲಾರಾಂ ಹೊಂದಿಸಲಾಗಿದೆ"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ಅಳಿಸು"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ನಮೂದಿಸು"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"ತುರ್ತು ಕರೆ"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಮರೆತಿರುವಿರಿ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ತಪ್ಪು ಪ್ಯಾಟರ್ನ್"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"ಕೋಡ್ ಅಂಗೀಕೃತವಾಗಿದೆ!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"ಯಾವುದೇ ಸೇವೆಯಿಲ್ಲ."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ಇನ್ಪುಟ್ ವಿಧಾನ ಬದಲಿಸು ಬಟನ್."</string> + <string name="airplane_mode" msgid="3122107900897202805">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string> </resources> diff --git a/packages/Keyguard/res/values-ko/strings.xml b/packages/Keyguard/res/values-ko/strings.xml index 1ef0c19..37bf289 100644 --- a/packages/Keyguard/res/values-ko/strings.xml +++ b/packages/Keyguard/res/values-ko/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"다음 알람이 <xliff:g id="ALARM">%1$s</xliff:g>(으)로 설정되었습니다."</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete 키"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 키"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"긴급 통화"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"패턴을 잊음"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"잘못된 패턴"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"잘못된 비밀번호"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"코드 승인 완료"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"서비스 불가"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"입력 방법 버튼을 전환합니다."</string> + <string name="airplane_mode" msgid="3122107900897202805">"비행기 모드"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"인식할 수 없습니다."</string> </resources> diff --git a/packages/Keyguard/res/values-ky-rKG/strings.xml b/packages/Keyguard/res/values-ky-rKG/strings.xml index 430c19a..cf7a07c 100644 --- a/packages/Keyguard/res/values-ky-rKG/strings.xml +++ b/packages/Keyguard/res/values-ky-rKG/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Кийинки ойготкуч саат <xliff:g id="ALARM">%1$s</xliff:g> коюлган"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Жок кылуу"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Кирүү"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Куткаруучуларга чалуу"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Үлгү унутулду"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Үлгү туура эмес"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Сырсөз туура эмес"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Код кабыл алынды!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Байланыш жок."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Киргизүү ыкмасын которуу баскычы."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Учак режими"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Таанылган жок"</string> </resources> diff --git a/packages/Keyguard/res/values-lo-rLA/strings.xml b/packages/Keyguard/res/values-lo-rLA/strings.xml index 17c1c5b..bcc1cf1 100644 --- a/packages/Keyguard/res/values-lo-rLA/strings.xml +++ b/packages/Keyguard/res/values-lo-rLA/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ໂມງປຸກຕໍ່ໄປຖືກຕັ້ງໄວ້ເວລາ <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ລຶບ"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"ການໂທສຸກເສີນ"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ລືມຮູບແບບປົດລັອກ?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ຮູບແບບຜິດ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"ລະຫັດຖືກຕອບຮັບແລ້ວ!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"ບໍ່ມີບໍລິການ"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ປຸ່ມສະລັບຮູບແບບການປ້ອນຂໍ້ມູນ."</string> + <string name="airplane_mode" msgid="3122107900897202805">"ໂໝດໃນຍົນ"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ບໍ່ຈົດຈຳໄດ້"</string> </resources> diff --git a/packages/Keyguard/res/values-lt/strings.xml b/packages/Keyguard/res/values-lt/strings.xml index 6d7dcc7..3bbf54f 100644 --- a/packages/Keyguard/res/values-lt/strings.xml +++ b/packages/Keyguard/res/values-lt/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Kitas nustatytas signalas: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ištrinti"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Įvesti"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Skambutis pagalbos numeriu"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Pamiršau atrakinimo piešinį"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Netinkamas atrakinimo piešinys"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Netinkamas slaptažodis"</string> @@ -113,4 +112,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kodas priimtas."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Nėra paslaugos."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Perjungti įvesties metodo mygtuką."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Lėktuvo režimas"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Neatpažintas"</string> </resources> diff --git a/packages/Keyguard/res/values-lv/strings.xml b/packages/Keyguard/res/values-lv/strings.xml index e1da889..3b03d0d 100644 --- a/packages/Keyguard/res/values-lv/strings.xml +++ b/packages/Keyguard/res/values-lv/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Signāls iestatīts uz: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Dzēšanas taustiņš"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Ievadīšanas taustiņš"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Ārkārtas izsaukums"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Aizmirsu kombināciju"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Nepareiza kombinācija"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nepareiza parole"</string> @@ -111,4 +110,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kods ir pieņemts!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Nav pakalpojuma."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Ievades metodes maiņas poga."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Lidojuma režīms"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nav atpazīts"</string> </resources> diff --git a/packages/Keyguard/res/values-mk-rMK/strings.xml b/packages/Keyguard/res/values-mk-rMK/strings.xml index 717671b..d5f4a09 100644 --- a/packages/Keyguard/res/values-mk-rMK/strings.xml +++ b/packages/Keyguard/res/values-mk-rMK/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Следниот аларм е поставен за <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Копче „Избриши“"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Копче „Внеси“"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Итен повик"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Заборавив шема"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешна шема"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Кодот е прифатен!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Нема услуга."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Копче за префрање метод на внес."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Режим на работа во авион"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не е препознаено"</string> </resources> diff --git a/packages/Keyguard/res/values-ml-rIN/strings.xml b/packages/Keyguard/res/values-ml-rIN/strings.xml index f39a6b7..509491f 100644 --- a/packages/Keyguard/res/values-ml-rIN/strings.xml +++ b/packages/Keyguard/res/values-ml-rIN/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g>-ന് അടുത്ത അലാറം സജ്ജീകരിച്ചു"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ഇല്ലാതാക്കുക"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"അടിയന്തര കോൾ"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"പാറ്റേൺ മറന്നു"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"പാറ്റേൺ തെറ്റാണ്"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"പാസ്വേഡ് തെറ്റാണ്"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"കോഡ് അംഗികരിച്ചു!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"സേവനമൊന്നുമില്ല."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ടൈപ്പുചെയ്യൽ രീതി ബട്ടൺ മാറുക."</string> + <string name="airplane_mode" msgid="3122107900897202805">"ഫ്ലൈറ്റ് മോഡ്"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"തിരിച്ചറിഞ്ഞില്ല"</string> </resources> diff --git a/packages/Keyguard/res/values-mn-rMN/strings.xml b/packages/Keyguard/res/values-mn-rMN/strings.xml index 2f24901..6426d9e 100644 --- a/packages/Keyguard/res/values-mn-rMN/strings.xml +++ b/packages/Keyguard/res/values-mn-rMN/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Дараагийн сэрүүлгийг <xliff:g id="ALARM">%1$s</xliff:g>-д тохируулсан"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Устгах"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Оруулах"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Яаралтай дуудлага"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Хээг мартсан"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Буруу хээ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Нууц үг буруу"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Код зөвшөөрөгдлөө!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Үйлчилгээ байхгүй."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Оруулах аргыг сэлгэх товч."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Нислэгийн горим"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Танигдахгүй байна"</string> </resources> diff --git a/packages/Keyguard/res/values-mr-rIN/strings.xml b/packages/Keyguard/res/values-mr-rIN/strings.xml index a86bf60..6d40958 100644 --- a/packages/Keyguard/res/values-mr-rIN/strings.xml +++ b/packages/Keyguard/res/values-mr-rIN/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"पुढील अलार्म <xliff:g id="ALARM">%1$s</xliff:g> साठी सेट केला"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"हटवा"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"प्रविष्ट करा"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"आणीबाणीचा कॉल"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"नमुना विसरलात"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"चुकीचा नमुना"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"चुकीचा संकेतशब्द"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"कोड स्वीकारला!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"सेवा नाही."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"इनपुट पद्धत स्विच करा बटण."</string> + <string name="airplane_mode" msgid="3122107900897202805">"विमान मोड"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ओळखले नाही"</string> </resources> diff --git a/packages/Keyguard/res/values-ms-rMY/strings.xml b/packages/Keyguard/res/values-ms-rMY/strings.xml index 3d4dee4..53151be 100644 --- a/packages/Keyguard/res/values-ms-rMY/strings.xml +++ b/packages/Keyguard/res/values-ms-rMY/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Penggera seterusnya ditetapkan pada <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Padam"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Masuk"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Panggilan kecemasan"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Lupa Corak"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Corak Salah"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Kata Laluan Salah"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kod Diterima!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Tiada perkhidmatan."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Butang tukar kaedah input."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Mod Pesawat"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Tidak dicam"</string> </resources> diff --git a/packages/Keyguard/res/values-my-rMM/strings.xml b/packages/Keyguard/res/values-my-rMM/strings.xml index 4432ceb..69498ed 100644 --- a/packages/Keyguard/res/values-my-rMM/strings.xml +++ b/packages/Keyguard/res/values-my-rMM/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> အတွက် နောက် သတိပေးရန် သတ်မှတ်ချက်"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ဖျက်ရန်ခလုတ်"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enterခလုတ်"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"အရေးပေါ် ခေါ်ဆိုမှု"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ပုံဖော်မှုအား မေ့လျော့ခြင်း"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"ပုံဆွဲအမှား"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"စကားဝှက်အမှား"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"ကုဒ်နံပါတ်ကို လက်ခံလိုက်ပါသည်"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"ဆားဗစ် မရှိပါ"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ထည့်သွင်းခြင်းခလုတ်အား ပြောင်းခြင်း"</string> + <string name="airplane_mode" msgid="3122107900897202805">"လေယာဉ်ပေါ်သုံးစနစ်"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"အသိအမှတ်မပြုပါ"</string> </resources> diff --git a/packages/Keyguard/res/values-nb/strings.xml b/packages/Keyguard/res/values-nb/strings.xml index efc25cf..454729e 100644 --- a/packages/Keyguard/res/values-nb/strings.xml +++ b/packages/Keyguard/res/values-nb/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Neste alarm er innstilt for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Slett"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Nødnummer"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Har du glemt mønsteret?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Feil mønster"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Feil passord"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koden er godkjent."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ingen tjeneste."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Bytt knapp for inndatametode."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Flymodus"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Ikke gjenkjent"</string> </resources> diff --git a/packages/Keyguard/res/values-ne-rNP/strings.xml b/packages/Keyguard/res/values-ne-rNP/strings.xml index 7f6843a..3fc8339 100644 --- a/packages/Keyguard/res/values-ne-rNP/strings.xml +++ b/packages/Keyguard/res/values-ne-rNP/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> को लागि अर्को चेतावनी सेट"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"मेट्नुहोस्"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"प्रविष्टि गर्नुहोस्"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"आपतकालीन कल"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ढाँचा बिर्सनु भयो"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"गलत ढाँचा"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"गलत पासवर्ड"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"कोड स्वीकृत!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"कुनै सेवा छैन।"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"इनपुट विधि बटन स्विच गर्नुहोस्।"</string> + <string name="airplane_mode" msgid="3122107900897202805">"हवाइजहाज मोड"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"चिनिएको छैन"</string> </resources> diff --git a/packages/Keyguard/res/values-nl/strings.xml b/packages/Keyguard/res/values-nl/strings.xml index 3a8d91c..dad2fff 100644 --- a/packages/Keyguard/res/values-nl/strings.xml +++ b/packages/Keyguard/res/values-nl/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Volgende alarm ingesteld voor <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Noodoproep"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Patroon vergeten"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Onjuist patroon"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Onjuist wachtwoord"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Code geaccepteerd."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Geen service"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Knop voor wijzigen invoermethode."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Vliegtuigmodus"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Niet herkend"</string> </resources> diff --git a/packages/Keyguard/res/values-pl/strings.xml b/packages/Keyguard/res/values-pl/strings.xml index 40cd5e6..cb2b211 100644 --- a/packages/Keyguard/res/values-pl/strings.xml +++ b/packages/Keyguard/res/values-pl/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Następny alarm ustawiono na <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Połączenie alarmowe"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nie pamiętam wzoru"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Nieprawidłowy wzór"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nieprawidłowe hasło"</string> @@ -113,4 +112,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kod został zaakceptowany."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Brak usługi."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Przycisk przełączania metody wprowadzania."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Tryb samolotowy"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nie rozpoznano"</string> </resources> diff --git a/packages/Keyguard/res/values-pt-rPT/strings.xml b/packages/Keyguard/res/values-pt-rPT/strings.xml index 9068898..dcd5ca7 100644 --- a/packages/Keyguard/res/values-pt-rPT/strings.xml +++ b/packages/Keyguard/res/values-pt-rPT/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próximo alarme definido para as <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Chamada de emergência"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueceu-se da Sequência"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Sequência Incorreta"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Palavra-passe Incorreta"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceite!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Sem serviço."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Alternar botão de método de introdução."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Modo de avião"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Não reconhecido"</string> </resources> diff --git a/packages/Keyguard/res/values-pt/strings.xml b/packages/Keyguard/res/values-pt/strings.xml index 690b693..09cbe14 100644 --- a/packages/Keyguard/res/values-pt/strings.xml +++ b/packages/Keyguard/res/values-pt/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Próximo alarme definido para <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Excluir"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Chamada de emergência"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Esqueci o padrão"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Padrão incorreto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Senha incorreta"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Código aceito."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Sem serviço."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Alterar botão do método de entrada."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Modo avião"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Não reconhecido"</string> </resources> diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml index 0c11689..01e5de2 100644 --- a/packages/Keyguard/res/values-ro/strings.xml +++ b/packages/Keyguard/res/values-ro/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Următoarea alarmă este setată la <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ștergeţi"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Apel de urgenţă"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Model uitat"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Model greşit"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Parolă greşită"</string> @@ -111,4 +110,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Cod acceptat!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Fără serviciu."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Buton pentru comutarea metodei de introducere."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Mod Avion"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nu este recunoscută"</string> </resources> diff --git a/packages/Keyguard/res/values-ru/strings.xml b/packages/Keyguard/res/values-ru/strings.xml index 48fd4f6..e0a0b92 100644 --- a/packages/Keyguard/res/values-ru/strings.xml +++ b/packages/Keyguard/res/values-ru/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Будильник сработает в <xliff:g id="ALARM">%1$s</xliff:g>."</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Клавиша удаления"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Клавиша ввода"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Экстренный вызов"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Забыли графический ключ?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильный графический ключ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Неправильный пароль"</string> @@ -113,4 +112,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Код принят"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Нет сигнала."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Кнопка переключения способа ввода."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Режим полета"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не распознано"</string> </resources> diff --git a/packages/Keyguard/res/values-si-rLK/strings.xml b/packages/Keyguard/res/values-si-rLK/strings.xml index 740b0ea..232f525 100644 --- a/packages/Keyguard/res/values-si-rLK/strings.xml +++ b/packages/Keyguard/res/values-si-rLK/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"<xliff:g id="ALARM">%1$s</xliff:g> ට ඊළඟ සීනුව සකස් කර ඇත"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"මකන්න"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ඇතුල් කරන්න"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"හදිසි ඇමතුම"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"රටාව අමතකයි"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"වැරදි රටාවකි"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"වැරදි මුරපදය"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"කේතය පිළිගැණුනි!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"සේවාව නැත."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ආදාන ක්රමය මාරු කිරීමේ බොත්තම."</string> + <string name="airplane_mode" msgid="3122107900897202805">"ගුවන්යානා ප්රකාරය"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"අඳුනාගත නොහැක"</string> </resources> diff --git a/packages/Keyguard/res/values-sk/strings.xml b/packages/Keyguard/res/values-sk/strings.xml index 2fbe838..4f60141 100644 --- a/packages/Keyguard/res/values-sk/strings.xml +++ b/packages/Keyguard/res/values-sk/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Nasledujúci budík je nastavený na <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Odstrániť"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Tiesňové volanie"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nepamätám si vzor"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Nesprávny vzor"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nesprávne heslo"</string> @@ -113,4 +112,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kód bol prijatý!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Žiadny signál"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Tlačidlo prepnutia metódy vstupu."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Režim v lietadle"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Nebol rozpoznaný"</string> </resources> diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml index a79d99a..9573395 100644 --- a/packages/Keyguard/res/values-sl/strings.xml +++ b/packages/Keyguard/res/values-sl/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Naslednji alarm je nastavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Tipka Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Tipka Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Klic v sili"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Pozabljen vzorec"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Napačen vzorec"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Napačno geslo"</string> @@ -113,4 +112,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koda je sprejeta."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ni storitve."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Gumb za preklop načina vnosa."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Način za letalo"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Neprepoznano"</string> </resources> diff --git a/packages/Keyguard/res/values-sr/strings.xml b/packages/Keyguard/res/values-sr/strings.xml index b7c439b..e888179 100644 --- a/packages/Keyguard/res/values-sr/strings.xml +++ b/packages/Keyguard/res/values-sr/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Следећи аларм је подешен за <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Избриши"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Хитан позив"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Заборављени шаблон"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешан шаблон"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string> @@ -111,4 +110,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Кôд је прихваћен!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Офлајн сте."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Дугме Промени метод уноса."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Режим рада у авиону"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Није препознат"</string> </resources> diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml index 75adc2c..3fa40ff 100644 --- a/packages/Keyguard/res/values-sv/strings.xml +++ b/packages/Keyguard/res/values-sv/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Nästa alarm är inställt på <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Retur"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Nödsamtal"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Har du glömt ditt grafiska lösenord?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Fel grafiskt lösenord"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Fel lösenord"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Koden godkändes!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ingen tjänst."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Knapp för byte av inmatningsmetod."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Flygplansläge"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Identifierades inte"</string> </resources> diff --git a/packages/Keyguard/res/values-sw/strings.xml b/packages/Keyguard/res/values-sw/strings.xml index 886c22e..403d452 100644 --- a/packages/Keyguard/res/values-sw/strings.xml +++ b/packages/Keyguard/res/values-sw/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Kengele inayofuata imewekwa ilie saa <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Futa"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Simu ya dharura"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Umesahau Ruwaza"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Mchoro huo si sahihi"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Nenosiri Lisilo sahihi"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Msimbo Umekubaliwa!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Hakuna huduma."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Swichi kitufe cha mbinu ingizi."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Hali ya ndegeni"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Haitambuliwi"</string> </resources> diff --git a/packages/Keyguard/res/values-ta-rIN/strings.xml b/packages/Keyguard/res/values-ta-rIN/strings.xml index 89c1480..42b00c0 100644 --- a/packages/Keyguard/res/values-ta-rIN/strings.xml +++ b/packages/Keyguard/res/values-ta-rIN/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"அடுத்த அலாரம் <xliff:g id="ALARM">%1$s</xliff:g>க்கு அமைக்கப்பட்டது"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"நீக்கு"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"உள்ளிடு"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"அவசரகால அழைப்பு"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"வடிவத்தை மறந்துவிட்டீர்களா"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"தவறான வடிவம்"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"தவறான கடவுச்சொல்"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"குறியீடு ஏற்கப்பட்டது!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"சேவை இல்லை."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"உள்ளீட்டு முறையை மாற்றும் பொத்தான்."</string> + <string name="airplane_mode" msgid="3122107900897202805">"விமானப் பயன்முறை"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"அறியப்படவில்லை"</string> </resources> diff --git a/packages/Keyguard/res/values-te-rIN/strings.xml b/packages/Keyguard/res/values-te-rIN/strings.xml index 2f51742..9d9a70a 100644 --- a/packages/Keyguard/res/values-te-rIN/strings.xml +++ b/packages/Keyguard/res/values-te-rIN/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"తదుపరి అలారం <xliff:g id="ALARM">%1$s</xliff:g>కి సెట్ చేయబడింది"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"తొలగించు"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"అత్యవసర కాల్"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"నమూనాను మర్చిపోయాను"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"నమూనా తప్పు"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"పాస్వర్డ్ తప్పు"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"కోడ్ ఆమోదించబడింది!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"సేవ లేదు."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ఇన్పుట్ పద్ధతి మార్చే బటన్."</string> + <string name="airplane_mode" msgid="3122107900897202805">"ఎయిర్ప్లైన్ మోడ్"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"గుర్తించలేదు"</string> </resources> diff --git a/packages/Keyguard/res/values-th/strings.xml b/packages/Keyguard/res/values-th/strings.xml index 6d0d026..36e82af 100644 --- a/packages/Keyguard/res/values-th/strings.xml +++ b/packages/Keyguard/res/values-th/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"ตั้งเวลาปลุกครั้งถัดไปไว้ที่ <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ลบ"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"ป้อน"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"หมายเลขฉุกเฉิน"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ลืมรูปแบบใช่หรือไม่"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"รูปแบบไม่ถูกต้อง"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"รหัสผ่านไม่ถูกต้อง"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"รหัสได้รับการยอมรับ!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"ไม่มีบริการ"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ปุ่มสลับวิธีการป้อนข้อมูล"</string> + <string name="airplane_mode" msgid="3122107900897202805">"โหมดบนเครื่องบิน"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"ไม่รู้จัก"</string> </resources> diff --git a/packages/Keyguard/res/values-tl/strings.xml b/packages/Keyguard/res/values-tl/strings.xml index 8125efe..eabebb4 100644 --- a/packages/Keyguard/res/values-tl/strings.xml +++ b/packages/Keyguard/res/values-tl/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Nakatakda ang susunod na alarm para sa <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Tanggalin"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Emergency na tawag"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Nakalimutan ang Pattern"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Maling Pattern"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Maling Password"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Tinanggap ang Code!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Walang serbisyo."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Ilipat ang button na pamamaraan ng pag-input."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Airplane mode"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Hindi nakilala"</string> </resources> diff --git a/packages/Keyguard/res/values-tr/strings.xml b/packages/Keyguard/res/values-tr/strings.xml index aa32baa..14c9d22 100644 --- a/packages/Keyguard/res/values-tr/strings.xml +++ b/packages/Keyguard/res/values-tr/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Sonraki alarm <xliff:g id="ALARM">%1$s</xliff:g> için ayarlandı"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Sil"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Giriş"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Acil durum çağrısı"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Deseni Unuttunuz mu?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Yanlış Desen"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Yanlış Şifre"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kod Kabul Edildi!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Hizmet yok."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Giriş yöntemini değiştirme düğmesi."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Uçak modu"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Tanınmadı"</string> </resources> diff --git a/packages/Keyguard/res/values-uk/strings.xml b/packages/Keyguard/res/values-uk/strings.xml index 9e52283..fdff8c6 100644 --- a/packages/Keyguard/res/values-uk/strings.xml +++ b/packages/Keyguard/res/values-uk/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Наступний сигнал: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Екстрений виклик"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Не пам’ятаю ключ"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Неправильний ключ"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Неправильний пароль"</string> @@ -113,4 +112,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Код прийнято."</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Зв’язку немає."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Кнопка перемикання методу введення."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Режим польоту"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Не розпізнано"</string> </resources> diff --git a/packages/Keyguard/res/values-ur-rPK/strings.xml b/packages/Keyguard/res/values-ur-rPK/strings.xml index 5cd54c0..29b2d5b 100644 --- a/packages/Keyguard/res/values-ur-rPK/strings.xml +++ b/packages/Keyguard/res/values-ur-rPK/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"اگلا الارم <xliff:g id="ALARM">%1$s</xliff:g> کیلئے سیٹ ہے"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"حذف کریں"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"ہنگامی کال"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"پیٹرن بھول گئے"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"غلط پیٹرن"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"غلط پاس ورڈ"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"کوڈ قبول کر لیا گیا!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"کوئی سروس نہیں ہے۔"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"اندراج کا طریقہ سوئچ کرنے کا بٹن۔"</string> + <string name="airplane_mode" msgid="3122107900897202805">"ہوائی جہاز وضع"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"تسلیم شدہ نہیں ہے"</string> </resources> diff --git a/packages/Keyguard/res/values-uz-rUZ/strings.xml b/packages/Keyguard/res/values-uz-rUZ/strings.xml index a6852a7..c522a46 100644 --- a/packages/Keyguard/res/values-uz-rUZ/strings.xml +++ b/packages/Keyguard/res/values-uz-rUZ/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Keyingi uyg‘otkich <xliff:g id="ALARM">%1$s</xliff:g> uchun o‘rnatildi"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"O‘chirish"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Kiritish"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Favqulodda qo‘ng‘iroq"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Chizmali parol unutilgan"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Xato chizma paroli"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Xato parol"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Kod qabul qilindi!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Aloqa yo‘q."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Kiritish uslubi tugmasini almashtirish."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Parvoz rejimi"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Aniqlanmadi"</string> </resources> diff --git a/packages/Keyguard/res/values-vi/strings.xml b/packages/Keyguard/res/values-vi/strings.xml index 5727900..7e48d57 100644 --- a/packages/Keyguard/res/values-vi/strings.xml +++ b/packages/Keyguard/res/values-vi/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Báo thức tiếp theo được đặt cho <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Xóa"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Cuộc gọi khẩn cấp"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Đã quên hình"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Hình sai"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Mật khẩu sai"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Mã được chấp nhận!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Không có dịch vụ."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Nút chuyển phương thức nhập."</string> + <string name="airplane_mode" msgid="3122107900897202805">"Chế độ trên máy bay"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Không nhận dạng được"</string> </resources> diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml index a93b54b..ee11122 100644 --- a/packages/Keyguard/res/values-zh-rCN/strings.xml +++ b/packages/Keyguard/res/values-zh-rCN/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"下次闹钟时间已设置为<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"紧急呼救"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘记了图案"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"图案错误"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"密码错误"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"代码正确!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"无服务。"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"输入法切换按钮。"</string> + <string name="airplane_mode" msgid="3122107900897202805">"飞行模式"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"无法识别"</string> </resources> diff --git a/packages/Keyguard/res/values-zh-rHK/strings.xml b/packages/Keyguard/res/values-zh-rHK/strings.xml index 55a6a5e..f1310b0 100644 --- a/packages/Keyguard/res/values-zh-rHK/strings.xml +++ b/packages/Keyguard/res/values-zh-rHK/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"已設定下一個鬧鐘時間:<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"刪除"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 鍵"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"緊急電話"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖案"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"圖案錯誤"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"密碼正確!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"沒有服務。"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"切換輸入法按鈕。"</string> + <string name="airplane_mode" msgid="3122107900897202805">"飛航模式"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"未能辨別"</string> </resources> diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml index 66c665f..88945e5 100644 --- a/packages/Keyguard/res/values-zh-rTW/strings.xml +++ b/packages/Keyguard/res/values-zh-rTW/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"已設定下一個鬧鐘時間:<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Delete 鍵"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter 鍵"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"緊急電話"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"忘記圖形"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"圖形錯誤"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"密碼錯誤"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"密碼正確!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"沒有服務。"</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"切換輸入法按鈕。"</string> + <string name="airplane_mode" msgid="3122107900897202805">"飛航模式"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"無法識別"</string> </resources> diff --git a/packages/Keyguard/res/values-zu/strings.xml b/packages/Keyguard/res/values-zu/strings.xml index be8900a..eaf6fd5 100644 --- a/packages/Keyguard/res/values-zu/strings.xml +++ b/packages/Keyguard/res/values-zu/strings.xml @@ -56,7 +56,6 @@ <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"I-alamu elandelayo esethelwe i-<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Susa"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Faka"</string> - <string name="kg_emergency_call_label" msgid="684946192523830531">"Ucingo lwezimo eziphuthumayo"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Ukhohlwe iphethini?"</string> <string name="kg_wrong_pattern" msgid="1850806070801358830">"Iphatheni engalungile"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Iphasiwedi engalungile"</string> @@ -109,4 +108,6 @@ <string name="kg_pin_accepted" msgid="1448241673570020097">"Ikhodi yamukelwe!"</string> <string name="keyguard_carrier_default" msgid="8700650403054042153">"Ayikho isevisi."</string> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Vula indlela yokungena yenkinobho"</string> + <string name="airplane_mode" msgid="3122107900897202805">"Isimo sendiza"</string> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Akubonwa"</string> </resources> diff --git a/packages/Keyguard/res/values/strings.xml b/packages/Keyguard/res/values/strings.xml index 5047330..e060b4a 100644 --- a/packages/Keyguard/res/values/strings.xml +++ b/packages/Keyguard/res/values/strings.xml @@ -122,8 +122,6 @@ <!-- Description of the Enter button in a KeyboardView. [CHAR LIMIT=NONE] --> <string name="keyboardview_keycode_enter">Enter</string> - <!-- Label shown on emergency call button in keyguard --> - <string name="kg_emergency_call_label">Emergency call</string> <!-- Message shown in pattern unlock after some number of unsuccessful attempts --> <string name="kg_forgot_pattern_button_text">Forgot Pattern</string> <!-- Message shown when user enters wrong pattern --> @@ -300,4 +298,10 @@ <!-- Content description of the switch input method button for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_ime_switch_button" msgid="5032926134740456424">Switch input method button.</string> + <!-- Description of airplane mode --> + <string name="airplane_mode">Airplane mode</string> + + <!-- Fingerprint hint message when finger was not recognized.--> + <string name="fingerprint_not_recognized">Not recognized</string> + </resources> diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java index 7d0b81d..4fbcc1e 100644 --- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java +++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java @@ -35,6 +35,7 @@ import android.widget.TextView; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.TelephonyIntents; +import com.android.settingslib.WirelessUtils; public class CarrierText extends TextView { private static final boolean DEBUG = KeyguardConstants.DEBUG; @@ -146,6 +147,9 @@ public class CarrierText extends TextView { getContext().getText(R.string.keyguard_missing_sim_message_short), text); } } + if (WirelessUtils.isAirplaneModeOn(mContext)) { + displayText = getContext().getString(R.string.airplane_mode); + } setText(displayText); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java index a88497c..be71b034 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java @@ -23,6 +23,7 @@ import android.content.res.Resources; import android.graphics.Canvas; import android.media.AudioManager; import android.os.SystemClock; +import android.service.trust.TrustAgentService; import android.telephony.TelephonyManager; import android.util.AttributeSet; import android.util.Log; @@ -69,14 +70,27 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { } @Override - public void onTrustInitiatedByUser(int userId) { + public void onTrustGrantedWithFlags(int flags, int userId) { if (userId != mLockPatternUtils.getCurrentUser()) return; if (!isAttachedToWindow()) return; - - if (isVisibleToUser()) { - dismiss(false /* authenticated */); - } else { - mViewMediatorCallback.playTrustedSound(); + boolean bouncerVisible = isVisibleToUser(); + boolean initiatedByUser = + (flags & TrustAgentService.FLAG_GRANT_TRUST_INITIATED_BY_USER) != 0; + boolean dismissKeyguard = + (flags & TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD) != 0; + + if (initiatedByUser || dismissKeyguard) { + if (mViewMediatorCallback.isScreenOn() && (bouncerVisible || dismissKeyguard)) { + if (!bouncerVisible) { + // The trust agent dismissed the keyguard without the user proving + // that they are present (by swiping up to show the bouncer). That's fine if + // the user proved presence via some other way to the trust agent. + Log.i(TAG, "TrustAgent dismissed Keyguard."); + } + dismiss(false /* authenticated */); + } else { + mViewMediatorCallback.playTrustedSound(); + } } } }; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index c9805ae..1eec532 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -16,6 +16,7 @@ package com.android.keyguard; +import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AlarmManager; import android.app.IUserSwitchObserver; @@ -53,10 +54,11 @@ import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; -import android.service.fingerprint.FingerprintManager; -import android.service.fingerprint.FingerprintManager.AuthenticationCallback; -import android.service.fingerprint.FingerprintUtils; -import android.service.fingerprint.FingerprintManager.AuthenticationResult; +import android.hardware.fingerprint.FingerprintManager; +import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback; +import android.hardware.fingerprint.FingerprintUtils; +import android.hardware.fingerprint.FingerprintManager.AuthenticationResult; +import android.service.trust.TrustAgentService; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; @@ -115,8 +117,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_FINGERPRINT_AUTHENTICATED = 323; private static final int MSG_FINGERPRINT_ERROR = 324; private static final int MSG_FINGERPRINT_HELP = 325; - private static final int MSG_FACE_UNLOCK_STATE_CHANGED = 326; - private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 327; + private static final int MSG_FINGERPRINT_AUTH_FAILED = 326; + private static final int MSG_FACE_UNLOCK_STATE_CHANGED = 327; + private static final int MSG_SIM_SUBSCRIPTION_INFO_CHANGED = 328; private static KeyguardUpdateMonitor sInstance; @@ -149,6 +152,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mScreenOn; private SubscriptionManager mSubscriptionManager; private List<SubscriptionInfo> mSubscriptionInfo; + private boolean mFingerprintDetectionRunning; private final Handler mHandler = new Handler() { @Override @@ -214,6 +218,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { case MSG_FINGERPRINT_ERROR: handleFingerprintError(msg.arg1 /* msgId */, (String) msg.obj /* errString */); break; + case MSG_FINGERPRINT_AUTH_FAILED: + handleFingerprintAuthFailed(); + break; case MSG_FACE_UNLOCK_STATE_CHANGED: handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2); break; @@ -238,15 +245,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private SparseBooleanArray mUserFaceUnlockRunning = new SparseBooleanArray(); @Override - public void onTrustChanged(boolean enabled, int userId, boolean initiatedByUser) { + public void onTrustChanged(boolean enabled, int userId, int flags) { mUserHasTrust.put(userId, enabled); - for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { cb.onTrustChanged(userId); - if (enabled && initiatedByUser) { - cb.onTrustInitiatedByUser(userId); + if (enabled && flags != 0) { + cb.onTrustGrantedWithFlags(flags, userId); } } } @@ -331,28 +337,36 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } - private void handleFingerprintAuthenticated(int fingerId, int groupId) { - if (fingerId == 0) return; // not a valid fingerprint + private void handleFingerprintAuthFailed() { + // FingerprintManager will allow us to retry a few times before finally giving up. + // TODO: Figure out the proper logic to stop this call when max tries is reached. + handleFingerprintHelp(-1, mContext.getString(R.string.fingerprint_not_recognized)); + } - final int userId; + private void handleFingerprintAuthenticated(int fingerId, int groupId) { try { - userId = ActivityManagerNative.getDefault().getCurrentUser().id; - } catch (RemoteException e) { - Log.e(TAG, "Failed to get current user id: ", e); - return; - } - if (isFingerprintDisabled(userId)) { - Log.d(TAG, "Fingerprint disabled by DPM for userId: " + userId); - return; - } - final ContentResolver res = mContext.getContentResolver(); - final int ids[] = FingerprintUtils.getFingerprintIdsForUser(res, userId); - for (int i = 0; i < ids.length; i++) { - // TODO: fix once HAL supports storing group id - final boolean isCorrectUser = true || (groupId == userId); - if (ids[i] == fingerId && isCorrectUser) { - onFingerprintAuthenticated(userId); + final int userId; + try { + userId = ActivityManagerNative.getDefault().getCurrentUser().id; + } catch (RemoteException e) { + Log.e(TAG, "Failed to get current user id: ", e); + return; + } + if (isFingerprintDisabled(userId)) { + Log.d(TAG, "Fingerprint disabled by DPM for userId: " + userId); + return; + } + final ContentResolver res = mContext.getContentResolver(); + final int ids[] = FingerprintUtils.getFingerprintIdsForUser(res, userId); + for (int i = 0; i < ids.length; i++) { + // TODO: fix once HAL supports storing group id + final boolean isCorrectUser = true || (groupId == userId); + if (ids[i] == fingerId && isCorrectUser) { + onFingerprintAuthenticated(userId); + } } + } finally { + setFingerprintRunningDetectionRunning(false); } } @@ -366,6 +380,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } private void handleFingerprintError(int msgId, String errString) { + setFingerprintRunningDetectionRunning(false); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -374,6 +389,21 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } + private void setFingerprintRunningDetectionRunning(boolean running) { + if (running != mFingerprintDetectionRunning) { + mFingerprintDetectionRunning = running; + notifyFingerprintRunningStateChanged(); + } + } + + private void notifyFingerprintRunningStateChanged() { + for (int i = 0; i < mCallbacks.size(); i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onFingerprintRunningStateChanged(mFingerprintDetectionRunning); + } + } + } private void handleFaceUnlockStateChanged(boolean running, int userId) { mUserFaceUnlockRunning.put(userId, running); for (int i = 0; i < mCallbacks.size(); i++) { @@ -388,6 +418,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return mUserFaceUnlockRunning.get(userId); } + public boolean isFingerprintDetectionRunning() { + return mFingerprintDetectionRunning; + } + private boolean isTrustDisabled(int userId) { // Don't allow trust agent if device is secured with a SIM PIN. This is here // mainly because there's no other way to prompt the user to enter their SIM PIN @@ -487,6 +521,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { = new AuthenticationCallback() { @Override + public void onAuthenticationFailed() { + mHandler.obtainMessage(MSG_FINGERPRINT_AUTH_FAILED).sendToTarget(); + }; + + @Override public void onAuthenticationSucceeded(AuthenticationResult result) { mHandler.obtainMessage(MSG_FINGERPRINT_AUTHENTICATED, result.getFingerprint().getFingerId(), @@ -630,7 +669,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { cb.onScreenTurnedOn(); } } - startListeningForFingerprint(mContext); + startListeningForFingerprint(); } protected void handleScreenTurnedOff(int arg1) { @@ -715,12 +754,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHING, newUserId, 0, reply)); mSwitchingUser = true; + stopListeningForFingerprint(); } @Override public void onUserSwitchComplete(int newUserId) throws RemoteException { mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCH_COMPLETE, newUserId, 0)); mSwitchingUser = false; + startListeningForFingerprint(); + } + @Override + public void onForegroundProfileSwitch(int newProfileId) { + // Ignore. } }); } catch (RemoteException e) { @@ -732,24 +777,30 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { trustManager.registerTrustListener(this); mFpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); - startListeningForFingerprint(context); + startListeningForFingerprint(); } - private void startListeningForFingerprint(Context context) { - if (mFpm != null && mFpm.isHardwareDetected()) { - if (mFingerprintCancelSignal == null) { - mFingerprintCancelSignal = new CancellationSignal(); - } else { + private void startListeningForFingerprint() { + if (DEBUG) Log.v(TAG, "startListeningForFingerprint()"); + int userId = ActivityManager.getCurrentUser(); + if (mFpm != null && mFpm.isHardwareDetected() && !isFingerprintDisabled(userId) + && mFpm.getEnrolledFingerprints(userId).size() > 0) { + if (mFingerprintCancelSignal != null) { mFingerprintCancelSignal.cancel(); } - mFpm.authenticate(null, mAuthenticationCallback, mFingerprintCancelSignal, 0); + mFingerprintCancelSignal = new CancellationSignal(); + mFpm.authenticate(null, mFingerprintCancelSignal, mAuthenticationCallback, 0, userId); + setFingerprintRunningDetectionRunning(true); } } - private void stopListeningForFingerprint() { - if (mFingerprintCancelSignal != null) { + public void stopListeningForFingerprint() { + if (DEBUG) Log.v(TAG, "stopListeningForFingerprint()"); + if (isFingerprintDetectionRunning()) { mFingerprintCancelSignal.cancel(); + mFingerprintCancelSignal = null; } + setFingerprintRunningDetectionRunning(false); } private boolean isDeviceProvisionedInSettingsDb() { diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index c2462e0..26e6973 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -19,7 +19,7 @@ import android.app.admin.DevicePolicyManager; import android.graphics.Bitmap; import android.media.AudioManager; import android.os.SystemClock; -import android.service.fingerprint.FingerprintManager; +import android.hardware.fingerprint.FingerprintManager; import android.telephony.TelephonyManager; import android.view.WindowManagerPolicy; @@ -171,9 +171,9 @@ public class KeyguardUpdateMonitorCallback { public void onTrustManagedChanged(int userId) { } /** - * Called when the user has proved to a trust agent that they want to use the device. + * Called after trust was granted with non-zero flags. */ - public void onTrustInitiatedByUser(int userId) { } + public void onTrustGrantedWithFlags(int flags, int userId) { } /** * Called when a fingerprint is recognized. @@ -200,4 +200,9 @@ public class KeyguardUpdateMonitorCallback { * Called when the state of face unlock changed. */ public void onFaceUnlockStateChanged(boolean running, int userId) { } + + /** + * Called when the fingerprint running state changed. + */ + public void onFingerprintRunningStateChanged(boolean running) { } } diff --git a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java index 5bbcc8c..f5c809a 100644 --- a/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/ViewMediatorCallback.java @@ -76,4 +76,9 @@ public interface ViewMediatorCallback { * (legacy API) */ boolean isInputRestricted(); + + /** + * @return true if the screen is on + */ + boolean isScreenOn(); } diff --git a/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java index e6a0dd7..b8f16e7 100644 --- a/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java +++ b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java @@ -38,7 +38,7 @@ public class SampleTrustAgent extends TrustAgentService * <pre> * $ adb shell am broadcast -a action.sample_trust_agent.grant_trust\ * -e extra.message SampleTrust\ - * --el extra.duration 1000 --ez extra.init_by_user false + * --el extra.duration 1000 --ez extra.init_by_user false --ez extra.dismiss_keyguard false * </pre> */ private static final boolean ALLOW_EXTERNAL_BROADCASTS = false; @@ -51,6 +51,7 @@ public class SampleTrustAgent extends TrustAgentService private static final String EXTRA_MESSAGE = "extra.message"; private static final String EXTRA_DURATION = "extra.duration"; private static final String EXTRA_INITIATED_BY_USER = "extra.init_by_user"; + private static final String EXTRA_DISMISS_KEYGUARD = "extra.dismiss_keyguard"; private static final String PREFERENCE_REPORT_UNLOCK_ATTEMPTS = "preference.report_unlock_attempts"; @@ -141,10 +142,17 @@ public class SampleTrustAgent extends TrustAgentService public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_GRANT_TRUST.equals(action)) { + int flags = 0; + if (intent.getBooleanExtra(EXTRA_INITIATED_BY_USER, false)) { + flags |= TrustAgentService.FLAG_GRANT_TRUST_INITIATED_BY_USER; + } + if (intent.getBooleanExtra(EXTRA_DISMISS_KEYGUARD, false)) { + flags |= TrustAgentService.FLAG_GRANT_TRUST_DISMISS_KEYGUARD; + } + try { grantTrust(intent.getStringExtra(EXTRA_MESSAGE), - intent.getLongExtra(EXTRA_DURATION, 0), - intent.getBooleanExtra(EXTRA_INITIATED_BY_USER, false)); + intent.getLongExtra(EXTRA_DURATION, 0), flags); } catch (IllegalStateException e) { logAndShowToast("IllegalStateException: " + e.getMessage()); } diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java b/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java new file mode 100644 index 0000000..60b5ba5 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/applications/PermissionsInfo.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settingslib.applications; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PermissionGroupInfo; +import android.content.pm.PermissionInfo; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.ShapeDrawable; +import android.os.AsyncTask; +import android.os.Build; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.ArrayMap; +import android.util.Log; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class PermissionsInfo { + + private static final String TAG = "PermissionsInfo"; + + private final PackageManager mPm; + private final ArrayList<PermissionGroup> mGroups = new ArrayList<>(); + private final Map<String, PermissionGroup> mGroupLookup = new ArrayMap<>(); + private final Callback mCallback; + private final Context mContext; + // Count of apps that request runtime permissions. + private int mRuntimePermAppsCt; + // Count of apps that are granted runtime permissions. + private int mRuntimePermAppsGrantedCt; + + public PermissionsInfo(Context context, Callback callback) { + mContext = context; + mPm = context.getPackageManager(); + mCallback = callback; + new PermissionsLoader().execute(); + } + + public List<PermissionGroup> getGroups() { + synchronized (mGroups) { + return new ArrayList<>(mGroups); + } + } + + public int getRuntimePermAppsCount() { + return mRuntimePermAppsCt; + } + + public int getRuntimePermAppsGrantedCount() { + return mRuntimePermAppsGrantedCt; + } + + private PermissionGroup getOrCreateGroup(String permission) { + PermissionGroup group = mGroupLookup.get(permission); + if (group == null) { + // Some permissions don't have a group, in that case treat them like a group + // and create their own PermissionGroup (only if they are runtime). + try { + PermissionInfo info = mPm.getPermissionInfo(permission, 0); + if (info.protectionLevel == PermissionInfo.PROTECTION_DANGEROUS) { + group = new PermissionGroup(); + // TODO: Add default permission icon. + group.icon = info.icon != 0 ? info.loadIcon(mPm) : new ShapeDrawable(); + group.name = info.name; + group.label = info.loadLabel(mPm).toString(); + mGroups.add(group); + mGroupLookup.put(permission, group); + } + } catch (NameNotFoundException e) { + Log.w(TAG, "Unknown permission " + permission, e); + } + } + return group; + } + + private class PermissionsLoader extends AsyncTask<Void, Void, Void> { + + @Override + protected Void doInBackground(Void... params) { + List<PermissionGroupInfo> groups = + mPm.getAllPermissionGroups(PackageManager.GET_META_DATA); + // Get the groups. + for (PermissionGroupInfo groupInfo : groups) { + PermissionGroup group = new PermissionGroup(); + // TODO: Add default permission icon. + group.icon = groupInfo.icon != 0 ? groupInfo.loadIcon(mPm) : new ShapeDrawable(); + group.name = groupInfo.name; + group.label = groupInfo.loadLabel(mPm).toString(); + synchronized (mGroups) { + mGroups.add(group); + } + } + // Load permissions and which are runtime. + for (PermissionGroup group : mGroups) { + try { + List<PermissionInfo> permissions = + mPm.queryPermissionsByGroup(group.name, 0); + for (PermissionInfo info : permissions) { + if (info.protectionLevel != PermissionInfo.PROTECTION_DANGEROUS) continue; + mGroupLookup.put(info.name, group); + } + } catch (NameNotFoundException e) { + Log.w(TAG, "Problem getting permissions", e); + } + } + // Load granted info. + for (UserHandle user : UserManager.get(mContext).getUserProfiles()) { + List<PackageInfo> allApps = mPm.getInstalledPackages( + PackageManager.GET_PERMISSIONS, user.getIdentifier()); + for (PackageInfo info : allApps) { + if (info.applicationInfo.targetSdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1 + || info.requestedPermissions == null) { + continue; + } + final int N = info.requestedPermissionsFlags.length; + boolean appHasRuntimePerms = false; + boolean appGrantedRuntimePerms = false; + for (int i = 0; i < N; i++) { + boolean granted = (info.requestedPermissionsFlags[i] + & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0; + PermissionGroup group = getOrCreateGroup(info.requestedPermissions[i]); + String key = Integer.toString(info.applicationInfo.uid); + if (group != null && !group.possibleApps.contains(key)) { + appHasRuntimePerms = true; + group.possibleApps.add(key); + if (granted) { + appGrantedRuntimePerms = true; + group.grantedApps.add(key); + } + } + } + if (appHasRuntimePerms) { + mRuntimePermAppsCt++; + if (appGrantedRuntimePerms) { + mRuntimePermAppsGrantedCt++; + } + } + } + } + Collections.sort(mGroups); + + return null; + } + + @Override + protected void onPostExecute(Void result) { + mCallback.onPermissionLoadComplete(); + } + } + + public static class PermissionGroup implements Comparable<PermissionGroup> { + public final List<String> possibleApps = new ArrayList<>(); + public final List<String> grantedApps = new ArrayList<>(); + public String name; + public String label; + public Drawable icon; + + @Override + public int compareTo(PermissionGroup another) { + return label.compareTo(another.label); + } + } + + public interface Callback { + void onPermissionLoadComplete(); + } + +} diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index e1cb878..dd2368f 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -104,6 +104,7 @@ public final class CachedBluetoothDevice implements Comparable<CachedBluetoothDe // See mConnectAttempted private static final long MAX_UUID_DELAY_FOR_AUTO_CONNECT = 5000; + private static final long MAX_HOGP_DELAY_FOR_AUTO_CONNECT = 30000; /** Auto-connect after pairing only if locally initiated. */ private boolean mConnectAfterPairing; @@ -525,19 +526,25 @@ public final class CachedBluetoothDevice implements Comparable<CachedBluetoothDe */ void onUuidChanged() { updateProfiles(); + ParcelUuid[] uuids = mDevice.getUuids(); + + long timeout = MAX_UUID_DELAY_FOR_AUTO_CONNECT; + if (BluetoothUuid.isUuidPresent(uuids, BluetoothUuid.Hogp)) { + timeout = MAX_HOGP_DELAY_FOR_AUTO_CONNECT; + } if (DEBUG) { - Log.e(TAG, "onUuidChanged: Time since last connect" + Log.d(TAG, "onUuidChanged: Time since last connect" + (SystemClock.elapsedRealtime() - mConnectAttempted)); } /* - * If a connect was attempted earlier without any UUID, we will do the - * connect now. + * If a connect was attempted earlier without any UUID, we will do the connect now. + * Otherwise, allow the connect on UUID change. */ if (!mProfiles.isEmpty() - && (mConnectAttempted + MAX_UUID_DELAY_FOR_AUTO_CONNECT) > SystemClock - .elapsedRealtime()) { + && ((mConnectAttempted + timeout) > SystemClock.elapsedRealtime() + || (mConnectAttempted == 0))) { connectWithoutResettingTimer(false); } dispatchAttributesChanged(); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 729efcb..870f043 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -61,10 +61,18 @@ import java.util.List; import java.util.Set; /** - * Database helper class for {@link SettingsProvider}. - * Mostly just has a bit {@link #onCreate} to initialize the database. + * Legacy settings database helper class for {@link SettingsProvider}. + * + * IMPORTANT: Do not add any more upgrade steps here as the global, + * secure, and system settings are no longer stored in a database + * but are kept in memory and persisted to XML. + * + * See: SettingsProvider.UpgradeController#onUpgradeLocked + * + * @deprecated The implementation is frozen. Do not add any new code to this class! */ -public class DatabaseHelper extends SQLiteOpenHelper { +@Deprecated +class DatabaseHelper extends SQLiteOpenHelper { private static final String TAG = "SettingsProvider"; private static final String DATABASE_NAME = "settings.db"; @@ -1932,19 +1940,14 @@ public class DatabaseHelper extends SQLiteOpenHelper { upgradeVersion = 118; } - /** + /* * IMPORTANT: Do not add any more upgrade steps here as the global, * secure, and system settings are no longer stored in a database - * but are kept in memory and persisted to XML. The correct places - * for adding upgrade steps are: + * but are kept in memory and persisted to XML. * - * Global: SettingsProvider.UpgradeController#onUpgradeGlobalSettings - * Secure: SettingsProvider.UpgradeController#onUpgradeSecureSettings - * System: SettingsProvider.UpgradeController#onUpgradeSystemSettings + * See: SettingsProvider.UpgradeController#onUpgradeLocked */ - // *** Remember to update DATABASE_VERSION above! - if (upgradeVersion != currentVersion) { recreateDatabase(db, oldVersion, upgradeVersion, currentVersion); } @@ -2063,7 +2066,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { LockPatternUtils lpu = new LockPatternUtils(mContext); List<LockPatternView.Cell> cellPattern = LockPatternUtils.stringToPattern(lockPattern); - lpu.saveLockPattern(cellPattern); + lpu.saveLockPattern(cellPattern, null); } catch (IllegalArgumentException e) { // Don't want corrupted lock pattern to hang the reboot process } @@ -2386,6 +2389,14 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadIntegerSetting(stmt, Settings.System.POINTER_SPEED, R.integer.def_pointer_speed); + + /* + * IMPORTANT: Do not add any more upgrade steps here as the global, + * secure, and system settings are no longer stored in a database + * but are kept in memory and persisted to XML. + * + * See: SettingsProvider.UpgradeController#onUpgradeLocked + */ } finally { if (stmt != null) stmt.close(); } @@ -2517,6 +2528,14 @@ public class DatabaseHelper extends SQLiteOpenHelper { loadIntegerSetting(stmt, Settings.Secure.SLEEP_TIMEOUT, R.integer.def_sleep_timeout); + + /* + * IMPORTANT: Do not add any more upgrade steps here as the global, + * secure, and system settings are no longer stored in a database + * but are kept in memory and persisted to XML. + * + * See: SettingsProvider.UpgradeController#onUpgradeLocked + */ } finally { if (stmt != null) stmt.close(); } @@ -2693,7 +2712,14 @@ public class DatabaseHelper extends SQLiteOpenHelper { R.bool.def_guest_user_enabled); loadSetting(stmt, Settings.Global.ENHANCED_4G_MODE_ENABLED, ImsConfig.FeatureValueConstants.ON); - // --- New global settings start here + + /* + * IMPORTANT: Do not add any more upgrade steps here as the global, + * secure, and system settings are no longer stored in a database + * but are kept in memory and persisted to XML. + * + * See: SettingsProvider.UpgradeController#onUpgradeLocked + */ } finally { if (stmt != null) stmt.close(); } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 8328d11..0d61606 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -1502,15 +1502,15 @@ public class SettingsProvider extends ContentProvider { public void onPackageRemovedLocked(String packageName, int userId) { final int globalKey = makeKey(SETTINGS_TYPE_GLOBAL, UserHandle.USER_OWNER); SettingsState globalSettings = mSettingsStates.get(globalKey); - globalSettings.onPackageRemovedLocked(packageName); + if (globalSettings != null) globalSettings.onPackageRemovedLocked(packageName); final int secureKey = makeKey(SETTINGS_TYPE_SECURE, userId); SettingsState secureSettings = mSettingsStates.get(secureKey); - secureSettings.onPackageRemovedLocked(packageName); + if (secureSettings != null) secureSettings.onPackageRemovedLocked(packageName); final int systemKey = makeKey(SETTINGS_TYPE_SYSTEM, userId); SettingsState systemSettings = mSettingsStates.get(systemKey); - systemSettings.onPackageRemovedLocked(packageName); + if (systemSettings != null) systemSettings.onPackageRemovedLocked(packageName); } private SettingsState peekSettingsStateLocked(int key) { @@ -1859,40 +1859,43 @@ public class SettingsProvider extends ContentProvider { return getSettingsLocked(SETTINGS_TYPE_SYSTEM, userId); } + /** + * You must perform all necessary mutations to bring the settings + * for this user from the old to the new version. When you add a new + * upgrade step you *must* update SETTINGS_VERSION. + * + * This is an example of moving a setting from secure to global. + * + * // v119: Example settings changes. + * if (currentVersion == 118) { + * if (userId == UserHandle.USER_OWNER) { + * // Remove from the secure settings. + * SettingsState secureSettings = getSecureSettingsLocked(userId); + * String name = "example_setting_to_move"; + * String value = secureSettings.getSetting(name); + * secureSettings.deleteSetting(name); + * + * // Add to the global settings. + * SettingsState globalSettings = getGlobalSettingsLocked(); + * globalSettings.insertSetting(name, value, SettingsState.SYSTEM_PACKAGE_NAME); + * } + * + * // Update the current version. + * currentVersion = 119; + * } + */ private int onUpgradeLocked(int userId, int oldVersion, int newVersion) { if (DEBUG) { Slog.w(LOG_TAG, "Upgrading settings for user: " + userId + " from version: " + oldVersion + " to version: " + newVersion); } - // You must perform all necessary mutations to bring the settings - // for this user from the old to the new version. When you add a new - // upgrade step you *must* update SETTINGS_VERSION. - - /** - * This is an example of moving a setting from secure to global. - * - * int currentVersion = oldVersion; - * if (currentVersion == 118) { - * // Remove from the secure settings. - * SettingsState secureSettings = getSecureSettingsLocked(userId); - * String name = "example_setting_to_move"; - * String value = secureSettings.getSetting(name); - * secureSettings.deleteSetting(name); - * - * // Add to the global settings. - * SettingsState globalSettings = getGlobalSettingsLocked(); - * globalSettings.insertSetting(name, value, SettingsState.SYSTEM_PACKAGE_NAME); - * - * // Update the current version. - * currentVersion = 119; - * } - * - * // Return the current version. - * return currentVersion; - */ - - return SettingsState.VERSION_UNDEFINED; + int currentVersion = oldVersion; + + // vXXX: Add new settings above this point. + + // Return the current version. + return currentVersion; } } } diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 9d16501..35e9636 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -93,6 +93,7 @@ <uses-permission android:name="android.permission.BIND_APPWIDGET" /> <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" /> <uses-permission android:name="android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"/> + <uses-permission android:name="android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS" /> <application android:label="@string/app_label"> <provider diff --git a/packages/StatementService/Android.mk b/packages/StatementService/Android.mk new file mode 100644 index 0000000..470d824 --- /dev/null +++ b/packages/StatementService/Android.mk @@ -0,0 +1,35 @@ +# Copyright (C) 2015 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PROGUARD_FLAG_FILES := proguard.flags + +LOCAL_PACKAGE_NAME := StatementService +LOCAL_PRIVILEGED_MODULE := true + +LOCAL_JAVA_LIBRARIES += org.apache.http.legacy + +LOCAL_STATIC_JAVA_LIBRARIES := \ + libprotobuf-java-nano \ + volley + +include $(BUILD_PACKAGE) + +include $(call all-makefiles-under,$(LOCAL_PATH)/src) diff --git a/packages/StatementService/AndroidManifest.xml b/packages/StatementService/AndroidManifest.xml new file mode 100644 index 0000000..3ee453b --- /dev/null +++ b/packages/StatementService/AndroidManifest.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.statementservice" + android:versionCode="1" + android:versionName="1.0"> + + <uses-permission android:name="android.permission.INTERNET"/> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> + <uses-permission android:name="android.permission.INTENT_FILTER_VERIFICATION_AGENT"/> + + <application + android:label="@string/service_name" + android:allowBackup="false"> + <service + android:name=".DirectStatementService" + android:exported="false"> + <intent-filter> + <category android:name="android.intent.category.DEFAULT"/> + <action android:name="com.android.statementservice.aosp.service.CHECK_ACTION"/> + </intent-filter> + </service> + + <receiver + android:name=".IntentFilterVerificationReceiver" + android:permission="android.permission.BIND_INTENT_FILTER_VERIFIER"> + <!-- Set the priority 1 so newer implementation can have higher priority. --> + <intent-filter + android:priority="1"> + <action android:name="android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION"/> + <data android:mimeType="application/vnd.android.package-archive"/> + </intent-filter> + </receiver> + + </application> + +</manifest> diff --git a/packages/StatementService/proguard.flags b/packages/StatementService/proguard.flags new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/packages/StatementService/proguard.flags diff --git a/packages/StatementService/res/values/strings.xml b/packages/StatementService/res/values/strings.xml new file mode 100644 index 0000000..df6d80b --- /dev/null +++ b/packages/StatementService/res/values/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="service_name">Intent Filter Verification Service</string> +</resources> diff --git a/packages/StatementService/src/com/android/statementservice/DirectStatementService.java b/packages/StatementService/src/com/android/statementservice/DirectStatementService.java new file mode 100644 index 0000000..449738e --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/DirectStatementService.java @@ -0,0 +1,290 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice; + +import android.app.Service; +import android.content.Intent; +import android.net.http.HttpResponseCache; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.Looper; +import android.os.ResultReceiver; +import android.util.Log; + +import com.android.statementservice.retriever.AbstractAsset; +import com.android.statementservice.retriever.AbstractAssetMatcher; +import com.android.statementservice.retriever.AbstractStatementRetriever; +import com.android.statementservice.retriever.AbstractStatementRetriever.Result; +import com.android.statementservice.retriever.AssociationServiceException; +import com.android.statementservice.retriever.Relation; +import com.android.statementservice.retriever.Statement; + +import org.json.JSONException; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; + +/** + * Handles com.android.statementservice.service.CHECK_ALL_ACTION intents. + */ +public final class DirectStatementService extends Service { + private static final String TAG = DirectStatementService.class.getSimpleName(); + + /** + * Returns true if every asset in {@code SOURCE_ASSET_DESCRIPTORS} is associated with {@code + * EXTRA_TARGET_ASSET_DESCRIPTOR} for {@code EXTRA_RELATION} relation. + * + * <p>Takes parameter {@code EXTRA_RELATION}, {@code SOURCE_ASSET_DESCRIPTORS}, {@code + * EXTRA_TARGET_ASSET_DESCRIPTOR}, and {@code EXTRA_RESULT_RECEIVER}. + */ + public static final String CHECK_ALL_ACTION = + "com.android.statementservice.service.CHECK_ALL_ACTION"; + + /** + * Parameter for {@link #CHECK_ALL_ACTION}. + * + * <p>A relation string. + */ + public static final String EXTRA_RELATION = + "com.android.statementservice.service.RELATION"; + + /** + * Parameter for {@link #CHECK_ALL_ACTION}. + * + * <p>An array of asset descriptors in JSON. + */ + public static final String EXTRA_SOURCE_ASSET_DESCRIPTORS = + "com.android.statementservice.service.SOURCE_ASSET_DESCRIPTORS"; + + /** + * Parameter for {@link #CHECK_ALL_ACTION}. + * + * <p>An asset descriptor in JSON. + */ + public static final String EXTRA_TARGET_ASSET_DESCRIPTOR = + "com.android.statementservice.service.TARGET_ASSET_DESCRIPTOR"; + + /** + * Parameter for {@link #CHECK_ALL_ACTION}. + * + * <p>A {@code ResultReceiver} instance that will be used to return the result. If the request + * failed, return {@link #RESULT_FAIL} and an empty {@link android.os.Bundle}. Otherwise, return + * {@link #RESULT_SUCCESS} and a {@link android.os.Bundle} with the result stored in {@link + * #IS_ASSOCIATED}. + */ + public static final String EXTRA_RESULT_RECEIVER = + "com.android.statementservice.service.RESULT_RECEIVER"; + + /** + * A boolean bundle entry that stores the result of {@link #CHECK_ALL_ACTION}. + * This is set only if the service returns with {@code RESULT_SUCCESS}. + * {@code IS_ASSOCIATED} is true if and only if {@code FAILED_SOURCES} is empty. + */ + public static final String IS_ASSOCIATED = "is_associated"; + + /** + * A String ArrayList bundle entry that stores sources that can't be verified. + */ + public static final String FAILED_SOURCES = "failed_sources"; + + /** + * Returned by the service if the request is successfully processed. The caller should check + * the {@code IS_ASSOCIATED} field to determine if the association exists or not. + */ + public static final int RESULT_SUCCESS = 0; + + /** + * Returned by the service if the request failed. The request will fail if, for example, the + * input is not well formed, or the network is not available. + */ + public static final int RESULT_FAIL = 1; + + private static final long HTTP_CACHE_SIZE_IN_BYTES = 1 * 1024 * 1024; // 1 MBytes + private static final String CACHE_FILENAME = "request_cache"; + + private AbstractStatementRetriever mStatementRetriever; + private Handler mHandler; + private HandlerThread mThread; + private HttpResponseCache mHttpResponseCache; + + @Override + public void onCreate() { + mThread = new HandlerThread("DirectStatementService thread", + android.os.Process.THREAD_PRIORITY_BACKGROUND); + mThread.start(); + onCreate(AbstractStatementRetriever.createDirectRetriever(this), mThread.getLooper(), + getCacheDir()); + } + + /** + * Creates a DirectStatementService with the dependencies passed in for easy testing. + */ + public void onCreate(AbstractStatementRetriever statementRetriever, Looper looper, + File cacheDir) { + super.onCreate(); + mStatementRetriever = statementRetriever; + mHandler = new Handler(looper); + + try { + File httpCacheDir = new File(cacheDir, CACHE_FILENAME); + mHttpResponseCache = HttpResponseCache.install(httpCacheDir, HTTP_CACHE_SIZE_IN_BYTES); + } catch (IOException e) { + Log.i(TAG, "HTTPS response cache installation failed:" + e); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mThread != null) { + mThread.quit(); + } + + try { + if (mHttpResponseCache != null) { + mHttpResponseCache.delete(); + } + } catch (IOException e) { + Log.i(TAG, "HTTP(S) response cache deletion failed:" + e); + } + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + super.onStartCommand(intent, flags, startId); + + if (intent == null) { + Log.e(TAG, "onStartCommand called with null intent"); + return START_STICKY; + } + + if (intent.getAction().equals(CHECK_ALL_ACTION)) { + + Bundle extras = intent.getExtras(); + List<String> sources = extras.getStringArrayList(EXTRA_SOURCE_ASSET_DESCRIPTORS); + String target = extras.getString(EXTRA_TARGET_ASSET_DESCRIPTOR); + String relation = extras.getString(EXTRA_RELATION); + ResultReceiver resultReceiver = extras.getParcelable(EXTRA_RESULT_RECEIVER); + + if (resultReceiver == null) { + Log.e(TAG, " Intent does not have extra " + EXTRA_RESULT_RECEIVER); + return START_STICKY; + } + if (sources == null) { + Log.e(TAG, " Intent does not have extra " + EXTRA_SOURCE_ASSET_DESCRIPTORS); + resultReceiver.send(RESULT_FAIL, Bundle.EMPTY); + return START_STICKY; + } + if (target == null) { + Log.e(TAG, " Intent does not have extra " + EXTRA_TARGET_ASSET_DESCRIPTOR); + resultReceiver.send(RESULT_FAIL, Bundle.EMPTY); + return START_STICKY; + } + if (relation == null) { + Log.e(TAG, " Intent does not have extra " + EXTRA_RELATION); + resultReceiver.send(RESULT_FAIL, Bundle.EMPTY); + return START_STICKY; + } + + mHandler.post(new ExceptionLoggingFutureTask<Void>( + new IsAssociatedCallable(sources, target, relation, resultReceiver), TAG)); + } else { + Log.e(TAG, "onStartCommand called with unsupported action: " + intent.getAction()); + } + return START_STICKY; + } + + private class IsAssociatedCallable implements Callable<Void> { + + private List<String> mSources; + private String mTarget; + private String mRelation; + private ResultReceiver mResultReceiver; + + public IsAssociatedCallable(List<String> sources, String target, String relation, + ResultReceiver resultReceiver) { + mSources = sources; + mTarget = target; + mRelation = relation; + mResultReceiver = resultReceiver; + } + + private boolean verifyOneSource(AbstractAsset source, AbstractAssetMatcher target, + Relation relation) throws AssociationServiceException { + Result statements = mStatementRetriever.retrieveStatements(source); + for (Statement statement : statements.getStatements()) { + if (relation.matches(statement.getRelation()) + && target.matches(statement.getTarget())) { + return true; + } + } + return false; + } + + @Override + public Void call() { + Bundle result = new Bundle(); + ArrayList<String> failedSources = new ArrayList<String>(); + AbstractAssetMatcher target; + Relation relation; + try { + target = AbstractAssetMatcher.createMatcher(mTarget); + relation = Relation.create(mRelation); + } catch (AssociationServiceException | JSONException e) { + Log.e(TAG, "isAssociatedCallable failed with exception", e); + mResultReceiver.send(RESULT_FAIL, Bundle.EMPTY); + return null; + } + + boolean allSourcesVerified = true; + for (String sourceString : mSources) { + AbstractAsset source; + try { + source = AbstractAsset.create(sourceString); + } catch (AssociationServiceException e) { + mResultReceiver.send(RESULT_FAIL, Bundle.EMPTY); + return null; + } + + try { + if (!verifyOneSource(source, target, relation)) { + failedSources.add(source.toJson()); + allSourcesVerified = false; + } + } catch (AssociationServiceException e) { + failedSources.add(source.toJson()); + allSourcesVerified = false; + } + } + + result.putBoolean(IS_ASSOCIATED, allSourcesVerified); + result.putStringArrayList(FAILED_SOURCES, failedSources); + mResultReceiver.send(RESULT_SUCCESS, result); + return null; + } + } +} diff --git a/packages/StatementService/src/com/android/statementservice/ExceptionLoggingFutureTask.java b/packages/StatementService/src/com/android/statementservice/ExceptionLoggingFutureTask.java new file mode 100644 index 0000000..20c7f97 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/ExceptionLoggingFutureTask.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice; + +import android.util.Log; + +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; + +/** + * {@link FutureTask} that logs unhandled exceptions. + */ +final class ExceptionLoggingFutureTask<V> extends FutureTask<V> { + + private final String mTag; + + public ExceptionLoggingFutureTask(Callable<V> callable, String tag) { + super(callable); + mTag = tag; + } + + @Override + protected void done() { + try { + get(); + } catch (ExecutionException | InterruptedException e) { + Log.e(mTag, "Uncaught exception.", e); + throw new RuntimeException(e); + } + } +} diff --git a/packages/StatementService/src/com/android/statementservice/IntentFilterVerificationReceiver.java b/packages/StatementService/src/com/android/statementservice/IntentFilterVerificationReceiver.java new file mode 100644 index 0000000..712347a --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/IntentFilterVerificationReceiver.java @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Bundle; +import android.os.Handler; +import android.os.ResultReceiver; +import android.util.Log; +import android.util.Patterns; + +import com.android.statementservice.retriever.Utils; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; + +/** + * Receives {@link Intent#ACTION_INTENT_FILTER_NEEDS_VERIFICATION} broadcast and calls + * {@link DirectStatementService} to verify the request. Calls + * {@link PackageManager#verifyIntentFilter} to notify {@link PackageManager} the result of the + * verification. + * + * This implementation of the API will send a HTTP request for each host specified in the query. + * To avoid overwhelming the network at app install time, {@code MAX_HOSTS_PER_REQUEST} limits + * the maximum number of hosts in a query. If a query contains more than + * {@code MAX_HOSTS_PER_REQUEST} hosts, it will fail immediately without making any HTTP request + * and call {@link PackageManager#verifyIntentFilter} with + * {@link PackageManager#INTENT_FILTER_VERIFICATION_FAILURE}. + */ +public final class IntentFilterVerificationReceiver extends BroadcastReceiver { + private static final String TAG = IntentFilterVerificationReceiver.class.getSimpleName(); + + private static final Integer MAX_HOSTS_PER_REQUEST = 10; + + private static final String HANDLE_ALL_URLS_RELATION + = "delegate_permission/common.handle_all_urls"; + + private static final String ANDROID_ASSET_FORMAT = "{\"namespace\": \"android_app\", " + + "\"package_name\": \"%s\", \"sha256_cert_fingerprints\": [\"%s\"]}"; + private static final String WEB_ASSET_FORMAT = "{\"namespace\": \"web\", \"site\": \"%s\"}"; + private static final Pattern ANDROID_PACKAGE_NAME_PATTERN = + Pattern.compile("^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$"); + private static final String TOO_MANY_HOSTS_FORMAT = + "Request contains %d hosts which is more than the allowed %d."; + + private static void sendErrorToPackageManager(PackageManager packageManager, + int verificationId) { + packageManager.verifyIntentFilter(verificationId, + PackageManager.INTENT_FILTER_VERIFICATION_FAILURE, + Collections.<String>emptyList()); + } + + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION.equals(action)) { + Bundle inputExtras = intent.getExtras(); + if (inputExtras != null) { + Intent serviceIntent = new Intent(context, DirectStatementService.class); + serviceIntent.setAction(DirectStatementService.CHECK_ALL_ACTION); + + int verificationId = inputExtras.getInt( + PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_ID); + String scheme = inputExtras.getString( + PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_URI_SCHEME); + String hosts = inputExtras.getString( + PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_HOSTS); + String packageName = inputExtras.getString( + PackageManager.EXTRA_INTENT_FILTER_VERIFICATION_PACKAGE_NAME); + + Log.i(TAG, "Verify IntentFilter for " + hosts); + + Bundle extras = new Bundle(); + extras.putString(DirectStatementService.EXTRA_RELATION, HANDLE_ALL_URLS_RELATION); + + String[] hostList = hosts.split(" "); + if (hostList.length > MAX_HOSTS_PER_REQUEST) { + Log.w(TAG, String.format(TOO_MANY_HOSTS_FORMAT, + hostList.length, MAX_HOSTS_PER_REQUEST)); + sendErrorToPackageManager(context.getPackageManager(), verificationId); + return; + } + + try { + ArrayList<String> sourceAssets = new ArrayList<String>(); + for (String host : hostList) { + sourceAssets.add(createWebAssetString(scheme, host)); + } + extras.putStringArrayList(DirectStatementService.EXTRA_SOURCE_ASSET_DESCRIPTORS, + sourceAssets); + } catch (MalformedURLException e) { + Log.w(TAG, "Error when processing input host: " + e.getMessage()); + sendErrorToPackageManager(context.getPackageManager(), verificationId); + return; + } + try { + extras.putString(DirectStatementService.EXTRA_TARGET_ASSET_DESCRIPTOR, + createAndroidAssetString(context, packageName)); + } catch (NameNotFoundException e) { + Log.w(TAG, "Error when processing input Android package: " + e.getMessage()); + sendErrorToPackageManager(context.getPackageManager(), verificationId); + return; + } + extras.putParcelable(DirectStatementService.EXTRA_RESULT_RECEIVER, + new IsAssociatedResultReceiver( + new Handler(), context.getPackageManager(), verificationId)); + + serviceIntent.putExtras(extras); + context.startService(serviceIntent); + } + } else { + Log.w(TAG, "Intent action not supported: " + action); + } + } + + private String createAndroidAssetString(Context context, String packageName) + throws NameNotFoundException { + if (!ANDROID_PACKAGE_NAME_PATTERN.matcher(packageName).matches()) { + throw new NameNotFoundException("Input package name is not valid."); + } + + List<String> certFingerprints = + Utils.getCertFingerprintsFromPackageManager(packageName, context); + + return String.format(ANDROID_ASSET_FORMAT, packageName, + Utils.joinStrings("\", \"", certFingerprints)); + } + + private String createWebAssetString(String scheme, String host) throws MalformedURLException { + if (!Patterns.DOMAIN_NAME.matcher(host).matches()) { + throw new MalformedURLException("Input host is not valid."); + } + if (!scheme.equals("http") && !scheme.equals("https")) { + throw new MalformedURLException("Input scheme is not valid."); + } + + return String.format(WEB_ASSET_FORMAT, new URL(scheme, host, "").toString()); + } + + /** + * Receives the result of {@code StatementService.CHECK_ACTION} from + * {@link DirectStatementService} and passes it back to {@link PackageManager}. + */ + private static class IsAssociatedResultReceiver extends ResultReceiver { + + private final int mVerificationId; + private final PackageManager mPackageManager; + + public IsAssociatedResultReceiver(Handler handler, PackageManager packageManager, + int verificationId) { + super(handler); + mVerificationId = verificationId; + mPackageManager = packageManager; + } + + @Override + protected void onReceiveResult(int resultCode, Bundle resultData) { + if (resultCode == DirectStatementService.RESULT_SUCCESS) { + if (resultData.getBoolean(DirectStatementService.IS_ASSOCIATED)) { + mPackageManager.verifyIntentFilter(mVerificationId, + PackageManager.INTENT_FILTER_VERIFICATION_SUCCESS, + Collections.<String>emptyList()); + } else { + mPackageManager.verifyIntentFilter(mVerificationId, + PackageManager.INTENT_FILTER_VERIFICATION_FAILURE, + resultData.getStringArrayList(DirectStatementService.FAILED_SOURCES)); + } + } else { + sendErrorToPackageManager(mPackageManager, mVerificationId); + } + } + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AbstractAsset.java b/packages/StatementService/src/com/android/statementservice/retriever/AbstractAsset.java new file mode 100644 index 0000000..e71cf54 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AbstractAsset.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +/** + * A handle representing the identity and address of some digital asset. An asset is an online + * entity that typically provides some service or content. Examples of assets are websites, Android + * apps, Twitter feeds, and Plus Pages. + * + * <p> Asset can be represented by a JSON string. For example, the web site https://www.google.com + * can be represented by + * <pre> + * {"namespace": "web", "site": "https://www.google.com"} + * </pre> + * + * <p> The Android app with package name com.google.test that is signed by a certificate with sha256 + * fingerprint 11:22:33 can be represented by + * <pre> + * {"namespace": "android_app", + * "package_name": "com.google.test", + * "sha256_cert_fingerprints": ["11:22:33"]} + * </pre> + * + * <p>Given a signed APK, Java 7's commandline keytool can compute the fingerprint using: + * {@code keytool -list -printcert -jarfile signed_app.apk} + */ +public abstract class AbstractAsset { + + /** + * Returns a JSON string representation of this asset. The strings returned by this function are + * normalized -- they can be used for equality testing. + */ + public abstract String toJson(); + + /** + * Returns a key that can be used by {@link AbstractAssetMatcher} to lookup the asset. + * + * <p> An asset will match an {@code AssetMatcher} only if the value of this method is equal to + * {@code AssetMatcher.getMatchedLookupKey()}. + */ + public abstract int lookupKey(); + + /** + * Creates a new Asset from its JSON string representation. + * + * @throws AssociationServiceException if the assetJson is not well formatted. + */ + public static AbstractAsset create(String assetJson) + throws AssociationServiceException { + return AssetFactory.create(assetJson); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AbstractAssetMatcher.java b/packages/StatementService/src/com/android/statementservice/retriever/AbstractAssetMatcher.java new file mode 100644 index 0000000..c35553f --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AbstractAssetMatcher.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import org.json.JSONException; + +/** + * An asset matcher that can match asset with the given query. + */ +public abstract class AbstractAssetMatcher { + + /** + * Returns true if this AssetMatcher matches the asset. + */ + public abstract boolean matches(AbstractAsset asset); + + /** + * This AssetMatcher will only match Asset with {@code lookupKey()} equal to the value returned + * by this method. + */ + public abstract int getMatchedLookupKey(); + + /** + * Creates a new AssetMatcher from its JSON string representation. + * + * <p> For web namespace, {@code query} will match assets that have the same 'site' field. + * + * <p> For Android namespace, {@code query} will match assets that have the same + * 'package_name' field and have at least one common certificate fingerprint in + * 'sha256_cert_fingerprints' field. + */ + public static AbstractAssetMatcher createMatcher(String query) + throws AssociationServiceException, JSONException { + return AssetMatcherFactory.create(query); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AbstractStatementRetriever.java b/packages/StatementService/src/com/android/statementservice/retriever/AbstractStatementRetriever.java new file mode 100644 index 0000000..fb30bc1 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AbstractStatementRetriever.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import android.content.Context; +import android.annotation.NonNull; + +import java.util.List; + +/** + * Retrieves the statements made by assets. This class is the entry point of the package. + * <p> + * An asset is an identifiable and addressable online entity that typically + * provides some service or content. Examples of assets are websites, Android + * apps, Twitter feeds, and Plus Pages. + * <p> + * Ownership of an asset is defined by being able to control it and speak for it. + * An asset owner may establish a relationship between the asset and another + * asset by making a statement about an intended relationship between the two. + * An example of a relationship is permission delegation. For example, the owner + * of a website (the webmaster) may delegate the ability the handle URLs to a + * particular mobile app. Relationships are considered public information. + * <p> + * A particular kind of relationship (like permission delegation) defines a binary + * relation on assets. The relation is not symmetric or transitive, nor is it + * antisymmetric or anti-transitive. + * <p> + * A statement S(r, a, b) is an assertion that the relation r holds for the + * ordered pair of assets (a, b). For example, taking r = "delegates permission + * to view user's location", a = New York Times mobile app, + * b = nytimes.com website, S(r, a, b) would be an assertion that "the New York + * Times mobile app delegates its ability to use the user's location to the + * nytimes.com website". + * <p> + * A statement S(r, a, b) is considered <b>reliable</b> if we have confidence that + * the statement is true; the exact criterion depends on the kind of statement, + * since some kinds of statements may be true on their face whereas others may + * require multiple parties to agree. + * <p> + * For example, to get the statements made by www.example.com use: + * <pre> + * result = retrieveStatements(AssetFactory.create( + * "{\"namespace\": \"web\", \"site\": \"https://www.google.com\"}")) + * </pre> + * {@code result} will contain the statements and the expiration time of this result. The statements + * are considered reliable until the expiration time. + */ +public abstract class AbstractStatementRetriever { + + /** + * Returns the statements made by the {@code source} asset with ttl. + * + * @throws AssociationServiceException if the asset namespace is not supported. + */ + public abstract Result retrieveStatements(AbstractAsset source) + throws AssociationServiceException; + + /** + * The retrieved statements and the expiration date. + */ + public interface Result { + + /** + * @return the retrieved statements. + */ + @NonNull + public List<Statement> getStatements(); + + /** + * @return the expiration time in millisecond. + */ + public long getExpireMillis(); + } + + /** + * Creates a new StatementRetriever that directly retrieves statements from the asset. + * + * <p> For web assets, {@link AbstractStatementRetriever} will try to retrieve the statement + * file from URL: {@code [webAsset.site]/.well-known/associations.json"} where {@code + * [webAsset.site]} is in the form {@code http{s}://[hostname]:[optional_port]}. The file + * should contain one JSON array of statements. + * + * <p> For Android assets, {@link AbstractStatementRetriever} will try to retrieve the statement + * from the AndroidManifest.xml. The developer should add a {@code meta-data} tag under + * {@code application} tag where attribute {@code android:name} equals "associated_assets" + * and {@code android:recourse} points to a string array resource. Each entry in the string + * array should contain exactly one statement in JSON format. Note that this implementation + * can only return statements made by installed apps. + */ + public static AbstractStatementRetriever createDirectRetriever(Context context) { + return new DirectStatementRetriever(new URLFetcher(), + new AndroidPackageInfoFetcher(context)); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AndroidAppAsset.java b/packages/StatementService/src/com/android/statementservice/retriever/AndroidAppAsset.java new file mode 100644 index 0000000..0c96038 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AndroidAppAsset.java @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; + +/** + * Immutable value type that names an Android app asset. + * + * <p>An Android app can be named by its package name and certificate fingerprints using this JSON + * string: { "namespace": "android_app", "package_name": "[Java package name]", + * "sha256_cert_fingerprints": ["[SHA256 fingerprint of signing cert]", "[additional cert]", ...] } + * + * <p>For example, { "namespace": "android_app", "package_name": "com.test.mytestapp", + * "sha256_cert_fingerprints": ["24:D9:B4:57:A6:42:FB:E6:E5:B8:D6:9E:7B:2D:C2:D1:CB:D1:77:17:1D:7F:D4:A9:16:10:11:AB:92:B9:8F:3F"] + * } + * + * <p>Given a signed APK, Java 7's commandline keytool can compute the fingerprint using: + * {@code keytool -list -printcert -jarfile signed_app.apk} + * + * <p>Each entry in "sha256_cert_fingerprints" is a colon-separated hex string (e.g. 14:6D:E9:...) + * representing the certificate SHA-256 fingerprint. + */ +/* package private */ final class AndroidAppAsset extends AbstractAsset { + + private static final String MISSING_FIELD_FORMAT_STRING = "Expected %s to be set."; + private static final String MISSING_APPCERTS_FORMAT_STRING = + "Expected %s to be non-empty array."; + private static final String APPCERT_NOT_STRING_FORMAT_STRING = "Expected all %s to be strings."; + + private final List<String> mCertFingerprints; + private final String mPackageName; + + public List<String> getCertFingerprints() { + return Collections.unmodifiableList(mCertFingerprints); + } + + public String getPackageName() { + return mPackageName; + } + + @Override + public String toJson() { + AssetJsonWriter writer = new AssetJsonWriter(); + + writer.writeFieldLower(Utils.NAMESPACE_FIELD, Utils.NAMESPACE_ANDROID_APP); + writer.writeFieldLower(Utils.ANDROID_APP_ASSET_FIELD_PACKAGE_NAME, mPackageName); + writer.writeArrayUpper(Utils.ANDROID_APP_ASSET_FIELD_CERT_FPS, mCertFingerprints); + + return writer.closeAndGetString(); + } + + @Override + public String toString() { + StringBuilder asset = new StringBuilder(); + asset.append("AndroidAppAsset: "); + asset.append(toJson()); + return asset.toString(); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof AndroidAppAsset)) { + return false; + } + + return ((AndroidAppAsset) o).toJson().equals(toJson()); + } + + @Override + public int hashCode() { + return toJson().hashCode(); + } + + @Override + public int lookupKey() { + return getPackageName().hashCode(); + } + + /** + * Checks that the input is a valid Android app asset. + * + * @param asset a JSONObject that has "namespace", "package_name", and + * "sha256_cert_fingerprints" fields. + * @throws AssociationServiceException if the asset is not well formatted. + */ + public static AndroidAppAsset create(JSONObject asset) + throws AssociationServiceException { + String packageName = asset.optString(Utils.ANDROID_APP_ASSET_FIELD_PACKAGE_NAME); + if (packageName.equals("")) { + throw new AssociationServiceException(String.format(MISSING_FIELD_FORMAT_STRING, + Utils.ANDROID_APP_ASSET_FIELD_PACKAGE_NAME)); + } + + JSONArray certArray = asset.optJSONArray(Utils.ANDROID_APP_ASSET_FIELD_CERT_FPS); + if (certArray == null || certArray.length() == 0) { + throw new AssociationServiceException( + String.format(MISSING_APPCERTS_FORMAT_STRING, + Utils.ANDROID_APP_ASSET_FIELD_CERT_FPS)); + } + List<String> certFingerprints = new ArrayList<>(certArray.length()); + for (int i = 0; i < certArray.length(); i++) { + try { + certFingerprints.add(certArray.getString(i)); + } catch (JSONException e) { + throw new AssociationServiceException( + String.format(APPCERT_NOT_STRING_FORMAT_STRING, + Utils.ANDROID_APP_ASSET_FIELD_CERT_FPS)); + } + } + + return new AndroidAppAsset(packageName, certFingerprints); + } + + /** + * Creates a new AndroidAppAsset. + * + * @param packageName the package name of the Android app. + * @param certFingerprints at least one of the Android app signing certificate sha-256 + * fingerprint. + */ + public static AndroidAppAsset create(String packageName, List<String> certFingerprints) { + if (packageName == null || packageName.equals("")) { + throw new AssertionError("Expected packageName to be set."); + } + if (certFingerprints == null || certFingerprints.size() == 0) { + throw new AssertionError("Expected certFingerprints to be set."); + } + List<String> lowerFps = new ArrayList<String>(certFingerprints.size()); + for (String fp : certFingerprints) { + lowerFps.add(fp.toUpperCase(Locale.US)); + } + return new AndroidAppAsset(packageName, lowerFps); + } + + private AndroidAppAsset(String packageName, List<String> certFingerprints) { + if (packageName.equals("")) { + mPackageName = null; + } else { + mPackageName = packageName; + } + + if (certFingerprints == null || certFingerprints.size() == 0) { + mCertFingerprints = null; + } else { + mCertFingerprints = Collections.unmodifiableList(sortAndDeDuplicate(certFingerprints)); + } + } + + /** + * Returns an ASCII-sorted copy of the list of certs with all duplicates removed. + */ + private List<String> sortAndDeDuplicate(List<String> certs) { + if (certs.size() <= 1) { + return certs; + } + HashSet<String> set = new HashSet<>(certs); + List<String> result = new ArrayList<>(set); + Collections.sort(result); + return result; + } + +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AndroidAppAssetMatcher.java b/packages/StatementService/src/com/android/statementservice/retriever/AndroidAppAssetMatcher.java new file mode 100644 index 0000000..8a9d838 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AndroidAppAssetMatcher.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import java.util.HashSet; +import java.util.Set; + +/** + * Match assets that have the same 'package_name' field and have at least one common certificate + * fingerprint in 'sha256_cert_fingerprints' field. + */ +/* package private */ final class AndroidAppAssetMatcher extends AbstractAssetMatcher { + + private final AndroidAppAsset mQuery; + + public AndroidAppAssetMatcher(AndroidAppAsset query) { + mQuery = query; + } + + @Override + public boolean matches(AbstractAsset asset) { + if (asset instanceof AndroidAppAsset) { + AndroidAppAsset androidAppAsset = (AndroidAppAsset) asset; + if (!androidAppAsset.getPackageName().equals(mQuery.getPackageName())) { + return false; + } + + Set<String> certs = new HashSet<String>(mQuery.getCertFingerprints()); + for (String cert : androidAppAsset.getCertFingerprints()) { + if (certs.contains(cert)) { + return true; + } + } + } + return false; + } + + @Override + public int getMatchedLookupKey() { + return mQuery.lookupKey(); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AndroidPackageInfoFetcher.java b/packages/StatementService/src/com/android/statementservice/retriever/AndroidPackageInfoFetcher.java new file mode 100644 index 0000000..1000c4c --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AndroidPackageInfoFetcher.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Resources.NotFoundException; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Class that provides information about an android app from {@link PackageManager}. + * + * Visible for testing. + * + * @hide + */ +public class AndroidPackageInfoFetcher { + + /** + * The name of the metadata tag in AndroidManifest.xml that stores the associated asset array + * ID. The metadata tag should use the android:resource attribute to point to an array resource + * that contains the associated assets. + */ + private static final String ASSOCIATED_ASSETS_KEY = "associated_assets"; + + private Context mContext; + + public AndroidPackageInfoFetcher(Context context) { + mContext = context; + } + + /** + * Returns the Sha-256 fingerprints of all certificates from the specified package as a list of + * upper case HEX Strings with bytes separated by colons. Given an app {@link + * android.content.pm.Signature}, the fingerprint can be computed as {@link + * Utils#computeNormalizedSha256Fingerprint} {@code(signature.toByteArray())}. + * + * <p>Given a signed APK, Java 7's commandline keytool can compute the fingerprint using: {@code + * keytool -list -printcert -jarfile signed_app.apk} + * + * <p>Example: "10:39:38:EE:45:37:E5:9E:8E:E7:92:F6:54:50:4F:B8:34:6F:C6:B3:46:D0:BB:C4:41:5F:C3:39:FC:FC:8E:C1" + * + * @throws NameNotFoundException if an app with packageName is not installed on the device. + */ + public List<String> getCertFingerprints(String packageName) throws NameNotFoundException { + return Utils.getCertFingerprintsFromPackageManager(packageName, mContext); + } + + /** + * Returns all statements that the specified package makes in its AndroidManifest.xml. + * + * @throws NameNotFoundException if the app is not installed on the device. + */ + public List<String> getStatements(String packageName) throws NameNotFoundException { + PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo( + packageName, PackageManager.GET_META_DATA); + ApplicationInfo appInfo = packageInfo.applicationInfo; + if (appInfo.metaData == null) { + return Collections.<String>emptyList(); + } + int tokenResourceId = appInfo.metaData.getInt(ASSOCIATED_ASSETS_KEY); + if (tokenResourceId == 0) { + return Collections.<String>emptyList(); + } + try { + return Arrays.asList( + mContext.getPackageManager().getResourcesForApplication(packageName) + .getStringArray(tokenResourceId)); + } catch (NotFoundException e) { + return Collections.<String>emptyList(); + } + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AssetFactory.java b/packages/StatementService/src/com/android/statementservice/retriever/AssetFactory.java new file mode 100644 index 0000000..762365e --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AssetFactory.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Factory to create asset from JSON string. + */ +/* package private */ final class AssetFactory { + + private static final String FIELD_NOT_STRING_FORMAT_STRING = "Expected %s to be string."; + + private AssetFactory() {} + + /** + * Creates a new Asset object from its JSON string representation. + * + * @throws AssociationServiceException if the assetJson is not well formatted. + */ + public static AbstractAsset create(String assetJson) throws AssociationServiceException { + try { + return create(new JSONObject(assetJson)); + } catch (JSONException e) { + throw new AssociationServiceException( + "Input is not a well formatted asset descriptor."); + } + } + + /** + * Checks that the input is a valid asset with purposes. + * + * @throws AssociationServiceException if the asset is not well formatted. + */ + private static AbstractAsset create(JSONObject asset) + throws AssociationServiceException { + String namespace = asset.optString(Utils.NAMESPACE_FIELD, null); + if (namespace == null) { + throw new AssociationServiceException(String.format( + FIELD_NOT_STRING_FORMAT_STRING, Utils.NAMESPACE_FIELD)); + } + + if (namespace.equals(Utils.NAMESPACE_WEB)) { + return WebAsset.create(asset); + } else if (namespace.equals(Utils.NAMESPACE_ANDROID_APP)) { + return AndroidAppAsset.create(asset); + } else { + throw new AssociationServiceException("Namespace " + namespace + " is not supported."); + } + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AssetJsonWriter.java b/packages/StatementService/src/com/android/statementservice/retriever/AssetJsonWriter.java new file mode 100644 index 0000000..080e45a --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AssetJsonWriter.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import android.util.JsonWriter; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.List; +import java.util.Locale; + +/** + * Creates a Json string where the order of the fields can be specified. + */ +/* package private */ final class AssetJsonWriter { + + private StringWriter mStringWriter = new StringWriter(); + private JsonWriter mWriter; + private boolean mClosed = false; + + public AssetJsonWriter() { + mWriter = new JsonWriter(mStringWriter); + try { + mWriter.beginObject(); + } catch (IOException e) { + throw new AssertionError("Unreachable exception."); + } + } + + /** + * Appends a field to the output, putting both the key and value in lowercase. Null values are + * not written. + */ + public void writeFieldLower(String key, String value) { + if (mClosed) { + throw new IllegalArgumentException( + "Cannot write to an object that has already been closed."); + } + + if (value != null) { + try { + mWriter.name(key.toLowerCase(Locale.US)); + mWriter.value(value.toLowerCase(Locale.US)); + } catch (IOException e) { + throw new AssertionError("Unreachable exception."); + } + } + } + + /** + * Appends an array to the output, putting both the key and values in lowercase. If {@code + * values} is null, this field will not be written. Individual values in the list must not be + * null. + */ + public void writeArrayUpper(String key, List<String> values) { + if (mClosed) { + throw new IllegalArgumentException( + "Cannot write to an object that has already been closed."); + } + + if (values != null) { + try { + mWriter.name(key.toLowerCase(Locale.US)); + mWriter.beginArray(); + for (String value : values) { + mWriter.value(value.toUpperCase(Locale.US)); + } + mWriter.endArray(); + } catch (IOException e) { + throw new AssertionError("Unreachable exception."); + } + } + } + + /** + * Returns the string representation of the constructed json. After calling this method, {@link + * #writeFieldLower} can no longer be called. + */ + public String closeAndGetString() { + if (!mClosed) { + try { + mWriter.endObject(); + } catch (IOException e) { + throw new AssertionError("Unreachable exception."); + } + mClosed = true; + } + return mStringWriter.toString(); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AssetMatcherFactory.java b/packages/StatementService/src/com/android/statementservice/retriever/AssetMatcherFactory.java new file mode 100644 index 0000000..1a50757 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AssetMatcherFactory.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Factory to create asset matcher from JSON string. + */ +/* package private */ final class AssetMatcherFactory { + + private static final String FIELD_NOT_STRING_FORMAT_STRING = "Expected %s to be string."; + private static final String NAMESPACE_NOT_SUPPORTED_STRING = "Namespace %s is not supported."; + + public static AbstractAssetMatcher create(String query) throws AssociationServiceException, + JSONException { + JSONObject queryObject = new JSONObject(query); + + String namespace = queryObject.optString(Utils.NAMESPACE_FIELD, null); + if (namespace == null) { + throw new AssociationServiceException(String.format( + FIELD_NOT_STRING_FORMAT_STRING, Utils.NAMESPACE_FIELD)); + } + + if (namespace.equals(Utils.NAMESPACE_WEB)) { + return new WebAssetMatcher(WebAsset.create(queryObject)); + } else if (namespace.equals(Utils.NAMESPACE_ANDROID_APP)) { + return new AndroidAppAssetMatcher(AndroidAppAsset.create(queryObject)); + } else { + throw new AssociationServiceException( + String.format(NAMESPACE_NOT_SUPPORTED_STRING, namespace)); + } + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/AssociationServiceException.java b/packages/StatementService/src/com/android/statementservice/retriever/AssociationServiceException.java new file mode 100644 index 0000000..d6e49c2 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/AssociationServiceException.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +/** + * Thrown when an error occurs in the Association Service. + */ +public class AssociationServiceException extends Exception { + + public AssociationServiceException(String msg) { + super(msg); + } + + public AssociationServiceException(String msg, Exception e) { + super(msg, e); + } + + public AssociationServiceException(Exception e) { + super(e); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/DirectStatementRetriever.java b/packages/StatementService/src/com/android/statementservice/retriever/DirectStatementRetriever.java new file mode 100644 index 0000000..3ad71c4 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/DirectStatementRetriever.java @@ -0,0 +1,204 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import android.content.pm.PackageManager.NameNotFoundException; +import android.util.Log; + +import org.json.JSONException; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * An implementation of {@link AbstractStatementRetriever} that directly retrieves statements from + * the asset. + */ +/* package private */ final class DirectStatementRetriever extends AbstractStatementRetriever { + + private static final long DO_NOT_CACHE_RESULT = 0L; + private static final int HTTP_CONNECTION_TIMEOUT_MILLIS = 5000; + private static final long HTTP_CONTENT_SIZE_LIMIT_IN_BYTES = 1024 * 1024; + private static final int MAX_INCLUDE_LEVEL = 1; + private static final String WELL_KNOWN_STATEMENT_PATH = "/.well-known/associations.json"; + + private final URLFetcher mUrlFetcher; + private final AndroidPackageInfoFetcher mAndroidFetcher; + + /** + * An immutable value type representing the retrieved statements and the expiration date. + */ + public static class Result implements AbstractStatementRetriever.Result { + + private final List<Statement> mStatements; + private final Long mExpireMillis; + + @Override + public List<Statement> getStatements() { + return mStatements; + } + + @Override + public long getExpireMillis() { + return mExpireMillis; + } + + private Result(List<Statement> statements, Long expireMillis) { + mStatements = statements; + mExpireMillis = expireMillis; + } + + public static Result create(List<Statement> statements, Long expireMillis) { + return new Result(statements, expireMillis); + } + + @Override + public String toString() { + StringBuilder result = new StringBuilder(); + result.append("Result: "); + result.append(mStatements.toString()); + result.append(", mExpireMillis="); + result.append(mExpireMillis); + return result.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Result result = (Result) o; + + if (!mExpireMillis.equals(result.mExpireMillis)) { + return false; + } + if (!mStatements.equals(result.mStatements)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = mStatements.hashCode(); + result = 31 * result + mExpireMillis.hashCode(); + return result; + } + } + + public DirectStatementRetriever(URLFetcher urlFetcher, + AndroidPackageInfoFetcher androidFetcher) { + this.mUrlFetcher = urlFetcher; + this.mAndroidFetcher = androidFetcher; + } + + @Override + public Result retrieveStatements(AbstractAsset source) throws AssociationServiceException { + if (source instanceof AndroidAppAsset) { + return retrieveFromAndroid((AndroidAppAsset) source); + } else if (source instanceof WebAsset) { + return retrieveFromWeb((WebAsset) source); + } else { + throw new AssociationServiceException("Namespace is not supported."); + } + } + + private String computeAssociationJsonUrl(WebAsset asset) { + try { + return new URL(asset.getScheme(), asset.getDomain(), asset.getPort(), + WELL_KNOWN_STATEMENT_PATH) + .toExternalForm(); + } catch (MalformedURLException e) { + throw new AssertionError("Invalid domain name in database."); + } + } + + private Result retrieveStatementFromUrl(String url, int maxIncludeLevel, AbstractAsset source) + throws AssociationServiceException { + List<Statement> statements = new ArrayList<Statement>(); + if (maxIncludeLevel < 0) { + return Result.create(statements, DO_NOT_CACHE_RESULT); + } + + WebContent webContent; + try { + webContent = mUrlFetcher.getWebContentFromUrl(new URL(url), + HTTP_CONTENT_SIZE_LIMIT_IN_BYTES, HTTP_CONNECTION_TIMEOUT_MILLIS); + } catch (IOException e) { + return Result.create(statements, DO_NOT_CACHE_RESULT); + } + + try { + ParsedStatement result = StatementParser + .parseStatementList(webContent.getContent(), source); + statements.addAll(result.getStatements()); + for (String delegate : result.getDelegates()) { + statements.addAll( + retrieveStatementFromUrl(delegate, maxIncludeLevel - 1, source) + .getStatements()); + } + return Result.create(statements, webContent.getExpireTimeMillis()); + } catch (JSONException e) { + return Result.create(statements, DO_NOT_CACHE_RESULT); + } + } + + private Result retrieveFromWeb(WebAsset asset) + throws AssociationServiceException { + return retrieveStatementFromUrl(computeAssociationJsonUrl(asset), MAX_INCLUDE_LEVEL, asset); + } + + private Result retrieveFromAndroid(AndroidAppAsset asset) throws AssociationServiceException { + try { + List<String> delegates = new ArrayList<String>(); + List<Statement> statements = new ArrayList<Statement>(); + + List<String> certFps = mAndroidFetcher.getCertFingerprints(asset.getPackageName()); + if (!Utils.hasCommonString(certFps, asset.getCertFingerprints())) { + throw new AssociationServiceException( + "Specified certs don't match the installed app."); + } + + AndroidAppAsset actualSource = AndroidAppAsset.create(asset.getPackageName(), certFps); + for (String statementJson : mAndroidFetcher.getStatements(asset.getPackageName())) { + ParsedStatement result = + StatementParser.parseStatement(statementJson, actualSource); + statements.addAll(result.getStatements()); + delegates.addAll(result.getDelegates()); + } + + for (String delegate : delegates) { + statements.addAll(retrieveStatementFromUrl(delegate, MAX_INCLUDE_LEVEL, + actualSource).getStatements()); + } + + return Result.create(statements, DO_NOT_CACHE_RESULT); + } catch (JSONException | NameNotFoundException e) { + Log.w(DirectStatementRetriever.class.getSimpleName(), e); + return Result.create(Collections.<Statement>emptyList(), DO_NOT_CACHE_RESULT); + } + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/ParsedStatement.java b/packages/StatementService/src/com/android/statementservice/retriever/ParsedStatement.java new file mode 100644 index 0000000..9446e66 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/ParsedStatement.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import java.util.List; + +/** + * A class that stores a list of statement and/or a list of delegate url. + */ +/* package private */ final class ParsedStatement { + + private final List<Statement> mStatements; + private final List<String> mDelegates; + + public ParsedStatement(List<Statement> statements, List<String> delegates) { + this.mStatements = statements; + this.mDelegates = delegates; + } + + public List<Statement> getStatements() { + return mStatements; + } + + public List<String> getDelegates() { + return mDelegates; + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/Relation.java b/packages/StatementService/src/com/android/statementservice/retriever/Relation.java new file mode 100644 index 0000000..91218c6 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/Relation.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import android.annotation.NonNull; + +import java.util.regex.Pattern; + +/** + * An immutable value type representing a statement relation with "kind" and "detail". + * + * <p> The set of kinds is enumerated by the API: <ul> <li> <b>delegate_permission</b>: The detail + * field specifies which permission to delegate. A statement involving this relation does not + * constitute a requirement to do the delegation, just a permission to do so. </ul> + * + * <p> We may add other kinds in the future. + * + * <p> The detail field is a lowercase alphanumeric string with underscores and periods allowed + * (matching the regex [a-z0-9_.]+), but otherwise unstructured. It is also possible to specify '*' + * (the wildcard character) as the detail if the relation applies to any detail in the specified + * kind. + */ +public final class Relation { + + private static final Pattern KIND_PATTERN = Pattern.compile("^[a-z0-9_.]+$"); + private static final Pattern DETAIL_PATTERN = Pattern.compile("^([a-z0-9_.]+|[*])$"); + + private static final String MATCH_ALL_DETAILS = "*"; + + private final String mKind; + private final String mDetail; + + private Relation(String kind, String detail) { + mKind = kind; + mDetail = detail; + } + + /** + * Returns the relation's kind. + */ + @NonNull + public String getKind() { + return mKind; + } + + /** + * Returns the relation's detail. + */ + @NonNull + public String getDetail() { + return mDetail; + } + + /** + * Creates a new Relation object for the specified {@code kind} and {@code detail}. + * + * @throws AssociationServiceException if {@code kind} or {@code detail} is not well formatted. + */ + public static Relation create(@NonNull String kind, @NonNull String detail) + throws AssociationServiceException { + if (!KIND_PATTERN.matcher(kind).matches() || !DETAIL_PATTERN.matcher(detail).matches()) { + throw new AssociationServiceException("Relation not well formatted."); + } + return new Relation(kind, detail); + } + + /** + * Creates a new Relation object from its string representation. + * + * @throws AssociationServiceException if the relation is not well formatted. + */ + public static Relation create(@NonNull String relation) throws AssociationServiceException { + String[] r = relation.split("/", 2); + if (r.length != 2) { + throw new AssociationServiceException("Relation not well formatted."); + } + return create(r[0], r[1]); + } + + /** + * Returns true if {@code relation} has the same kind and detail. If {@code + * relation.getDetail()} is wildcard (*) then returns true if the kind is the same. + */ + public boolean matches(Relation relation) { + return getKind().equals(relation.getKind()) && (getDetail().equals(MATCH_ALL_DETAILS) + || getDetail().equals(relation.getDetail())); + } + + /** + * Returns a string representation of this relation. + */ + @Override + public String toString() { + StringBuilder relation = new StringBuilder(); + relation.append(getKind()); + relation.append("/"); + relation.append(getDetail()); + return relation.toString(); + } + + // equals() and hashCode() are generated by Android Studio. + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Relation relation = (Relation) o; + + if (mDetail != null ? !mDetail.equals(relation.mDetail) : relation.mDetail != null) { + return false; + } + if (mKind != null ? !mKind.equals(relation.mKind) : relation.mKind != null) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = mKind != null ? mKind.hashCode() : 0; + result = 31 * result + (mDetail != null ? mDetail.hashCode() : 0); + return result; + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/Statement.java b/packages/StatementService/src/com/android/statementservice/retriever/Statement.java new file mode 100644 index 0000000..f83edaf --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/Statement.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import android.annotation.NonNull; + +/** + * An immutable value type representing a statement, consisting of a source, target, and relation. + * This reflects an assertion that the relation holds for the source, target pair. For example, if a + * web site has the following in its associations.json file: + * + * <pre> + * { + * "relation": ["delegate_permission/common.handle_all_urls"], + * "target" : {"namespace": "android_app", "package_name": "com.example.app", + * "sha256_cert_fingerprints": ["00:11:22:33"] } + * } + * </pre> + * + * Then invoking {@link AbstractStatementRetriever#retrieveStatements(AbstractAsset)} will return a + * {@link Statement} with {@link #getSource} equal to the input parameter, {@link #getRelation} + * equal to + * + * <pre>Relation.create("delegate_permission", "common.get_login_creds");</pre> + * + * and with {@link #getTarget} equal to + * + * <pre>AbstractAsset.create("{\"namespace\" : \"android_app\"," + * + "\"package_name\": \"com.example.app\"}" + * + "\"sha256_cert_fingerprints\": \"[\"00:11:22:33\"]\"}"); + * </pre> + */ +public final class Statement { + + private final AbstractAsset mTarget; + private final Relation mRelation; + private final AbstractAsset mSource; + + private Statement(AbstractAsset source, AbstractAsset target, Relation relation) { + mSource = source; + mTarget = target; + mRelation = relation; + } + + /** + * Returns the source asset of the statement. + */ + @NonNull + public AbstractAsset getSource() { + return mSource; + } + + /** + * Returns the target asset of the statement. + */ + @NonNull + public AbstractAsset getTarget() { + return mTarget; + } + + /** + * Returns the relation of the statement. + */ + @NonNull + public Relation getRelation() { + return mRelation; + } + + /** + * Creates a new Statement object for the specified target asset and relation. For example: + * <pre> + * Asset asset = Asset.Factory.create( + * "{\"namespace\" : \"web\",\"site\": \"https://www.test.com\"}"); + * Relation relation = Relation.create("delegate_permission", "common.get_login_creds"); + * Statement statement = Statement.create(asset, relation); + * </pre> + */ + public static Statement create(@NonNull AbstractAsset source, @NonNull AbstractAsset target, + @NonNull Relation relation) { + return new Statement(source, target, relation); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Statement statement = (Statement) o; + + if (!mRelation.equals(statement.mRelation)) { + return false; + } + if (!mTarget.equals(statement.mTarget)) { + return false; + } + if (!mSource.equals(statement.mSource)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = mTarget.hashCode(); + result = 31 * result + mRelation.hashCode(); + result = 31 * result + mSource.hashCode(); + return result; + } + + @Override + public String toString() { + StringBuilder statement = new StringBuilder(); + statement.append("Statement: "); + statement.append(mSource); + statement.append(", "); + statement.append(mTarget); + statement.append(", "); + statement.append(mRelation); + return statement.toString(); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/StatementParser.java b/packages/StatementService/src/com/android/statementservice/retriever/StatementParser.java new file mode 100644 index 0000000..bcd91bd --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/StatementParser.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Utility class that parses JSON-formatted statements. + */ +/* package private */ final class StatementParser { + + /** + * Parses a JSON array of statements. + */ + static ParsedStatement parseStatementList(String statementList, AbstractAsset source) + throws JSONException, AssociationServiceException { + List<Statement> statements = new ArrayList<Statement>(); + List<String> delegates = new ArrayList<String>(); + + JSONArray statementsJson = new JSONArray(statementList); + for (int i = 0; i < statementsJson.length(); i++) { + ParsedStatement result = parseStatement(statementsJson.getString(i), source); + statements.addAll(result.getStatements()); + delegates.addAll(result.getDelegates()); + } + + return new ParsedStatement(statements, delegates); + } + + /** + * Parses a single JSON statement. + */ + static ParsedStatement parseStatement(String statementString, AbstractAsset source) + throws JSONException, AssociationServiceException { + List<Statement> statements = new ArrayList<Statement>(); + List<String> delegates = new ArrayList<String>(); + JSONObject statement = new JSONObject(statementString); + if (statement.optString(Utils.DELEGATE_FIELD_DELEGATE, null) != null) { + delegates.add(statement.optString(Utils.DELEGATE_FIELD_DELEGATE)); + } else { + AbstractAsset target = AssetFactory + .create(statement.getString(Utils.ASSET_DESCRIPTOR_FIELD_TARGET)); + JSONArray relations = statement.getJSONArray( + Utils.ASSET_DESCRIPTOR_FIELD_RELATION); + for (int i = 0; i < relations.length(); i++) { + statements.add(Statement + .create(source, target, Relation.create(relations.getString(i)))); + } + } + + return new ParsedStatement(statements, delegates); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/URLFetcher.java b/packages/StatementService/src/com/android/statementservice/retriever/URLFetcher.java new file mode 100644 index 0000000..4828ff9 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/URLFetcher.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import com.android.volley.Cache; +import com.android.volley.NetworkResponse; +import com.android.volley.toolbox.HttpHeaderParser; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +/** + * Helper class for fetching HTTP or HTTPS URL. + * + * Visible for testing. + * + * @hide + */ +public class URLFetcher { + + private static final long DO_NOT_CACHE_RESULT = 0L; + private static final int INPUT_BUFFER_SIZE_IN_BYTES = 1024; + + /** + * Fetches the specified url and returns the content and ttl. + * + * @throws IOException if it can't retrieve the content due to a network problem. + * @throws AssociationServiceException if the URL scheme is not http or https or the content + * length exceeds {code fileSizeLimit}. + */ + public WebContent getWebContentFromUrl(URL url, long fileSizeLimit, int connectionTimeoutMillis) + throws AssociationServiceException, IOException { + final String scheme = url.getProtocol().toLowerCase(Locale.US); + if (!scheme.equals("http") && !scheme.equals("https")) { + throw new IllegalArgumentException("The url protocol should be on http or https."); + } + + HttpURLConnection connection; + connection = (HttpURLConnection) url.openConnection(); + connection.setInstanceFollowRedirects(true); + connection.setConnectTimeout(connectionTimeoutMillis); + connection.setReadTimeout(connectionTimeoutMillis); + connection.setUseCaches(true); + connection.addRequestProperty("Cache-Control", "max-stale=60"); + + if (connection.getContentLength() > fileSizeLimit) { + throw new AssociationServiceException("The content size of the url is larger than " + + fileSizeLimit); + } + + Long expireTimeMillis = getExpirationTimeMillisFromHTTPHeader(connection.getHeaderFields()); + + try { + return new WebContent(inputStreamToString( + connection.getInputStream(), connection.getContentLength(), fileSizeLimit), + expireTimeMillis); + } finally { + connection.disconnect(); + } + } + + /** + * Visible for testing. + * @hide + */ + public static String inputStreamToString(InputStream inputStream, int length, long sizeLimit) + throws IOException, AssociationServiceException { + if (length < 0) { + length = 0; + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(length); + BufferedInputStream bis = new BufferedInputStream(inputStream); + byte[] buffer = new byte[INPUT_BUFFER_SIZE_IN_BYTES]; + int len = 0; + while ((len = bis.read(buffer)) != -1) { + baos.write(buffer, 0, len); + if (baos.size() > sizeLimit) { + throw new AssociationServiceException("The content size of the url is larger than " + + sizeLimit); + } + } + return baos.toString("UTF-8"); + } + + /** + * Parses the HTTP headers to compute the ttl. + * + * @param headers a map that map the header key to the header values. Can be null. + * @return the ttl in millisecond or null if the ttl is not specified in the header. + */ + private Long getExpirationTimeMillisFromHTTPHeader(Map<String, List<String>> headers) { + if (headers == null) { + return null; + } + Map<String, String> joinedHeaders = joinHttpHeaders(headers); + + NetworkResponse response = new NetworkResponse(null, joinedHeaders); + Cache.Entry cachePolicy = HttpHeaderParser.parseCacheHeaders(response); + + if (cachePolicy == null) { + // Cache is disabled, set the expire time to 0. + return DO_NOT_CACHE_RESULT; + } else if (cachePolicy.ttl == 0) { + // Cache policy is not specified, set the expire time to 0. + return DO_NOT_CACHE_RESULT; + } else { + // cachePolicy.ttl is actually the expire timestamp in millisecond. + return cachePolicy.ttl; + } + } + + /** + * Converts an HTTP header map of the format provided by {@linkHttpUrlConnection} to a map of + * the format accepted by {@link HttpHeaderParser}. It does this by joining all the entries for + * a given header key with ", ". + */ + private Map<String, String> joinHttpHeaders(Map<String, List<String>> headers) { + Map<String, String> joinedHeaders = new HashMap<String, String>(); + for (Map.Entry<String, List<String>> entry : headers.entrySet()) { + List<String> values = entry.getValue(); + if (values.size() == 1) { + joinedHeaders.put(entry.getKey(), values.get(0)); + } else { + joinedHeaders.put(entry.getKey(), Utils.joinStrings(", ", values)); + } + } + return joinedHeaders; + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/Utils.java b/packages/StatementService/src/com/android/statementservice/retriever/Utils.java new file mode 100644 index 0000000..44af864 --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/Utils.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.statementservice.retriever; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.Signature; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +/** + * Utility library for computing certificate fingerprints. Also includes fields name used by + * Statement JSON string. + */ +public final class Utils { + + private Utils() {} + + /** + * Field name for namespace. + */ + public static final String NAMESPACE_FIELD = "namespace"; + + /** + * Supported asset namespaces. + */ + public static final String NAMESPACE_WEB = "web"; + public static final String NAMESPACE_ANDROID_APP = "android_app"; + + /** + * Field names in a web asset descriptor. + */ + public static final String WEB_ASSET_FIELD_SITE = "site"; + + /** + * Field names in a Android app asset descriptor. + */ + public static final String ANDROID_APP_ASSET_FIELD_PACKAGE_NAME = "package_name"; + public static final String ANDROID_APP_ASSET_FIELD_CERT_FPS = "sha256_cert_fingerprints"; + + /** + * Field names in a statement. + */ + public static final String ASSET_DESCRIPTOR_FIELD_RELATION = "relation"; + public static final String ASSET_DESCRIPTOR_FIELD_TARGET = "target"; + public static final String DELEGATE_FIELD_DELEGATE = "delegate"; + + private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F' }; + + /** + * Joins a list of strings, by placing separator between each string. For example, + * {@code joinStrings("; ", Arrays.asList(new String[]{"a", "b", "c"}))} returns + * "{@code a; b; c}". + */ + public static String joinStrings(String separator, List<String> strings) { + switch(strings.size()) { + case 0: + return ""; + case 1: + return strings.get(0); + default: + StringBuilder joiner = new StringBuilder(); + boolean first = true; + for (String field : strings) { + if (first) { + first = false; + } else { + joiner.append(separator); + } + joiner.append(field); + } + return joiner.toString(); + } + } + + /** + * Returns the normalized sha-256 fingerprints of a given package according to the Android + * package manager. + */ + public static List<String> getCertFingerprintsFromPackageManager(String packageName, + Context context) throws NameNotFoundException { + Signature[] signatures = context.getPackageManager().getPackageInfo(packageName, + PackageManager.GET_SIGNATURES).signatures; + ArrayList<String> result = new ArrayList<String>(signatures.length); + for (Signature sig : signatures) { + result.add(computeNormalizedSha256Fingerprint(sig.toByteArray())); + } + return result; + } + + /** + * Computes the hash of the byte array using the specified algorithm, returning a hex string + * with a colon between each byte. + */ + public static String computeNormalizedSha256Fingerprint(byte[] signature) { + MessageDigest digester; + try { + digester = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError("No SHA-256 implementation found."); + } + digester.update(signature); + return byteArrayToHexString(digester.digest()); + } + + /** + * Returns true if there is at least one common string between the two lists of string. + */ + public static boolean hasCommonString(List<String> list1, List<String> list2) { + HashSet<String> set2 = new HashSet<>(list2); + for (String string : list1) { + if (set2.contains(string)) { + return true; + } + } + return false; + } + + /** + * Converts the byte array to an lowercase hexadecimal digits String with a colon character (:) + * between each byte. + */ + private static String byteArrayToHexString(byte[] array) { + if (array.length == 0) { + return ""; + } + char[] buf = new char[array.length * 3 - 1]; + + int bufIndex = 0; + for (int i = 0; i < array.length; i++) { + byte b = array[i]; + if (i > 0) { + buf[bufIndex++] = ':'; + } + buf[bufIndex++] = HEX_DIGITS[(b >>> 4) & 0x0F]; + buf[bufIndex++] = HEX_DIGITS[b & 0x0F]; + } + return new String(buf); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/WebAsset.java b/packages/StatementService/src/com/android/statementservice/retriever/WebAsset.java new file mode 100644 index 0000000..ca9e62d --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/WebAsset.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +import org.json.JSONObject; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Locale; + +/** + * Immutable value type that names a web asset. + * + * <p>A web asset can be named by its protocol, domain, and port using this JSON string: + * { "namespace": "web", + * "site": "[protocol]://[fully-qualified domain]{:[optional port]}" } + * + * <p>For example, a website hosted on a https server at www.test.com can be named using + * { "namespace": "web", + * "site": "https://www.test.com" } + * + * <p>The only protocol supported now are https and http. If the optional port is not specified, + * the default for each protocol will be used (i.e. 80 for http and 443 for https). + */ +/* package private */ final class WebAsset extends AbstractAsset { + + private static final String MISSING_FIELD_FORMAT_STRING = "Expected %s to be set."; + + private final URL mUrl; + + private WebAsset(URL url) { + int port = url.getPort() != -1 ? url.getPort() : url.getDefaultPort(); + try { + mUrl = new URL(url.getProtocol().toLowerCase(), url.getHost().toLowerCase(), port, ""); + } catch (MalformedURLException e) { + throw new AssertionError( + "Url should always be validated before calling the constructor."); + } + } + + public String getDomain() { + return mUrl.getHost(); + } + + public String getPath() { + return mUrl.getPath(); + } + + public String getScheme() { + return mUrl.getProtocol(); + } + + public int getPort() { + return mUrl.getPort(); + } + + @Override + public String toJson() { + AssetJsonWriter writer = new AssetJsonWriter(); + + writer.writeFieldLower(Utils.NAMESPACE_FIELD, Utils.NAMESPACE_WEB); + writer.writeFieldLower(Utils.WEB_ASSET_FIELD_SITE, mUrl.toExternalForm()); + + return writer.closeAndGetString(); + } + + @Override + public String toString() { + StringBuilder asset = new StringBuilder(); + asset.append("WebAsset: "); + asset.append(toJson()); + return asset.toString(); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof WebAsset)) { + return false; + } + + return ((WebAsset) o).toJson().equals(toJson()); + } + + @Override + public int hashCode() { + return toJson().hashCode(); + } + + @Override + public int lookupKey() { + return toJson().hashCode(); + } + + /** + * Checks that the input is a valid web asset. + * + * @throws AssociationServiceException if the asset is not well formatted. + */ + protected static WebAsset create(JSONObject asset) + throws AssociationServiceException { + if (asset.optString(Utils.WEB_ASSET_FIELD_SITE).equals("")) { + throw new AssociationServiceException(String.format(MISSING_FIELD_FORMAT_STRING, + Utils.WEB_ASSET_FIELD_SITE)); + } + + URL url; + try { + url = new URL(asset.optString(Utils.WEB_ASSET_FIELD_SITE)); + } catch (MalformedURLException e) { + throw new AssociationServiceException("Url is not well formatted.", e); + } + + String scheme = url.getProtocol().toLowerCase(Locale.US); + if (!scheme.equals("https") && !scheme.equals("http")) { + throw new AssociationServiceException("Expected scheme to be http or https."); + } + + if (url.getUserInfo() != null) { + throw new AssociationServiceException("The url should not contain user info."); + } + + String path = url.getFile(); // This is url.getPath() + url.getQuery(). + if (!path.equals("/") && !path.equals("")) { + throw new AssociationServiceException( + "Site should only have scheme, domain, and port."); + } + + return new WebAsset(url); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/WebAssetMatcher.java b/packages/StatementService/src/com/android/statementservice/retriever/WebAssetMatcher.java new file mode 100644 index 0000000..8a1078b --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/WebAssetMatcher.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +/** + * Match assets that have the same 'site' field. + */ +/* package private */ final class WebAssetMatcher extends AbstractAssetMatcher { + + private final WebAsset mQuery; + + public WebAssetMatcher(WebAsset query) { + mQuery = query; + } + + @Override + public boolean matches(AbstractAsset asset) { + if (asset instanceof WebAsset) { + WebAsset webAsset = (WebAsset) asset; + return webAsset.toJson().equals(mQuery.toJson()); + } + return false; + } + + @Override + public int getMatchedLookupKey() { + return mQuery.lookupKey(); + } +} diff --git a/packages/StatementService/src/com/android/statementservice/retriever/WebContent.java b/packages/StatementService/src/com/android/statementservice/retriever/WebContent.java new file mode 100644 index 0000000..86a635c --- /dev/null +++ b/packages/StatementService/src/com/android/statementservice/retriever/WebContent.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.statementservice.retriever; + +/** + * An immutable value type representing the response from a web server. + * + * Visible for testing. + * + * @hide + */ +public final class WebContent { + + private final String mContent; + private final Long mExpireTimeMillis; + + public WebContent(String content, Long expireTimeMillis) { + mContent = content; + mExpireTimeMillis = expireTimeMillis; + } + + /** + * Returns the expiration time of the content as specified in the HTTP header. + */ + public Long getExpireTimeMillis() { + return mExpireTimeMillis; + } + + /** + * Returns content of the HTTP message body. + */ + public String getContent() { + return mContent; + } +} diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk index 47ef42a..51fea2a 100644 --- a/packages/SystemUI/Android.mk +++ b/packages/SystemUI/Android.mk @@ -20,6 +20,11 @@ LOCAL_RESOURCE_DIR := \ $(LOCAL_PATH)/res LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages com.android.keyguard +ifneq ($(SYSTEM_UI_INCREMENTAL_BUILDS),) + LOCAL_PROGUARD_ENABLED := disabled + LOCAL_JACK_ENABLED := incremental +endif + include frameworks/base/packages/SettingsLib/common.mk include $(BUILD_PACKAGE) diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 7a58c87..a8a4baa 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -53,6 +53,7 @@ <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> + <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" /> <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" /> @@ -120,6 +121,9 @@ <!-- Screen Capturing --> <uses-permission android:name="android.permission.MANAGE_MEDIA_PROJECTION" /> + <!-- Assist --> + <uses-permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE" /> + <application android:name=".SystemUIApplication" android:persistent="true" @@ -178,15 +182,6 @@ android:excludeFromRecents="true"> </activity> - <receiver - android:name=".recent.RecentsPreloadReceiver" - android:exported="false"> - <intent-filter> - <action android:name="com.android.systemui.recent.action.PRELOAD" /> - <action android:name="com.android.systemui.recent.action.CANCEL_PRELOAD" /> - </intent-filter> - </receiver> - <!-- Alternate Recents --> <activity android:name=".recents.RecentsActivity" android:label="@string/accessibility_desc_recent_apps" @@ -195,6 +190,7 @@ android:excludeFromRecents="true" android:stateNotNeeded="true" android:resumeWhilePausing="true" + android:screenOrientation="behind" android:theme="@style/config_recents_activity_theme"> <intent-filter> <action android:name="com.android.systemui.recents.TOGGLE_RECENTS" /> diff --git a/packages/SystemUI/res/anim/heads_up_enter.xml b/packages/SystemUI/res/anim/heads_up_enter.xml deleted file mode 100644 index 59eef42..0000000 --- a/packages/SystemUI/res/anim/heads_up_enter.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<set xmlns:android="http://schemas.android.com/apk/res/android" - > - <translate - android:interpolator="@android:interpolator/overshoot" - android:fromYDelta="-50%" android:toYDelta="0" - android:duration="@android:integer/config_shortAnimTime" /> - <alpha - android:interpolator="@android:interpolator/decelerate_quad" - android:fromAlpha="0.0" android:toAlpha="1.0" - android:duration="@android:integer/config_shortAnimTime" /> -</set> diff --git a/packages/SystemUI/res/anim/heads_up_exit.xml b/packages/SystemUI/res/anim/heads_up_exit.xml deleted file mode 100644 index 2cad8f6..0000000 --- a/packages/SystemUI/res/anim/heads_up_exit.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<set xmlns:android="http://schemas.android.com/apk/res/android" - > - <translate - android:interpolator="@android:interpolator/overshoot" - android:fromYDelta="0" android:toYDelta="-50%" - android:duration="@android:integer/config_shortAnimTime" /> - <alpha - android:interpolator="@android:interpolator/accelerate_quad" - android:fromAlpha="1.0" android:toAlpha="0.0" - android:duration="@android:integer/config_shortAnimTime" /> -</set> diff --git a/packages/SystemUI/res/anim/ic_qs_signal_blink_1.xml b/packages/SystemUI/res/anim/ic_qs_signal_blink_1.xml new file mode 100644 index 0000000..57b61da --- /dev/null +++ b/packages/SystemUI/res/anim/ic_qs_signal_blink_1.xml @@ -0,0 +1,38 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="#FFFFFFFF"/> + <keyframe + android:fraction="0.32" + android:value="#FFFFFFFF"/> + <keyframe + android:fraction="0.33" + android:value="#4DFFFFFF"/> + <keyframe + android:fraction="1.0" + android:value="#4DFFFFFF"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_qs_signal_blink_2.xml b/packages/SystemUI/res/anim/ic_qs_signal_blink_2.xml new file mode 100644 index 0000000..09694c3 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_qs_signal_blink_2.xml @@ -0,0 +1,44 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="#4DFFFFFF"/> + <keyframe + android:fraction="0.32" + android:value="#4DFFFFFF"/> + <keyframe + android:fraction="0.33" + android:value="#FFFFFFFF"/> + <keyframe + android:fraction="0.66" + android:value="#FFFFFFFF"/> + <keyframe + android:fraction="0.67" + android:value="#4DFFFFFF"/> + <keyframe + android:fraction="1.0" + android:value="#4DFFFFFF"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_qs_signal_blink_3.xml b/packages/SystemUI/res/anim/ic_qs_signal_blink_3.xml new file mode 100644 index 0000000..2270e3f --- /dev/null +++ b/packages/SystemUI/res/anim/ic_qs_signal_blink_3.xml @@ -0,0 +1,38 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="#4DFFFFFF"/> + <keyframe + android:fraction="0.66" + android:value="#4DFFFFFF"/> + <keyframe + android:fraction="0.67" + android:value="#FFFFFFFF"/> + <keyframe + android:fraction="1.0" + android:value="#FFFFFFFF"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_signal_blink_1.xml b/packages/SystemUI/res/anim/ic_signal_blink_1.xml new file mode 100644 index 0000000..ab1905a --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_blink_1.xml @@ -0,0 +1,38 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="@color/light_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="0.32" + android:value="@color/light_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="0.33" + android:value="@color/light_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="1.0" + android:value="@color/light_mode_icon_color_dual_tone_background"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_signal_blink_2.xml b/packages/SystemUI/res/anim/ic_signal_blink_2.xml new file mode 100644 index 0000000..1b7ace2 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_blink_2.xml @@ -0,0 +1,44 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="@color/light_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="0.32" + android:value="@color/light_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="0.33" + android:value="@color/light_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="0.66" + android:value="@color/light_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="0.67" + android:value="@color/light_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="1.0" + android:value="@color/light_mode_icon_color_dual_tone_background"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_signal_blink_3.xml b/packages/SystemUI/res/anim/ic_signal_blink_3.xml new file mode 100644 index 0000000..cee831c --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_blink_3.xml @@ -0,0 +1,38 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="@color/light_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="0.66" + android:value="@color/light_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="0.67" + android:value="@color/light_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="1.0" + android:value="@color/light_mode_icon_color_dual_tone_fill"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_signal_dark_blink_1.xml b/packages/SystemUI/res/anim/ic_signal_dark_blink_1.xml new file mode 100644 index 0000000..9d398fa --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_dark_blink_1.xml @@ -0,0 +1,38 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="@color/dark_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="0.32" + android:value="@color/dark_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="0.33" + android:value="@color/dark_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="1.0" + android:value="@color/dark_mode_icon_color_dual_tone_background"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_signal_dark_blink_2.xml b/packages/SystemUI/res/anim/ic_signal_dark_blink_2.xml new file mode 100644 index 0000000..c6e213d --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_dark_blink_2.xml @@ -0,0 +1,44 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="@color/dark_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="0.32" + android:value="@color/dark_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="0.33" + android:value="@color/dark_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="0.66" + android:value="@color/dark_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="0.67" + android:value="@color/dark_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="1.0" + android:value="@color/dark_mode_icon_color_dual_tone_background"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_signal_dark_blink_3.xml b/packages/SystemUI/res/anim/ic_signal_dark_blink_3.xml new file mode 100644 index 0000000..dce148c --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_dark_blink_3.xml @@ -0,0 +1,38 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:anim/linear_interpolator" + android:duration="@integer/carrier_network_change_anim_time" + android:repeatCount="-1"> + + <propertyValuesHolder + android:propertyName="fillColor" + android:valueType="colorType"> + <keyframe + android:fraction="0.0" + android:value="@color/dark_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="0.66" + android:value="@color/dark_mode_icon_color_dual_tone_background"/> + <keyframe + android:fraction="0.67" + android:value="@color/dark_mode_icon_color_dual_tone_fill"/> + <keyframe + android:fraction="1.0" + android:value="@color/dark_mode_icon_color_dual_tone_fill"/> + </propertyValuesHolder> + +</objectAnimator> diff --git a/packages/SystemUI/res/anim/ic_volume_collapse_chevron_02_animation.xml b/packages/SystemUI/res/anim/ic_volume_collapse_chevron_02_animation.xml new file mode 100644 index 0000000..443f2a6 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_volume_collapse_chevron_02_animation.xml @@ -0,0 +1,25 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + + <objectAnimator + android:duration="250" + android:interpolator="@android:interpolator/fast_out_slow_in" + android:pathData="M 12.0,9.0 c 0.0,0.66667 0.0,5.0 0.0,6.0" + android:propertyXName="translateX" + android:propertyYName="translateY" /> + +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/ic_volume_collapse_rectangle_1_animation.xml b/packages/SystemUI/res/anim/ic_volume_collapse_rectangle_1_animation.xml new file mode 100644 index 0000000..d82f670 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_volume_collapse_rectangle_1_animation.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + + <objectAnimator + android:duration="200" + android:interpolator="@interpolator/ic_volume_collapse_animation_interpolator_0" + android:propertyName="rotation" + android:valueFrom="45.0" + android:valueTo="-45.0" + android:valueType="floatType" /> + +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/ic_volume_collapse_rectangle_2_animation.xml b/packages/SystemUI/res/anim/ic_volume_collapse_rectangle_2_animation.xml new file mode 100644 index 0000000..0bc66bd --- /dev/null +++ b/packages/SystemUI/res/anim/ic_volume_collapse_rectangle_2_animation.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + + <objectAnimator + android:duration="200" + android:interpolator="@interpolator/ic_volume_collapse_animation_interpolator_0" + android:propertyName="rotation" + android:valueFrom="-45.0" + android:valueTo="45.0" + android:valueType="floatType" /> + +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/ic_volume_expand_chevron_01_animation.xml b/packages/SystemUI/res/anim/ic_volume_expand_chevron_01_animation.xml new file mode 100644 index 0000000..e43e645 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_volume_expand_chevron_01_animation.xml @@ -0,0 +1,25 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + + <objectAnimator + android:duration="250" + android:interpolator="@android:interpolator/fast_out_slow_in" + android:pathData="M 12.0,15.0 c 0.0,-1.0 0.0,-5.33333 0.0,-6.0" + android:propertyXName="translateX" + android:propertyYName="translateY" /> + +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/ic_volume_expand_rectangle_3_animation.xml b/packages/SystemUI/res/anim/ic_volume_expand_rectangle_3_animation.xml new file mode 100644 index 0000000..9b575d8 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_volume_expand_rectangle_3_animation.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + + <objectAnimator + android:duration="200" + android:interpolator="@interpolator/ic_volume_expand_animation_interpolator_0" + android:propertyName="rotation" + android:valueFrom="45.0" + android:valueTo="-45.0" + android:valueType="floatType" /> + +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/anim/ic_volume_expand_rectangle_4_animation.xml b/packages/SystemUI/res/anim/ic_volume_expand_rectangle_4_animation.xml new file mode 100644 index 0000000..6ae0fef --- /dev/null +++ b/packages/SystemUI/res/anim/ic_volume_expand_rectangle_4_animation.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + + <objectAnimator + android:duration="200" + android:interpolator="@interpolator/ic_volume_expand_animation_interpolator_0" + android:propertyName="rotation" + android:valueFrom="-45.0" + android:valueTo="45.0" + android:valueType="floatType" /> + +</set>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/assist_orb_navbar_scrim.xml b/packages/SystemUI/res/drawable/assist_orb_navbar_scrim.xml new file mode 100644 index 0000000..52ed76d --- /dev/null +++ b/packages/SystemUI/res/drawable/assist_orb_navbar_scrim.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + ~ Copyright (C) 2014 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <gradient + android:type="linear" + android:angle="90" + android:startColor="#33000000" + android:endColor="#00000000" /> +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/search_panel_scrim.xml b/packages/SystemUI/res/drawable/assist_orb_scrim.xml index bbb2617..bbb2617 100644 --- a/packages/SystemUI/res/drawable/search_panel_scrim.xml +++ b/packages/SystemUI/res/drawable/assist_orb_scrim.xml diff --git a/packages/SystemUI/res/drawable/btn_borderless_rect.xml b/packages/SystemUI/res/drawable/btn_borderless_rect.xml index d640141..c0a89f9 100644 --- a/packages/SystemUI/res/drawable/btn_borderless_rect.xml +++ b/packages/SystemUI/res/drawable/btn_borderless_rect.xml @@ -1,5 +1,5 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2014 The Android Open Source Project +<!-- + Copyright (C) 2015 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -13,13 +13,15 @@ See the License for the specific language governing permissions and limitations under the License. --> - <ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="?android:attr/colorControlHighlight"> + android:color="?android:attr/colorControlHighlight" > + <item android:id="@android:id/mask"> <shape> <corners android:radius="@dimen/borderless_button_radius" /> + <solid android:color="@android:color/white" /> </shape> </item> + </ripple>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_audio_alarm.xml b/packages/SystemUI/res/drawable/ic_audio_alarm.xml deleted file mode 100644 index 91010a3..0000000 --- a/packages/SystemUI/res/drawable/ic_audio_alarm.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28.0dp" - android:height="28.0dp" - android:viewportWidth="48.0" - android:viewportHeight="48.0"> - <path - android:fillColor="#ffffffff" - android:pathData="M44.0,11.44l-9.19,-7.71 -2.57,3.06 9.19,7.71 2.57,-3.06zm-28.24,-4.66l-2.57,-3.06 -9.19,7.71 2.57,3.06 9.19,-7.71zm9.24,9.22l-3.0,0.0l0.0,12.0l9.49,5.71 1.51,-2.47 -8.0,-4.74l0.0,-10.5zm-1.01,-8.0c-9.95,0.0 -17.99,8.06 -17.99,18.0s8.04,18.0 17.99,18.0 18.01,-8.06 18.01,-18.0 -8.06,-18.0 -18.01,-18.0zm0.01,32.0c-7.73,0.0 -14.0,-6.27 -14.0,-14.0s6.27,-14.0 14.0,-14.0 14.0,6.27 14.0,14.0 -6.26,14.0 -14.0,14.0z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml b/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml deleted file mode 100644 index dd124d7..0000000 --- a/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28.0dp" - android:height="28.0dp" - android:viewportWidth="48.0" - android:viewportHeight="48.0"> - <path - android:fillColor="#ffffffff" - android:pathData="M24.0,12.0c7.73,0.0 14.0,6.27 14.0,14.0 0.0,1.69 -0.31,3.3 -0.86,4.8l3.04,3.04c1.16,-2.37 1.82,-5.03 1.82,-7.84 0.0,-9.94 -8.06,-18.0 -18.01,-18.0 -2.81,0.0 -5.46,0.66 -7.84,1.81l3.05,3.05c1.5,-0.55 3.11,-0.86 4.8,-0.86zm20.0,-0.56l-9.19,-7.71 -2.57,3.06 9.19,7.71 2.57,-3.06zm-38.16,-6.85l-2.55,2.54 2.66,2.66 -2.22,1.86 2.84,2.84 2.22,-1.86 1.6,1.6c-2.73,3.16 -4.39,7.27 -4.39,11.77 0.0,9.94 8.04,18.0 17.99,18.0 4.51,0.0 8.62,-1.67 11.77,-4.4l4.4,4.4 2.54,-2.55 -34.91,-34.91 -1.95,-1.95zm27.1,32.19c-2.43,2.01 -5.54,3.22 -8.94,3.22 -7.73,0.0 -14.0,-6.27 -14.0,-14.0 0.0,-3.4 1.21,-6.51 3.22,-8.94l19.72,19.72zm-16.91,-30.23l-2.84,-2.84 -1.7,1.43 2.84,2.84 1.7,-1.43z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml b/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml deleted file mode 100644 index 718eee5..0000000 --- a/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" - android:viewportWidth="48.0" - android:viewportHeight="48.0"> - - <path - android:fillColor="#FFFFFFFF" - android:pathData="M26.0,11.8l3.8,3.8l-3.2,3.2l2.8,2.8l6.0,-6.0L24.0,4.2l-2.0,0.0l0.0,10.1l4.0,4.0L26.0,11.8zM10.8,8.2L8.0,11.0l13.2,13.2L10.0,35.3l2.8,2.8L22.0,29.0l0.0,15.2l2.0,0.0l8.6,-8.6l4.6,4.6l2.8,-2.8L10.8,8.2zM26.0,36.5L26.0,29.0l3.8,3.8L26.0,36.5z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_audio_phone.xml b/packages/SystemUI/res/drawable/ic_audio_phone.xml deleted file mode 100644 index 64147f2..0000000 --- a/packages/SystemUI/res/drawable/ic_audio_phone.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* - * Copyright 2014, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ ---> - -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@*android:drawable/ic_audio_phone_am_alpha" - android:autoMirrored="true" - android:tint="#ffffffff" />
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_audio_remote.xml b/packages/SystemUI/res/drawable/ic_audio_remote.xml deleted file mode 100644 index 762878b..0000000 --- a/packages/SystemUI/res/drawable/ic_audio_remote.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" - android:viewportWidth="48.0" - android:viewportHeight="48.0"> - - <path - android:fillColor="#FFFFFFFF" - android:pathData="M2.0,36.0l0.0,6.0l6.0,0.0C8.0,38.7 5.3,36.0 2.0,36.0zM2.0,28.0l0.0,4.0c5.5,0.0 10.0,4.5 10.0,10.0l4.0,0.0C16.0,34.3 9.7,28.0 2.0,28.0zM38.0,14.0L10.0,14.0l0.0,3.3c7.9,2.6 14.2,8.8 16.7,16.7L38.0,34.0L38.0,14.0zM2.0,20.0l0.0,4.0c9.9,0.0 18.0,8.1 18.0,18.0l4.0,0.0C24.0,29.8 14.1,20.0 2.0,20.0zM42.0,6.0L6.0,6.0c-2.2,0.0 -4.0,1.8 -4.0,4.0l0.0,6.0l4.0,0.0l0.0,-6.0l36.0,0.0l0.0,28.0L28.0,38.0l0.0,4.0l14.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L46.0,10.0C46.0,7.8 44.2,6.0 42.0,6.0z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml b/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml deleted file mode 100644 index 8a7c7ec..0000000 --- a/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28.0dp" - android:height="28.0dp" - android:viewportWidth="48.0" - android:viewportHeight="48.0"> - <path - android:fillColor="#ffffffff" - android:pathData="M33.0,24.0c0.0,-3.53 -2.04,-6.58 -5.0,-8.05l0.0,4.42l4.91,4.91c0.06,-0.42 0.09,-0.85 0.09,-1.28zm5.0,0.0c0.0,1.88 -0.41,3.65 -1.08,5.28l3.03,3.03C41.25,29.82 42.0,27.0 42.0,24.0c0.0,-8.56 -5.99,-15.72 -14.0,-17.54l0.0,4.13c5.78,1.72 10.0,7.07 10.0,13.41zM8.55,6.0L6.0,8.55 15.45,18.0L6.0,18.0l0.0,12.0l8.0,0.0l10.0,10.0L24.0,26.55l8.51,8.51c-1.34,1.03 -2.85,1.86 -4.51,2.36l0.0,4.13c2.75,-0.63 5.26,-1.89 7.37,-3.62L39.45,42.0 42.0,39.45l-18.0,-18.0L8.55,6.0zM24.0,8.0l-4.18,4.18L24.0,16.36L24.0,8.0z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_audio_bt.xml b/packages/SystemUI/res/drawable/ic_delete.xml index c0da519..4e80ddf 100644 --- a/packages/SystemUI/res/drawable/ic_audio_bt.xml +++ b/packages/SystemUI/res/drawable/ic_delete.xml @@ -1,5 +1,5 @@ <!-- -Copyright (C) 2014 The Android Open Source Project +Copyright (C) 2015 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,12 +14,11 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" + android:width="24.0dp" + android:height="24.0dp" android:viewportWidth="48.0" android:viewportHeight="48.0"> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M35.4,15.4L24.0,4.0l-2.0,0.0l0.0,15.2L12.8,10.0L10.0,12.8L21.2,24.0L10.0,35.2l2.8,2.8l9.2,-9.2L22.0,44.0l2.0,0.0l11.4,-11.4L26.8,24.0L35.4,15.4zM26.0,11.7l3.8,3.8L26.0,19.2L26.0,11.7zM29.8,32.6L26.0,36.3l0.0,-7.5L29.8,32.6z"/> + android:fillColor="#ffffffff" + android:pathData="M12 38c0 2.21 1.79 4 4 4h16c2.21 0 4,-1.79 4,-4V14H12v24zM38 8h-7l-2,-2H19l-2 2h-7v4h28V8z"/> </vector> diff --git a/packages/SystemUI/res/drawable/ic_dnd.xml b/packages/SystemUI/res/drawable/ic_dnd.xml new file mode 100644 index 0000000..17ecf21 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_dnd.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24dp" > + + <path + android:fillColor="#FFFFFFFF" + android:pathData="M24.0,4.0C12.95,4.0 4.0,12.95 4.0,24.0s8.95,20.0 20.0,20.0 20.0,-8.95 20.0,-20.0S35.05,4.0 24.0,4.0zm10.0,22.0L14.0,26.0l0.0,-4.0l20.0,0.0l0.0,4.0z" /> + +</vector> diff --git a/packages/SystemUI/res/drawable/ic_fingerprint.xml b/packages/SystemUI/res/drawable/ic_fingerprint.xml new file mode 100644 index 0000000..ee2cf03 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_fingerprint.xml @@ -0,0 +1,36 @@ +<!-- + ~ Copyright (C) 2015 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="32.0dp" + android:viewportWidth="32.0" + android:viewportHeight="32.0"> + <path + android:fillColor="#80ffffff" + android:pathData="M23.7,5.9c-0.1,0.0 -0.2,0.0 -0.3,-0.1C21.0,4.5 18.6,3.9 16.0,3.9c-2.5,0.0 -4.6,0.6 -6.9,1.9C8.8,6.0 8.3,5.9 8.1,5.5C7.9,5.2 8.0,4.7 8.4,4.5c2.5,-1.4 4.9,-2.1 7.7,-2.1c2.8,0.0 5.4,0.7 8.0,2.1c0.4,0.2 0.5,0.6 0.3,1.0C24.2,5.7 24.0,5.9 23.7,5.9z"/> + <path + android:fillColor="#80ffffff" + android:pathData="M5.3,13.2c-0.1,0.0 -0.3,0.0 -0.4,-0.1c-0.3,-0.2 -0.4,-0.7 -0.2,-1.0c1.3,-1.9 2.9,-3.4 4.9,-4.5c4.1,-2.2 9.3,-2.2 13.4,0.0c1.9,1.1 3.6,2.5 4.9,4.4c0.2,0.3 0.1,0.8 -0.2,1.0c-0.3,0.2 -0.8,0.1 -1.0,-0.2c-1.2,-1.7 -2.6,-3.0 -4.3,-4.0c-3.7,-2.0 -8.3,-2.0 -12.0,0.0c-1.7,0.9 -3.2,2.3 -4.3,4.0C5.7,13.1 5.5,13.2 5.3,13.2z"/> + <path + android:fillColor="#80ffffff" + android:pathData="M13.3,29.6c-0.2,0.0 -0.4,-0.1 -0.5,-0.2c-1.1,-1.2 -1.7,-2.0 -2.6,-3.6c-0.9,-1.7 -1.4,-3.7 -1.4,-5.9c0.0,-4.1 3.3,-7.4 7.4,-7.4c4.1,0.0 7.4,3.3 7.4,7.4c0.0,0.4 -0.3,0.7 -0.7,0.7s-0.7,-0.3 -0.7,-0.7c0.0,-3.3 -2.7,-5.9 -5.9,-5.9c-3.3,0.0 -5.9,2.7 -5.9,5.9c0.0,2.0 0.4,3.8 1.2,5.2c0.8,1.6 1.4,2.2 2.4,3.3c0.3,0.3 0.3,0.8 0.0,1.0C13.7,29.5 13.5,29.6 13.3,29.6z"/> + <path + android:fillColor="#80ffffff" + android:pathData="M22.6,27.1c-1.6,0.0 -2.9,-0.4 -4.1,-1.2c-1.9,-1.4 -3.1,-3.6 -3.1,-6.0c0.0,-0.4 0.3,-0.7 0.7,-0.7s0.7,0.3 0.7,0.7c0.0,1.9 0.9,3.7 2.5,4.8c0.9,0.6 1.9,1.0 3.2,1.0c0.3,0.0 0.8,0.0 1.3,-0.1c0.4,-0.1 0.8,0.2 0.8,0.6c0.1,0.4 -0.2,0.8 -0.6,0.8C23.4,27.1 22.8,27.1 22.6,27.1z"/> + <path + android:fillColor="#80ffffff" + android:pathData="M20.0,29.9c-0.1,0.0 -0.1,0.0 -0.2,0.0c-2.1,-0.6 -3.4,-1.4 -4.8,-2.9c-1.8,-1.9 -2.8,-4.4 -2.8,-7.1c0.0,-2.2 1.8,-4.1 4.1,-4.1c2.2,0.0 4.1,1.8 4.1,4.1c0.0,1.4 1.2,2.6 2.6,2.6c1.4,0.0 2.6,-1.2 2.6,-2.6c0.0,-5.1 -4.2,-9.3 -9.3,-9.3c-3.6,0.0 -6.9,2.1 -8.4,5.4C7.3,17.1 7.0,18.4 7.0,19.8c0.0,1.1 0.1,2.7 0.9,4.9c0.1,0.4 -0.1,0.8 -0.4,0.9c-0.4,0.1 -0.8,-0.1 -0.9,-0.4c-0.6,-1.8 -0.9,-3.6 -0.9,-5.4c0.0,-1.6 0.3,-3.1 0.9,-4.4c1.7,-3.8 5.6,-6.3 9.8,-6.3c5.9,0.0 10.7,4.8 10.7,10.7c0.0,2.2 -1.8,4.1 -4.1,4.1s-4.0,-1.8 -4.0,-4.1c0.0,-1.4 -1.2,-2.6 -2.6,-2.6c-1.4,0.0 -2.6,1.2 -2.6,2.6c0.0,2.3 0.9,4.5 2.4,6.1c1.2,1.3 2.4,2.0 4.2,2.5c0.4,0.1 0.6,0.5 0.5,0.9C20.6,29.7 20.3,29.9 20.0,29.9z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_fingerprint_error.xml b/packages/SystemUI/res/drawable/ic_fingerprint_error.xml new file mode 100644 index 0000000..11e83a1 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_fingerprint_error.xml @@ -0,0 +1,30 @@ +<!-- +Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="32.0dp" + android:height="32.0dp" + android:viewportWidth="32.0" + android:viewportHeight="32.0"> + <path + android:fillColor="@color/system_warning_color" + android:pathData="M15.99,2.5C8.53,2.5 2.5,8.54 2.5,16.0s6.03,13.5 13.49,13.5S29.5,23.46 29.5,16.0S23.45,2.5 15.99,2.5zM16.0,26.8c-5.97,0.0 -10.8,-4.83 -10.8,-10.8S10.03,5.2 16.0,5.2S26.8,10.03 26.8,16.0S21.97,26.8 16.0,26.8z"/> + <path + android:fillColor="@color/system_warning_color" + android:pathData="M14.65,20.05l2.7,0.0l0.0,2.7l-2.7,0.0z"/> + <path + android:fillColor="@color/system_warning_color" + android:pathData="M14.65,9.25l2.7,0.0l0.0,8.1l-2.7,0.0z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_audio_vol.xml b/packages/SystemUI/res/drawable/ic_person.xml index 587ea89..101911f 100644 --- a/packages/SystemUI/res/drawable/ic_audio_vol.xml +++ b/packages/SystemUI/res/drawable/ic_person.xml @@ -1,5 +1,5 @@ <!-- -Copyright (C) 2014 The Android Open Source Project +Copyright (C) 2015 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,11 +14,11 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28.0dp" - android:height="28.0dp" + android:width="24.0dp" + android:height="24.0dp" android:viewportWidth="48.0" android:viewportHeight="48.0"> <path android:fillColor="#ffffffff" - android:pathData="M6.0,18.0l0.0,12.0l8.0,0.0l10.0,10.0L24.0,8.0L14.0,18.0L6.0,18.0zm27.0,6.0c0.0,-3.53 -2.04,-6.58 -5.0,-8.05l0.0,16.11c2.96,-1.48 5.0,-4.53 5.0,-8.06zM28.0,6.46l0.0,4.13c5.78,1.72 10.0,7.07 10.0,13.41s-4.22,11.69 -10.0,13.41l0.0,4.13c8.01,-1.82 14.0,-8.97 14.0,-17.54S36.01,8.28 28.0,6.46z"/> + android:pathData="M24 24c4.42 0 8,-3.59 8,-8 0,-4.42,-3.58,-8,-8,-8s-8 3.58,-8 8c0 4.41 3.58 8 8 8zm0 4c-5.33 0,-16 2.67,-16 8v4h32v-4c0,-5.33,-10.67,-8,-16,-8z"/> </vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_minus.xml b/packages/SystemUI/res/drawable/ic_qs_minus.xml index 4722c9e..6a3410a 100644 --- a/packages/SystemUI/res/drawable/ic_qs_minus.xml +++ b/packages/SystemUI/res/drawable/ic_qs_minus.xml @@ -1,25 +1,26 @@ <!-- -Copyright (C) 2014 The Android Open Source Project + Copyright (C) 2015 The Android Open Source Project - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="48.0" - android:viewportHeight="48.0"> + android:height="24.0dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24.0dp" > <path android:fillColor="#FFFFFFFF" - android:pathData="M24.0,4.0C13.0,4.0 4.0,13.0 4.0,24.0s9.0,20.0 20.0,20.0c11.0,0.0 20.0,-9.0 20.0,-20.0S35.0,4.0 24.0,4.0zM34.0,26.0L14.0,26.0l0.0,-4.0l20.0,0.0L34.0,26.0z"/> -</vector> + android:pathData="M38.0,26.0L10.0,26.0l0.0,-4.0l28.0,0.0l0.0,4.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_qs_plus.xml b/packages/SystemUI/res/drawable/ic_qs_plus.xml index 17d74cf..393f51c 100644 --- a/packages/SystemUI/res/drawable/ic_qs_plus.xml +++ b/packages/SystemUI/res/drawable/ic_qs_plus.xml @@ -1,25 +1,26 @@ <!-- -Copyright (C) 2014 The Android Open Source Project + Copyright (C) 2015 The Android Open Source Project - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="48.0" - android:viewportHeight="48.0"> + android:height="24.0dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24.0dp" > <path android:fillColor="#FFFFFFFF" - android:pathData="M24.0,4.0C13.0,4.0 4.0,13.0 4.0,24.0s9.0,20.0 20.0,20.0c11.0,0.0 20.0,-9.0 20.0,-20.0S35.0,4.0 24.0,4.0zM34.0,26.0l-8.0,0.0l0.0,8.0l-4.0,0.0l0.0,-8.0l-8.0,0.0l0.0,-4.0l8.0,0.0l0.0,-8.0l4.0,0.0l0.0,8.0l8.0,0.0L34.0,26.0z"/> -</vector> + android:pathData="M38.0,26.0L26.0,26.0l0.0,12.0l-4.0,0.0L22.0,26.0L10.0,26.0l0.0,-4.0l12.0,0.0L22.0,10.0l4.0,0.0l0.0,12.0l12.0,0.0l0.0,4.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change.xml index 4bff96d..96e2fd4 100644 --- a/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml +++ b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change.xml @@ -1,7 +1,7 @@ <!-- -Copyright (C) 2014 The Android Open Source Project + Copyright (C) 2015 The Android Open Source Project - Licensed under the Apache License, Version 2.0 (the "License"); + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at @@ -14,12 +14,23 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" + android:width="32dp" + android:height="32dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> - <path + android:name="dot1" android:fillColor="#FFFFFFFF" - android:pathData="M0.0,15.0l2.0,0.0L2.0,9.0L0.0,9.0L0.0,15.0zM3.0,17.0l2.0,0.0L5.0,7.0L3.0,7.0L3.0,17.0zM22.0,9.0l0.0,6.0l2.0,0.0L24.0,9.0L22.0,9.0zM19.0,17.0l2.0,0.0L21.0,7.0l-2.0,0.0L19.0,17.0zM16.5,3.0l-9.0,0.0C6.7,3.0 6.0,3.7 6.0,4.5l0.0,15.0C6.0,20.3 6.7,21.0 7.5,21.0l9.0,0.0c0.8,0.0 1.5,-0.7 1.5,-1.5l0.0,-15.0C18.0,3.7 17.3,3.0 16.5,3.0zM16.0,19.0L8.0,19.0L8.0,5.0l8.0,0.0L16.0,19.0z"/> + android:pathData="M9.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> + <path + android:name="dot2" + android:fillColor="#4DFFFFFF" + android:pathData="M14.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> + <path + android:name="dot3" + android:fillColor="#4DFFFFFF" + android:pathData="M19.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> + <path + android:fillColor="#4DFFFFFF" + android:pathData="M2.0,22.0l6.0,0.0 0.0,-4.0 14.0,0.0 0.0,-16.0z"/> </vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml new file mode 100644 index 0000000..2186aa8 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_carrier_network_change_animation.xml @@ -0,0 +1,27 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/ic_qs_signal_carrier_network_change" > + <target + android:name="dot1" + android:animation="@anim/ic_qs_signal_blink_1"/> + <target + android:name="dot2" + android:animation="@anim/ic_qs_signal_blink_2"/> + <target + android:name="dot3" + android:animation="@anim/ic_qs_signal_blink_3"/> +</animated-vector> diff --git a/packages/SystemUI/res/drawable/ic_ringer_audible.xml b/packages/SystemUI/res/drawable/ic_ringer_audible.xml deleted file mode 100644 index fd50617..0000000 --- a/packages/SystemUI/res/drawable/ic_ringer_audible.xml +++ /dev/null @@ -1,25 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - - <path - android:fillColor="#FFFFFFFF" - android:pathData="M11.5,22.0c1.1,0.0 2.0,-0.9 2.0,-2.0l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0zM18.0,16.0l0.0,-5.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7c-2.9,0.7 -5.0,3.2 -5.0,6.3L5.0,16.0l-2.0,2.0l0.0,1.0l17.0,0.0l0.0,-1.0L18.0,16.0z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_ringer_mute.xml b/packages/SystemUI/res/drawable/ic_ringer_mute.xml deleted file mode 100644 index b29a139..0000000 --- a/packages/SystemUI/res/drawable/ic_ringer_mute.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- -Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28dp" - android:height="28dp" - android:viewportWidth="48.0" - android:viewportHeight="48.0"> - <path - android:fillColor="#FFFFFFFF" - android:pathData="M23.000000,44.000000c2.200000,0.000000 4.000000,-1.800000 4.000000,-4.000000l-8.000000,0.000000C19.000000,42.200001 20.799999,44.000000 23.000000,44.000000zM36.000000,21.000000c0.000000,-6.100000 -4.300000,-11.300000 -10.000000,-12.600000L26.000000,7.000000c0.000000,-1.700000 -1.300000,-3.000000 -3.000000,-3.000000c-1.700000,0.000000 -3.000000,1.300000 -3.000000,3.000000l0.000000,1.400000c-1.000000,0.200000 -2.000000,0.600000 -2.900000,1.100000L36.000000,28.400000L36.000000,21.000000zM35.500000,38.000000l4.000000,4.000000l2.500000,-2.500000L8.500000,6.000000L6.000000,8.500000l5.800000,5.800000C10.700000,16.299999 10.000000,18.600000 10.000000,21.000000l0.000000,11.000000l-4.000000,4.000000l0.000000,2.000000L35.500000,38.000000z"/> -</vector> diff --git a/packages/SystemUI/res/drawable/ic_volume_alarm.xml b/packages/SystemUI/res/drawable/ic_volume_alarm.xml new file mode 100644 index 0000000..a8ca0d6 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_alarm.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M44.0,11.44l-9.19,-7.71 -2.57,3.06 9.19,7.71 2.57,-3.06zm-28.24,-4.66l-2.57,-3.06 -9.19,7.71 2.57,3.06 9.19,-7.71zm9.24,9.22l-3.0,0.0l0.0,12.0l9.49,5.71 1.51,-2.47 -8.0,-4.74l0.0,-10.5zm-1.01,-8.0c-9.95,0.0 -17.99,8.06 -17.99,18.0s8.04,18.0 17.99,18.0 18.01,-8.06 18.01,-18.0 -8.06,-18.0 -18.01,-18.0zm0.01,32.0c-7.73,0.0 -14.0,-6.27 -14.0,-14.0s6.27,-14.0 14.0,-14.0 14.0,6.27 14.0,14.0 -6.26,14.0 -14.0,14.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_alarm_mute.xml b/packages/SystemUI/res/drawable/ic_volume_alarm_mute.xml new file mode 100644 index 0000000..8e2f083 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_alarm_mute.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M24.0,12.0c7.73,0.0 14.0,6.27 14.0,14.0 0.0,1.69 -0.31,3.3 -0.86,4.8l3.04,3.04c1.16,-2.37 1.82,-5.03 1.82,-7.84 0.0,-9.94 -8.06,-18.0 -18.01,-18.0 -2.81,0.0 -5.46,0.66 -7.84,1.81l3.05,3.05c1.5,-0.55 3.11,-0.86 4.8,-0.86zm20.0,-0.56l-9.19,-7.71 -2.57,3.06 9.19,7.71 2.57,-3.06zm-38.16,-6.85l-2.55,2.54 2.66,2.66 -2.22,1.86 2.84,2.84 2.22,-1.86 1.6,1.6c-2.73,3.16 -4.39,7.27 -4.39,11.77 0.0,9.94 8.04,18.0 17.99,18.0 4.51,0.0 8.62,-1.67 11.77,-4.4l4.4,4.4 2.54,-2.55 -34.91,-34.91 -1.95,-1.95zm27.1,32.19c-2.43,2.01 -5.54,3.22 -8.94,3.22 -7.73,0.0 -14.0,-6.27 -14.0,-14.0 0.0,-3.4 1.21,-6.51 3.22,-8.94l19.72,19.72zm-16.91,-30.23l-2.84,-2.84 -1.7,1.43 2.84,2.84 1.7,-1.43z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_bt_sco.xml b/packages/SystemUI/res/drawable/ic_volume_bt_sco.xml new file mode 100644 index 0000000..71df4d3 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_bt_sco.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M29.41,19.0L34.0,14.41L34.0,22.0l1.0,0.0l5.71,-5.71 -4.3,-4.29 4.29,-4.29L35.0,2.0l-1.0,0.0l0.0,7.59L29.41,5.0 28.0,6.41 33.59,12.0 28.0,17.59 29.41,19.0zM36.0,5.83l1.88,1.88L36.0,9.59L36.0,5.83zm0.0,8.58l1.88,1.88L36.0,18.17l0.0,-3.76zM40.0,31.0c-2.49,0.0 -4.89,-0.4 -7.14,-1.14 -0.69,-0.22 -1.48,-0.06 -2.0,0.49l-4.4,4.41c-5.67,-2.88 -10.29,-7.51 -13.18,-13.17l4.4,-4.41c0.55,-0.5 0.71,-1.3 0.49,-2.03C17.4,12.9 17.0,10.49 17.0,8.0c0.0,-1.11 -0.89,-2.0 -2.0,-2.0L8.0,6.0c-1.11,0.0 -2.0,0.89 -2.0,2.0 0.0,18.78 15.22,34.0 34.0,34.0 1.11,0.0 2.0,-0.89 2.0,-2.0l0.0,-7.0c0.0,-1.11 -0.89,-2.0 -2.0,-2.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_collapse.xml b/packages/SystemUI/res/drawable/ic_volume_collapse.xml new file mode 100644 index 0000000..dc6d301 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_collapse.xml @@ -0,0 +1,62 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:name="ic_volume_collapse" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + + <group + android:name="chevron_02" + android:rotation="90" + android:translateX="12" + android:translateY="9" > + <group + android:name="rectangle_2" + android:rotation="-45" > + <group + android:name="rectangle_2_pivot" + android:translateY="4" > + <group + android:name="rectangle_path_2_position" + android:translateY="-1" > + <path + android:name="rectangle_path_2" + android:fillColor="#FFFFFFFF" + android:pathData="M -1.0,-4.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,8.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-8.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" /> + </group> + </group> + </group> + <group + android:name="rectangle_1" + android:rotation="45" > + <group + android:name="rectangle_1_pivot" + android:translateY="-4" > + <group + android:name="rectangle_path_1_position" + android:translateY="1" > + <path + android:name="rectangle_path_1" + android:fillColor="#FFFFFFFF" + android:pathData="M -1.0,-4.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,8.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-8.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" /> + </group> + </group> + </group> + </group> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_collapse_animation.xml b/packages/SystemUI/res/drawable/ic_volume_collapse_animation.xml new file mode 100644 index 0000000..5c482bc --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_collapse_animation.xml @@ -0,0 +1,29 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/ic_volume_collapse" > + + <target + android:name="chevron_02" + android:animation="@anim/ic_volume_collapse_chevron_02_animation" /> + <target + android:name="rectangle_2" + android:animation="@anim/ic_volume_collapse_rectangle_2_animation" /> + <target + android:name="rectangle_1" + android:animation="@anim/ic_volume_collapse_rectangle_1_animation" /> + +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_expand.xml b/packages/SystemUI/res/drawable/ic_volume_expand.xml new file mode 100644 index 0000000..a60623f --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_expand.xml @@ -0,0 +1,62 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:name="ic_volume_expand" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + + <group + android:name="chevron_01" + android:rotation="90" + android:translateX="12" + android:translateY="15" > + <group + android:name="rectangle_3" + android:rotation="45" > + <group + android:name="rectangle_2_pivot_0" + android:translateY="4" > + <group + android:name="rectangle_path_3_position" + android:translateY="-1" > + <path + android:name="rectangle_path_3" + android:fillColor="#FFFFFFFF" + android:pathData="M -1.0,-4.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,8.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-8.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" /> + </group> + </group> + </group> + <group + android:name="rectangle_4" + android:rotation="-45" > + <group + android:name="rectangle_1_pivot_0" + android:translateY="-4" > + <group + android:name="rectangle_path_4_position" + android:translateY="1" > + <path + android:name="rectangle_path_4" + android:fillColor="#FFFFFFFF" + android:pathData="M -1.0,-4.0 l 2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,8.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -2.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-8.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" /> + </group> + </group> + </group> + </group> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_expand_animation.xml b/packages/SystemUI/res/drawable/ic_volume_expand_animation.xml new file mode 100644 index 0000000..ae2d7e4 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_expand_animation.xml @@ -0,0 +1,29 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/ic_volume_expand" > + + <target + android:name="chevron_01" + android:animation="@anim/ic_volume_expand_chevron_01_animation" /> + <target + android:name="rectangle_3" + android:animation="@anim/ic_volume_expand_rectangle_3_animation" /> + <target + android:name="rectangle_4" + android:animation="@anim/ic_volume_expand_rectangle_4_animation" /> + +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_media.xml b/packages/SystemUI/res/drawable/ic_volume_media.xml new file mode 100644 index 0000000..97089f1 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_media.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M12.0,3.0l0.0,9.28c-0.47,-0.17 -0.97,-0.28 -1.5,-0.28C8.01,12.0 6.0,14.01 6.0,16.5S8.01,21.0 10.5,21.0c2.31,0.0 4.2,-1.75 4.45,-4.0L15.0,17.0L15.0,6.0l4.0,0.0L19.0,3.0l-7.0,0.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_media_bt.xml b/packages/SystemUI/res/drawable/ic_volume_media_bt.xml new file mode 100644 index 0000000..3364d9c --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_media_bt.xml @@ -0,0 +1,29 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24.0dp" + android:height="24.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M17.0,3.0l-7.0,0.0l0.0,9.3C9.5,12.1 9.0,12.0 8.5,12.0C6.0,12.0 4.0,14.0 4.0,16.5S6.0,21.0 8.5,21.0s4.5,-2.3 4.5,-4.5C13.0,14.7 13.0,6.0 13.0,6.0l4.0,0.0L17.0,3.0z"/> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M23.4,9.9L20.5,7.0L20.0,7.0l0.0,3.8l-2.3,-2.3L17.0,9.2l2.8,2.8L17.0,14.8l0.7,0.7l2.3,-2.3L20.0,17.0l0.5,0.0l2.8,-2.8L21.2,12.0L23.4,9.9zM21.0,8.9l0.9,0.9l-0.9,1.0L21.0,8.9zM21.9,14.2L21.0,15.1l0.0,-1.9L21.9,14.2z"/> + +</vector> diff --git a/packages/SystemUI/res/drawable/ic_volume_media_bt_mute.xml b/packages/SystemUI/res/drawable/ic_volume_media_bt_mute.xml new file mode 100644 index 0000000..39f54f1 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_media_bt_mute.xml @@ -0,0 +1,32 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="24dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M13.0,6.0l4.0,0.0L17.0,3.0l-7.0,0.0l0.0,5.6l3.0,3.0C13.0,8.8 13.0,6.0 13.0,6.0z"/> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M2.1,5.7L8.4,12.0C6.0,12.1 4.0,14.0 4.0,16.5S6.0,21.0 8.5,21.0c2.7,0.0 4.5,-2.3 4.5,-4.3l0.0,-0.1l3.9,3.9l1.3,-1.3L3.4,4.5L2.1,5.7z"/> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M23.4,9.9L20.5,7.0L20.0,7.0l0.0,3.8l-2.3,-2.3L17.0,9.2l2.8,2.8L17.0,14.8l0.7,0.7l2.3,-2.3L20.0,17.0l0.5,0.0l2.8,-2.8L21.2,12.0L23.4,9.9zM21.0,8.9l0.9,0.9l-0.9,1.0L21.0,8.9zM21.9,14.2L21.0,15.1l0.0,-1.9L21.9,14.2z"/> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_media_mute.xml b/packages/SystemUI/res/drawable/ic_volume_media_mute.xml new file mode 100644 index 0000000..beb806c --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_media_mute.xml @@ -0,0 +1,29 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M15.0,6.0l4.0,0.0L19.0,3.0l-7.0,0.0l0.0,5.6l3.0,3.0C15.0,8.8 15.0,6.0 15.0,6.0z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M4.8,3.9L3.5,5.1l6.9,6.9C8.0,12.1 6.0,14.0 6.0,16.5C6.0,19.0 8.0,21.0 10.5,21.0c2.7,0.0 4.5,-2.3 4.5,-4.3c0.0,0.0 0.0,-0.1 0.0,-0.1l4.0,4.0l1.3,-1.3L4.8,3.9z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_remote.xml b/packages/SystemUI/res/drawable/ic_volume_remote.xml new file mode 100644 index 0000000..b363178 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_remote.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M2.0,36.0l0.0,6.0l6.0,0.0C8.0,38.7 5.3,36.0 2.0,36.0zM2.0,28.0l0.0,4.0c5.5,0.0 10.0,4.5 10.0,10.0l4.0,0.0C16.0,34.3 9.7,28.0 2.0,28.0zM38.0,14.0L10.0,14.0l0.0,3.3c7.9,2.6 14.2,8.8 16.7,16.7L38.0,34.0L38.0,14.0zM2.0,20.0l0.0,4.0c9.9,0.0 18.0,8.1 18.0,18.0l4.0,0.0C24.0,29.8 14.1,20.0 2.0,20.0zM42.0,6.0L6.0,6.0c-2.2,0.0 -4.0,1.8 -4.0,4.0l0.0,6.0l4.0,0.0l0.0,-6.0l36.0,0.0l0.0,28.0L28.0,38.0l0.0,4.0l14.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L46.0,10.0C46.0,7.8 44.2,6.0 42.0,6.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_remote_mute.xml b/packages/SystemUI/res/drawable/ic_volume_remote_mute.xml new file mode 100644 index 0000000..5f39ad7 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_remote_mute.xml @@ -0,0 +1,38 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M23.7,21.3l-1.1,-1.0c0.0,0.0 0.0,0.0 0.0,0.0L21.0,18.8l0.0,0.0L5.8,5.0l0.0,0.0L3.6,3.0l0.0,0.0L1.7,1.3L0.3,2.7l1.1,1.0C1.2,4.1 1.0,4.5 1.0,5.0l0.0,3.0l2.0,0.0L3.0,5.2L18.2,19.0L14.0,19.0l0.0,2.0l6.4,0.0l1.9,1.7L23.7,21.3z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M21.0,5.0l0.0,11.1l2.0,1.8L23.0,5.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0L6.6,3.0l2.2,2.0L21.0,5.0z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M1.0,18.0l0.0,3.0l3.0,0.0C4.0,19.3 2.7,18.0 1.0,18.0z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M1.0,14.0l0.0,2.0c2.8,0.0 5.0,2.2 5.0,5.0l2.0,0.0C8.0,17.1 4.9,14.0 1.0,14.0z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M1.0,10.0l0.0,2.0c5.0,0.0 9.0,4.0 9.0,9.0l2.0,0.0C12.0,14.9 7.1,10.0 1.0,10.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_ringer.xml b/packages/SystemUI/res/drawable/ic_volume_ringer.xml new file mode 100644 index 0000000..c566d5a --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_ringer.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="24dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M11.5,22.0c1.1,0.0 2.0,-0.9 2.0,-2.0l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0zM18.0,16.0l0.0,-5.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7c-2.9,0.7 -5.0,3.2 -5.0,6.3L5.0,16.0l-2.0,2.0l0.0,1.0l17.0,0.0l0.0,-1.0L18.0,16.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_ringer_mute.xml b/packages/SystemUI/res/drawable/ic_volume_ringer_mute.xml new file mode 100644 index 0000000..0c20361 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_ringer_mute.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M23.000000,44.000000c2.200000,0.000000 4.000000,-1.800000 4.000000,-4.000000l-8.000000,0.000000C19.000000,42.200001 20.799999,44.000000 23.000000,44.000000zM36.000000,21.000000c0.000000,-6.100000 -4.300000,-11.300000 -10.000000,-12.600000L26.000000,7.000000c0.000000,-1.700000 -1.300000,-3.000000 -3.000000,-3.000000c-1.700000,0.000000 -3.000000,1.300000 -3.000000,3.000000l0.000000,1.400000c-1.000000,0.200000 -2.000000,0.600000 -2.900000,1.100000L36.000000,28.400000L36.000000,21.000000zM35.500000,38.000000l4.000000,4.000000l2.500000,-2.500000L8.500000,6.000000L6.000000,8.500000l5.800000,5.800000C10.700000,16.299999 10.000000,18.600000 10.000000,21.000000l0.000000,11.000000l-4.000000,4.000000l0.000000,2.000000L35.500000,38.000000z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_ringer_vibrate.xml b/packages/SystemUI/res/drawable/ic_volume_ringer_vibrate.xml new file mode 100644 index 0000000..38b3234 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_ringer_vibrate.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="24dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M0.0,15.0l2.0,0.0L2.0,9.0L0.0,9.0L0.0,15.0zM3.0,17.0l2.0,0.0L5.0,7.0L3.0,7.0L3.0,17.0zM22.0,9.0l0.0,6.0l2.0,0.0L24.0,9.0L22.0,9.0zM19.0,17.0l2.0,0.0L21.0,7.0l-2.0,0.0L19.0,17.0zM16.5,3.0l-9.0,0.0C6.7,3.0 6.0,3.7 6.0,4.5l0.0,15.0C6.0,20.3 6.7,21.0 7.5,21.0l9.0,0.0c0.8,0.0 1.5,-0.7 1.5,-1.5l0.0,-15.0C18.0,3.7 17.3,3.0 16.5,3.0zM16.0,19.0L8.0,19.0L8.0,5.0l8.0,0.0L16.0,19.0z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_settings.xml b/packages/SystemUI/res/drawable/ic_volume_settings.xml new file mode 100644 index 0000000..9f79b5a --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_settings.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="20dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="20dp" > + + <path + android:fillColor="@color/volume_settings_icon_color" + android:pathData="M19.4,13.0c0.0,-0.3 0.1,-0.6 0.1,-1.0s0.0,-0.7 -0.1,-1.0l2.1,-1.7c0.2,-0.2 0.2,-0.4 0.1,-0.6l-2.0,-3.5C19.5,5.1 19.3,5.0 19.0,5.1l-2.5,1.0c-0.5,-0.4 -1.1,-0.7 -1.7,-1.0l-0.4,-2.6C14.5,2.2 14.2,2.0 14.0,2.0l-4.0,0.0C9.8,2.0 9.5,2.2 9.5,2.4L9.1,5.1C8.5,5.3 8.0,5.7 7.4,6.1L5.0,5.1C4.7,5.0 4.5,5.1 4.3,5.3l-2.0,3.5C2.2,8.9 2.3,9.2 2.5,9.4L4.6,11.0c0.0,0.3 -0.1,0.6 -0.1,1.0s0.0,0.7 0.1,1.0l-2.1,1.7c-0.2,0.2 -0.2,0.4 -0.1,0.6l2.0,3.5C4.5,18.9 4.7,19.0 5.0,18.9l2.5,-1.0c0.5,0.4 1.1,0.7 1.7,1.0l0.4,2.6c0.0,0.2 0.2,0.4 0.5,0.4l4.0,0.0c0.2,0.0 0.5,-0.2 0.5,-0.4l0.4,-2.6c0.6,-0.3 1.2,-0.6 1.7,-1.0l2.5,1.0c0.2,0.1 0.5,0.0 0.6,-0.2l2.0,-3.5c0.1,-0.2 0.1,-0.5 -0.1,-0.6L19.4,13.0zM12.0,15.5c-1.9,0.0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5s3.5,1.6 3.5,3.5S13.9,15.5 12.0,15.5z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_system.xml b/packages/SystemUI/res/drawable/ic_volume_system.xml new file mode 100644 index 0000000..ccd8e18 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_system.xml @@ -0,0 +1,32 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M17.7,14.8l-4.5,-2.3c-0.2,-0.1 -0.4,-0.1 -0.5,-0.1l-0.8,0.0l0.0,-6.0c0.0,-0.8 -0.7,-1.5 -1.5,-1.5S8.9,5.6 8.9,6.4l0.0,10.7l-3.4,-0.7c-0.1,0.0 -0.2,0.0 -0.2,0.0c-0.3,0.0 -0.6,0.1 -0.8,0.3l-0.8,0.8l4.9,4.9c0.3,0.3 0.6,0.4 1.1,0.4l6.8,0.0c0.8,0.0 1.3,-0.6 1.4,-1.3l0.8,-5.3c0.0,-0.1 0.0,-0.1 0.0,-0.2C18.6,15.5 18.2,15.0 17.7,14.8z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M14.3,8.8l1.8,0.9c1.5,-2.0 1.4,-4.8 -0.4,-6.6l-1.4,1.4C15.5,5.7 15.5,7.6 14.3,8.8z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M17.9,10.6l1.8,0.9C22.0,8.0 21.6,3.3 18.5,0.3l-1.4,1.4C19.5,4.1 19.8,7.9 17.9,10.6z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_system_mute.xml b/packages/SystemUI/res/drawable/ic_volume_system_mute.xml new file mode 100644 index 0000000..dfcb655 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_system_mute.xml @@ -0,0 +1,35 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M14.3,8.8l1.8,0.9c1.5,-2.0 1.4,-4.8 -0.4,-6.6l-1.4,1.4C15.5,5.7 15.5,7.6 14.3,8.8z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M17.9,10.6l1.8,0.9C22.0,8.0 21.6,3.3 18.5,0.3l-1.4,1.4C19.5,4.1 19.8,7.9 17.9,10.6z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M22.0,20.6l-3.5,-2.8l0.0,0.0l-9.6,-7.6l0.0,0.0L3.2,5.7L2.0,7.3l6.9,5.4L8.9,17.0l-3.4,-0.7c-0.1,0.0 -0.2,0.0 -0.2,0.0c-0.3,0.0 -0.6,0.1 -0.8,0.3l-0.8,0.8l4.9,4.9c0.3,0.3 0.6,0.4 1.1,0.4l6.8,0.0c0.8,0.0 1.3,-0.6 1.4,-1.3l0.2,-1.5l2.6,2.1L22.0,20.6z" /> + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M11.9,6.4c0.0,-0.8 -0.7,-1.5 -1.5,-1.5S8.9,5.6 8.9,6.4l0.0,1.5l3.0,2.4L11.9,6.4z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/ic_volume_voice.xml b/packages/SystemUI/res/drawable/ic_volume_voice.xml new file mode 100644 index 0000000..133253e --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_volume_voice.xml @@ -0,0 +1,26 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24.0dp" + android:viewportHeight="48.0" + android:viewportWidth="48.0" + android:width="24.0dp" > + + <path + android:fillColor="@color/volume_icon_color" + android:pathData="M13.25,21.59c2.88,5.66 7.51,10.29 13.18,13.17l4.4,-4.41c0.55,-0.55 1.34,-0.71 2.03,-0.49C35.1,30.6 37.51,31.0 40.0,31.0c1.11,0.0 2.0,0.89 2.0,2.0l0.0,7.0c0.0,1.11 -0.89,2.0 -2.0,2.0C21.22,42.0 6.0,26.78 6.0,8.0c0.0,-1.1 0.9,-2.0 2.0,-2.0l7.0,0.0c1.11,0.0 2.0,0.89 2.0,2.0 0.0,2.4 0.4,4.9 1.14,7.1 0.2,0.6 0.06,1.48 -0.49,2.03l-4.4,4.42z" /> + +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/stat_sys_managed_profile_status.xml b/packages/SystemUI/res/drawable/stat_sys_managed_profile_status.xml new file mode 100644 index 0000000..3c4c646 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_managed_profile_status.xml @@ -0,0 +1,29 @@ +<!-- +Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="23.0dp" + android:height="18.0dp" + android:viewportWidth="21.0" + android:viewportHeight="17.0"> + <group android:translateX="2.0"> + <path + android:fillColor="#FF000000" + android:pathData="M9.9,11.6H7v-1.1H2.1v2.8c0,0.8,0.6,1.4,1.4,1.4h9.9c0.8,0,1.4,-0.6,1.4,-1.4v-2.8H9.9V11.6z"/> + <path + android:fillColor="#FF000000" + android:pathData="M14.1,4.2h-2.5V3.2l-1.1,-1.1H6.3L5.3,3.2v1H2.8C2,4.2,1.4,4.9,1.4,5.6v2.8c0,0.8,0.6,1.4,1.4,1.4H7V8.8h2.8v1.1h4.2 c0.8,0,1.4,-0.6,1.4,-1.4V5.6C15.5,4.9,14.8,4.2,14.1,4.2z M10.6,4.2H6.3V3.2h4.2V4.2z"/> + </group> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_no_sims.xml b/packages/SystemUI/res/drawable/stat_sys_no_sims.xml index 8bad226..2229c99 100644 --- a/packages/SystemUI/res/drawable/stat_sys_no_sims.xml +++ b/packages/SystemUI/res/drawable/stat_sys_no_sims.xml @@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M19.0,5.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0l-7.0,0.0L7.7,5.3L19.0,16.7L19.0,5.0zM3.7,3.9L2.4,5.2L5.0,7.8L5.0,19.0c0.0,1.1 0.9,2.0 2.0,2.0l10.0,0.0c0.4,0.0 0.7,-0.1 1.0,-0.3l1.9,1.9l1.3,-1.3L3.7,3.9z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml index e1e81fd..643c4f9 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_0.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml @@ -20,12 +20,12 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> <path android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" - android:fillColor="#4DFFFFFF"/> + android:fillColor="?attr/backgroundColor"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml index c0dfcf4..e267d25 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml @@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml index d1124ee..64781c3 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_1.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml @@ -20,15 +20,15 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.7,20.0l2.0,0.0l0.0,2.0l-2.0,0.0z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.7,10.0l2.0,0.0l0.0,8.1l-2.0,0.0z"/> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M17.7,8.0l4.299999,0.0 0.0,-6.0 -20.0,20.0 15.700001,0.0z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M10.1,13.9l-8.1,8.1 8.1,0.0z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml index 29eda94..60822f4 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml @@ -20,9 +20,9 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M2.0,22.0l20.0,0.0 0.0,-20.0z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M10.1,13.9l-8.1,8.1 8.1,0.0z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml index 537c788..eb2be08 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_2.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml @@ -20,15 +20,15 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M13.900000,10.000000l-11.900000,12.000000 11.900000,0.000000z"/> <path android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" - android:fillColor="#4DFFFFFF"/> + android:fillColor="?attr/backgroundColor"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml index 7d9376e..5e68eed 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml @@ -20,9 +20,9 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml index 09fe33a..22afad0 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_3.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml @@ -20,15 +20,15 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.700001,19.900000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.700001,9.900000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M16.700001,7.200000l-14.700001,14.700000 14.700001,0.000000z"/> <path android:pathData="M17.700001,7.900000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z" - android:fillColor="#4DFFFFFF"/> + android:fillColor="?attr/backgroundColor"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml index 8ec5500..599b34a 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml @@ -20,9 +20,9 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml index bb98541..d1e866d 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_4.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml @@ -19,13 +19,14 @@ Copyright (C) 2014 The Android Open Source Project android:height="17dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> + <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M2.000000,22.000000l15.700001,0.000000 0.000000,-14.000000 4.299999,0.000000 0.000000,-6.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml index a468410..b66d89a 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml @@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml new file mode 100644 index 0000000..f69ffe4 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change.xml @@ -0,0 +1,36 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="17dp" + android:height="17dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:name="dot1" + android:fillColor="?attr/fillColor" + android:pathData="M9.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> + <path + android:name="dot2" + android:fillColor="?attr/backgroundColor" + android:pathData="M14.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> + <path + android:name="dot3" + android:fillColor="?attr/backgroundColor" + android:pathData="M19.0,19.0l3.0,0.0l0.0,3.0l-3.0,0.0z"/> + <path + android:fillColor="?attr/backgroundColor" + android:pathData="M2.0,22.0l6.0,0.0 0.0,-4.0 14.0,0.0 0.0,-16.0z"/> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml new file mode 100644 index 0000000..275f037 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_carrier_network_change_animation.xml @@ -0,0 +1,27 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/stat_sys_signal_carrier_network_change" > + <target + android:name="dot1" + android:animation="@anim/ic_signal_blink_1"/> + <target + android:name="dot2" + android:animation="@anim/ic_signal_blink_2"/> + <target + android:name="dot3" + android:animation="@anim/ic_signal_blink_3"/> +</animated-vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_dark_carrier_network_change_animation.xml b/packages/SystemUI/res/drawable/stat_sys_signal_dark_carrier_network_change_animation.xml new file mode 100644 index 0000000..ff49d4c --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_dark_carrier_network_change_animation.xml @@ -0,0 +1,27 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/stat_sys_signal_carrier_network_change" > + <target + android:name="dot1" + android:animation="@anim/ic_signal_dark_blink_1"/> + <target + android:name="dot2" + android:animation="@anim/ic_signal_dark_blink_2"/> + <target + android:name="dot3" + android:animation="@anim/ic_signal_dark_blink_3"/> +</animated-vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_signal_null.xml index d25fc1c..2b487f9 100644 --- a/packages/SystemUI/res/drawable/stat_sys_signal_null.xml +++ b/packages/SystemUI/res/drawable/stat_sys_signal_null.xml @@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml index be930e8..7f1b715 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml @@ -19,12 +19,12 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M19.000000,8.000000l5.300000,0.000000l1.200000,-1.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml index b2691f6..60f7eb6 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml @@ -19,6 +19,6 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml index dde781d..acd89be 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml @@ -19,15 +19,15 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M13.000000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml index 65931f4..554350d 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml @@ -19,9 +19,9 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M13.100000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.500000,6.500000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M13.100000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml index 63d9dca..f33b25c 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml @@ -19,15 +19,15 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M19.000000,11.600000c-1.300000,-0.700000 -3.400000,-1.600000 -6.000000,-1.600000c-4.400000,0.000000 -7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,11.600000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml index 7ba4895..2c2465a 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml @@ -19,9 +19,9 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M13.000000,22.000000l7.600000,-9.400000C20.299999,12.400000 17.400000,10.000000 13.000000,10.000000s-7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml index 7d393b4..09d2e50 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml @@ -19,15 +19,15 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M19.000000,8.600000c-1.600000,-0.700000 -3.600000,-1.300000 -6.000000,-1.300000c-5.300000,0.000000 -8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.600000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml index e2cde53..7d0f756 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml @@ -19,9 +19,9 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/fillColor" android:pathData="M13.000000,22.000000l9.200000,-11.400000c-0.400000,-0.300000 -3.900000,-3.200000 -9.200000,-3.200000s-8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml index ec8137f..fb1f584 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml @@ -19,12 +19,12 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml index 9d02980..a7e213f 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml @@ -19,6 +19,6 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#FFFFFFFF" + android:fillColor="?attr/singleToneColor" android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml index 95c6531..5169de4 100644 --- a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml +++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml @@ -19,6 +19,6 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:fillColor="#4DFFFFFF" + android:fillColor="?attr/backgroundColor" android:pathData="M13.000000,2.000000C7.700000,2.000000 3.700000,3.900000 0.400000,6.400000L13.000000,22.000000L25.600000,6.500000C22.299999,4.000000 18.299999,2.000000 13.000000,2.000000zM13.000000,18.600000L3.300000,7.000000l0.000000,0.000000l0.000000,0.000000C6.000000,5.300000 8.700000,4.000000 13.000000,4.000000s7.000000,1.400000 9.700000,3.000000l0.000000,0.000000l0.000000,0.000000L13.000000,18.600000z"/> </vector> diff --git a/packages/SystemUI/res/drawable/volume_dialog_background.xml b/packages/SystemUI/res/drawable/volume_dialog_background.xml new file mode 100644 index 0000000..f09c01b --- /dev/null +++ b/packages/SystemUI/res/drawable/volume_dialog_background.xml @@ -0,0 +1,22 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<shape xmlns:android="http://schemas.android.com/apk/res/android" > + + <solid android:color="@color/system_primary_color" /> + + <corners android:radius="@dimen/notification_material_rounded_rect_radius" /> + +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/interpolator/ic_volume_collapse_animation_interpolator_0.xml b/packages/SystemUI/res/interpolator/ic_volume_collapse_animation_interpolator_0.xml new file mode 100644 index 0000000..c3930e4 --- /dev/null +++ b/packages/SystemUI/res/interpolator/ic_volume_collapse_animation_interpolator_0.xml @@ -0,0 +1,17 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" + android:pathData="M 0.0,0.0 c 0.0001,0.0 0.0,1.0 1.0,1.0" /> diff --git a/packages/SystemUI/res/interpolator/ic_volume_expand_animation_interpolator_0.xml b/packages/SystemUI/res/interpolator/ic_volume_expand_animation_interpolator_0.xml new file mode 100644 index 0000000..c3930e4 --- /dev/null +++ b/packages/SystemUI/res/interpolator/ic_volume_expand_animation_interpolator_0.xml @@ -0,0 +1,17 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" + android:pathData="M 0.0,0.0 c 0.0001,0.0 0.0,1.0 1.0,1.0" /> diff --git a/packages/SystemUI/res/layout/assist_orb.xml b/packages/SystemUI/res/layout/assist_orb.xml new file mode 100644 index 0000000..ab0a0a5 --- /dev/null +++ b/packages/SystemUI/res/layout/assist_orb.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* apps/common/assets/default/default/skins/StatusBar.xml +** +** Copyright 2012, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- Extends FrameLayout --> +<com.android.systemui.assist.AssistOrbContainer + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <com.android.systemui.statusbar.AlphaOptimizedView + android:layout_width="match_parent" + android:layout_height="@dimen/assist_orb_scrim_height" + android:layout_gravity="bottom" + android:id="@+id/assist_orb_scrim" + android:background="@drawable/assist_orb_scrim"/> + + <com.android.systemui.assist.AssistOrbView + android:id="@+id/assist_orb" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/search_logo"/> + </com.android.systemui.assist.AssistOrbView> + + <com.android.systemui.statusbar.AlphaOptimizedView + android:id="@+id/assist_orb_navbar_scrim" + android:layout_height="@dimen/assist_orb_navbar_scrim_height" + android:layout_width="match_parent" + android:layout_gravity="bottom" + android:elevation="50dp" + android:outlineProvider="none" + android:background="@drawable/assist_orb_navbar_scrim"/> + +</com.android.systemui.assist.AssistOrbContainer>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/heads_up.xml b/packages/SystemUI/res/layout/heads_up.xml deleted file mode 100644 index 650ee5d..0000000 --- a/packages/SystemUI/res/layout/heads_up.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<!-- extends FrameLayout --> -<com.android.systemui.statusbar.policy.HeadsUpNotificationView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_height="match_parent" - android:layout_width="match_parent" - android:background="@drawable/heads_up_scrim"> - - <FrameLayout - android:layout_width="@dimen/notification_panel_width" - android:layout_height="wrap_content" - android:layout_gravity="@integer/notification_panel_layout_gravity" - android:paddingStart="@dimen/notification_side_padding" - android:paddingEnd="@dimen/notification_side_padding" - android:elevation="8dp" - android:id="@+id/content_holder" /> - -</com.android.systemui.statusbar.policy.HeadsUpNotificationView>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index 01b2713..fca8231 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -68,7 +68,6 @@ android:layout_gravity="bottom|center_horizontal" android:src="@drawable/ic_lock_24dp" android:scaleType="center" - android:tint="#ffffffff" android:contentDescription="@string/accessibility_unlock_button" /> </com.android.systemui.statusbar.phone.KeyguardBottomAreaView> diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml index 97697189..6a4ac2c 100644 --- a/packages/SystemUI/res/layout/mobile_signal_group.xml +++ b/packages/SystemUI/res/layout/mobile_signal_group.xml @@ -23,11 +23,19 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" > - <ImageView + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:theme="@style/DualToneLightTheme" android:id="@+id/mobile_signal" android:layout_height="wrap_content" android:layout_width="wrap_content" /> + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:theme="@style/DualToneDarkTheme" + android:id="@+id/mobile_signal_dark" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:alpha="0.0" + /> <ImageView android:id="@+id/mobile_type" android:layout_height="wrap_content" diff --git a/packages/SystemUI/res/layout/segmented_button.xml b/packages/SystemUI/res/layout/segmented_button.xml index e92f310..ead735f 100644 --- a/packages/SystemUI/res/layout/segmented_button.xml +++ b/packages/SystemUI/res/layout/segmented_button.xml @@ -19,10 +19,10 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/segmented_button_spacing" android:layout_weight="1" - android:gravity="center_horizontal|top" + android:paddingStart="8dp" + android:gravity="start|center_vertical" + android:maxLines="2" android:textColor="@color/segmented_button_text_selector" android:background="@drawable/btn_borderless_rect" - android:textAppearance="@style/TextAppearance.QS.SegmentedButton" - android:minHeight="64dp" - android:paddingTop="11dp" - android:drawablePadding="6dp" /> + android:textAppearance="@style/TextAppearance.Volume.ZenSwitchSummary" + android:minHeight="48dp" /> diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml index 8fbd8f7..c9edef8 100644 --- a/packages/SystemUI/res/layout/signal_cluster_view.xml +++ b/packages/SystemUI/res/layout/signal_cluster_view.xml @@ -38,11 +38,19 @@ android:layout_height="wrap_content" android:layout_width="wrap_content" > - <ImageView + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:theme="@style/DualToneLightTheme" android:id="@+id/wifi_signal" android:layout_height="wrap_content" android:layout_width="wrap_content" /> + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:theme="@style/DualToneDarkTheme" + android:id="@+id/wifi_signal_dark" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:alpha="0.0" + /> </FrameLayout> <View android:id="@+id/wifi_signal_spacer" @@ -56,12 +64,25 @@ android:layout_width="wrap_content" > </LinearLayout> - <ImageView - android:id="@+id/no_sims" + <FrameLayout android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:src="@drawable/stat_sys_no_sims" - /> + android:layout_width="wrap_content"> + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:theme="@style/DualToneLightTheme" + android:id="@+id/no_sims" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:src="@drawable/stat_sys_no_sims" + /> + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:theme="@style/DualToneDarkTheme" + android:id="@+id/no_sims_dark" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:src="@drawable/stat_sys_no_sims" + android:alpha="0.0" + /> + </FrameLayout> <View android:id="@+id/wifi_airplane_spacer" android:layout_width="4dp" diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml index f717ac7..0e1517f 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml @@ -128,7 +128,7 @@ android:id="@+id/clock" /> - <Button android:id="@+id/alarm_status" + <com.android.systemui.statusbar.AlphaOptimizedButton android:id="@+id/alarm_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" diff --git a/packages/SystemUI/res/layout/status_bar_search_panel.xml b/packages/SystemUI/res/layout/status_bar_search_panel.xml deleted file mode 100644 index e0520ef..0000000 --- a/packages/SystemUI/res/layout/status_bar_search_panel.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* apps/common/assets/default/default/skins/StatusBar.xml -** -** Copyright 2012, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ ---> - -<!-- Extends FrameLayout --> -<com.android.systemui.SearchPanelView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/search_panel_container" - android:layout_height="match_parent" - android:layout_width="match_parent"> - - <com.android.systemui.statusbar.AlphaOptimizedView - style="@style/SearchPanelScrim" - android:id="@+id/search_panel_scrim" - android:background="@drawable/search_panel_scrim" /> - - <com.android.systemui.SearchPanelCircleView - style="@style/SearchPanelCircle" - android:id="@+id/search_panel_circle"> - - <ImageView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:id="@+id/search_logo" /> - </com.android.systemui.SearchPanelCircleView> - -</com.android.systemui.SearchPanelView> diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml index 532e1b7..539aabf 100644 --- a/packages/SystemUI/res/layout/super_status_bar.xml +++ b/packages/SystemUI/res/layout/super_status_bar.xml @@ -46,6 +46,13 @@ android:layout_height="match_parent" android:importantForAccessibility="no" /> + <com.android.systemui.statusbar.AlphaOptimizedView + android:id="@+id/heads_up_scrim" + android:layout_width="match_parent" + android:layout_height="@dimen/heads_up_scrim_height" + android:background="@drawable/heads_up_scrim" + android:importantForAccessibility="no"/> + <include layout="@layout/status_bar" android:layout_width="match_parent" android:layout_height="@dimen/status_bar_height" /> diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index 3765fe8..c86e9dc 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -1,6 +1,5 @@ -<?xml version="1.0" encoding="utf-8"?> <!-- - Copyright (C) 2014 The Android Open Source Project + Copyright (C) 2015 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,15 +13,48 @@ See the License for the specific language governing permissions and limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/volume_dialog" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="4dp" android:layout_marginLeft="@dimen/notification_side_padding" android:layout_marginRight="@dimen/notification_side_padding" - android:background="@drawable/qs_background_primary" - android:translationZ="@dimen/volume_panel_z" - android:layout_marginBottom="@dimen/volume_panel_z"> + android:layout_marginTop="4dp" + android:background="@drawable/volume_dialog_background" + android:translationZ="4dp" > - <include layout="@layout/volume_panel" /> + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/volume_expand_button" + style="@style/VolumeButtons" + android:layout_alignParentLeft="true" + android:layout_width="@dimen/volume_button_size" + android:layout_height="@dimen/volume_button_size" + android:clickable="true" + android:soundEffectsEnabled="false" + android:src="@drawable/ic_volume_collapse_animation" /> -</FrameLayout>
\ No newline at end of file + <LinearLayout + android:id="@+id/volume_dialog_content" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingBottom="4dp" + android:paddingTop="6dp" > + + <!-- volume rows added and removed here! :-) --> + + <FrameLayout + android:id="@+id/volume_footer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + tools:ignore="UselessParent" > + + <include layout="@layout/volume_text_footer" /> + + <include layout="@layout/volume_zen_footer" /> + </FrameLayout> + </LinearLayout> + +</RelativeLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml new file mode 100644 index 0000000..b51aa96 --- /dev/null +++ b/packages/SystemUI/res/layout/volume_dialog_row.xml @@ -0,0 +1,66 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingStart="4dp" + android:paddingEnd="4dp" + android:clipChildren="false" > + + <TextView + android:id="@+id/volume_row_header" + style="?android:attr/textAppearanceButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:alpha="@dimen/volume_secondary_alpha" + android:ellipsize="end" + android:maxLines="1" + android:paddingBottom="0dp" + android:paddingEnd="12dp" + android:paddingStart="13dp" + android:paddingTop="8dp" /> + + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/volume_row_icon" + style="@style/VolumeButtons" + android:layout_width="@dimen/volume_button_size" + android:layout_height="@dimen/volume_button_size" + android:layout_below="@id/volume_row_header" + android:soundEffectsEnabled="false" /> + + <SeekBar + android:id="@+id/volume_row_slider" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignBottom="@+id/volume_row_icon" + android:layout_alignWithParentIfMissing="true" + android:layout_below="@id/volume_row_header" + android:layout_toEndOf="@id/volume_row_icon" + android:layout_toStartOf="@+id/volume_settings_button" + android:paddingEnd="4dp" + android:paddingStart="4dp" + android:progressTint="@android:color/white" + android:thumbTint="@android:color/white" /> + + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/volume_settings_button" + style="@style/VolumeButtons" + android:layout_width="@dimen/volume_button_size" + android:layout_height="@dimen/volume_button_size" + android:layout_alignParentEnd="true" + android:layout_below="@id/volume_row_header" /> + +</RelativeLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_panel.xml b/packages/SystemUI/res/layout/volume_panel.xml deleted file mode 100644 index 4d8aaa7..0000000 --- a/packages/SystemUI/res/layout/volume_panel.xml +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2007 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/visible_panel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" > - - <FrameLayout - android:id="@+id/slider_panel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/system_secondary_color" - android:paddingTop="8dp" - android:paddingLeft="8dp" - android:paddingRight="8dp" - android:clipChildren="false" /> - - <include - android:layout_width="match_parent" - android:layout_height="wrap_content" - layout="@layout/zen_mode_panel" /> - -</LinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_panel_item.xml b/packages/SystemUI/res/layout/volume_panel_item.xml deleted file mode 100644 index dad68c3..0000000 --- a/packages/SystemUI/res/layout/volume_panel_item.xml +++ /dev/null @@ -1,74 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2011 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:clipChildren="false" - android:gravity="start|center_vertical" - android:orientation="horizontal" > - - <ImageView - android:id="@+id/stream_icon" - android:layout_width="48dp" - android:layout_height="48dp" - android:scaleType="center" - android:background="@drawable/btn_borderless_rect" - android:contentDescription="@null" /> - - <FrameLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" > - - <TextView - android:id="@+id/suppressor" - android:visibility="gone" - android:textAppearance="@style/TextAppearance.QS.VolumeSuppressor" - android:paddingStart="8dp" - android:paddingEnd="8dp" - android:singleLine="true" - android:ellipsize="end" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - <SeekBar - android:id="@+id/seekbar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingBottom="0dp" - android:paddingEnd="16dp" - android:paddingStart="8dp" - android:paddingTop="0dp" /> - - </FrameLayout> - - <View - android:id="@+id/divider" - android:layout_width="1dp" - android:layout_height="32dp" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:background="@color/volume_panel_divider" /> - - <ImageView - android:id="@+id/secondary_icon" - android:layout_width="48dp" - android:layout_height="48dp" - android:scaleType="center" - android:background="@drawable/btn_borderless_rect" - android:contentDescription="@null" /> -</LinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_text_footer.xml b/packages/SystemUI/res/layout/volume_text_footer.xml new file mode 100644 index 0000000..7436488 --- /dev/null +++ b/packages/SystemUI/res/layout/volume_text_footer.xml @@ -0,0 +1,54 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/volume_text_footer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + tools:ignore="UselessParent" > + + <TextView + android:id="@+id/volume_footline_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignBaseline="@+id/volume_footline_action_button" + android:alpha="@dimen/volume_secondary_alpha" + android:fontFamily="sans-serif" + android:paddingEnd="8dp" + android:paddingStart="13dp" + android:textColor="?android:attr/textColorPrimary" /> + + <Button + android:id="@+id/volume_footline_action_button" + style="@android:style/Widget.Material.Button.Borderless" + android:layout_width="wrap_content" + android:layout_height="@dimen/volume_button_size" + android:layout_toEndOf="@id/volume_footline_text" + android:layout_toStartOf="@+id/volume_settings_button" + android:alpha="@dimen/volume_secondary_alpha" + android:paddingEnd="0dp" + android:paddingStart="0dp" /> + + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/volume_settings_button" + style="@style/VolumeButtons" + android:layout_width="@dimen/volume_button_size" + android:layout_height="@dimen/volume_button_size" + android:layout_alignParentEnd="true" + android:src="@drawable/ic_volume_settings" /> + +</RelativeLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_zen_footer.xml b/packages/SystemUI/res/layout/volume_zen_footer.xml new file mode 100644 index 0000000..dcdc859 --- /dev/null +++ b/packages/SystemUI/res/layout/volume_zen_footer.xml @@ -0,0 +1,113 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<com.android.systemui.volume.ZenFooter xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/volume_zen_footer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" > <!-- extends LinearLayout --> + + <LinearLayout + android:id="@+id/volume_zen_switch_bar" + android:layout_width="match_parent" + android:layout_height="@dimen/volume_button_size" + android:layout_marginStart="4dp" + android:layout_marginEnd="4dp" + android:clickable="true" + android:orientation="horizontal" > + + <ImageView + android:id="@+id/volume_zen_switch_bar_icon" + android:layout_width="@dimen/volume_button_size" + android:layout_height="@dimen/volume_button_size" + android:scaleType="center" + android:src="@drawable/ic_dnd" /> + + <TextView + android:layout_width="0dp" + android:layout_height="fill_parent" + android:layout_weight="1" + android:gravity="center_vertical" + android:textDirection="locale" + android:padding="3dp" + android:text="@string/volume_zen_switch_text" + android:textAppearance="@style/TextAppearance.Volume.ZenSwitch" /> + + <Switch + android:id="@+id/volume_zen_switch" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:layout_marginEnd="11dp" /> + + </LinearLayout> + + <RelativeLayout + android:id="@+id/volume_zen_panel_summary" + android:layout_width="match_parent" + android:layout_height="@dimen/volume_button_size" + android:layout_marginStart="@dimen/volume_button_size" + android:paddingEnd="7dp" + android:paddingStart="7dp" > + + <TextView + android:id="@+id/volume_zen_panel_summary_line_1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.Volume.ZenSwitchSummary" /> + + <TextView + android:id="@+id/volume_zen_panel_summary_line_2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/volume_zen_panel_summary_line_1" + android:textAppearance="@style/TextAppearance.Volume.ZenSwitchDetail" /> + </RelativeLayout> + + <include layout="@layout/zen_mode_panel" /> + + <LinearLayout + android:id="@+id/volume_zen_mode_panel_buttons" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="4dp" + android:layout_marginEnd="4dp" + android:gravity="end" > + + <TextView + android:id="@+id/volume_zen_mode_panel_more" + style="@style/QSBorderlessButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:clickable="true" + android:focusable="true" + android:minWidth="132dp" + android:text="@string/quick_settings_more_settings" + android:textAppearance="@style/TextAppearance.QS.DetailButton" /> + + <TextView + android:id="@+id/volume_zen_mode_panel_done" + style="@style/QSBorderlessButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:clickable="true" + android:focusable="true" + android:minWidth="66dp" + android:text="@string/quick_settings_done" + android:textAppearance="@style/TextAppearance.QS.DetailButton" /> + </LinearLayout> + +</com.android.systemui.volume.ZenFooter>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/zen_mode_condition.xml b/packages/SystemUI/res/layout/zen_mode_condition.xml index 0b91913..a169d1a 100644 --- a/packages/SystemUI/res/layout/zen_mode_condition.xml +++ b/packages/SystemUI/res/layout/zen_mode_condition.xml @@ -18,8 +18,8 @@ android:layout_width="match_parent" android:layout_height="@dimen/qs_detail_item_height" android:layout_marginBottom="@dimen/zen_mode_condition_detail_item_spacing" - android:layout_marginStart="@dimen/zen_mode_condition_detail_button_padding" - android:layout_marginEnd="@dimen/zen_mode_condition_detail_button_padding" > + android:layout_marginStart="1dp" + android:layout_marginEnd="0dp" > <RadioButton android:id="@android:id/checkbox" diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml index 33c1899..b676bce 100644 --- a/packages/SystemUI/res/layout/zen_mode_panel.xml +++ b/packages/SystemUI/res/layout/zen_mode_panel.xml @@ -27,6 +27,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="8dp" + android:layout_marginStart="39dp" android:elevation="4dp" android:background="@drawable/qs_background_secondary" > @@ -45,15 +46,13 @@ android:layout_width="match_parent" android:layout_height="1dp" android:visibility="gone" - android:layout_marginStart="@dimen/qs_panel_padding" - android:layout_marginEnd="@dimen/qs_panel_padding" - android:layout_marginBottom="@dimen/qs_panel_padding" android:background="#4dffffff" /> <RelativeLayout android:id="@+id/zen_subhead" android:layout_width="match_parent" android:layout_height="62dp" + android:layout_marginStart="39dp" android:gravity="center_vertical" android:paddingLeft="8dp" android:paddingRight="8dp" > @@ -97,10 +96,60 @@ </RelativeLayout> + <RelativeLayout + android:id="@+id/zen_introduction" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingEnd="4dp" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:background="@color/zen_introduction_message_background" > + + <ImageView + android:id="@+id/zen_introduction_confirm" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_alignParentEnd="true" + android:background="@drawable/btn_borderless_rect" + android:clickable="true" + android:contentDescription="@string/accessibility_desc_confirm" + android:scaleType="center" + android:src="@drawable/ic_close" + android:tint="@android:color/white" /> + + <TextView + android:id="@+id/zen_introduction_message" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:layout_marginStart="55dp" + android:lineSpacingMultiplier="1.20029" + android:layout_toStartOf="@id/zen_introduction_confirm" + android:text="@string/zen_priority_introduction" + android:textAppearance="@style/TextAppearance.QS.Introduction" /> + + <TextView + android:id="@+id/zen_introduction_customize" + style="@style/QSBorderlessButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:layout_marginEnd="4dp" + android:layout_below="@id/zen_introduction_message" + android:clickable="true" + android:focusable="true" + android:text="@string/zen_priority_customize_button" + android:textAppearance="@style/TextAppearance.QS.DetailButton.White" /> + + </RelativeLayout> + <LinearLayout android:id="@+id/zen_conditions" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginEnd="4dp" + android:layout_marginStart="39dp" android:orientation="vertical" android:paddingBottom="@dimen/zen_mode_condition_detail_bottom_padding" /> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index a74e120..1f13404 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Skakel batterybespaarder aan"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Instellings"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Vliegtuigmodus"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Outodraai skerm"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"DEMP"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"OUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Sluitskerm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Instellings"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oorsig."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Gebruiker <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi afgeskakel."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Vliegtuigmodus aangeskakel."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Moenie steur nie aan, net prioriteit."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Moenie steur nie aan, geen onderbrekings nie."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\'Moenie steur nie\' is aan, net wekkers."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Moenie steur nie af."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Moenie steur nie is afgeskakel."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Moenie steur nie is aangeskakel."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Nageregkas"</string> <string name="start_dreams" msgid="7219575858348719790">"Sluimer"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Vliegtuigmodus"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Moenie steur nie"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Net prioriteit"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Net wekkers"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Geen onderbrekings nie"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> toestelle)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Gly op vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Gly links vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Geen onderbrekings nie. Nie eens wekkers nie."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Geen onderbrekings nie"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Net prioriteitonderbrekings"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Net wekkers"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Jou volgende wekker is om <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Jou volgende wekker is <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Jy sal nie jou wekker om <xliff:g id="ALARM_TIME">%s</xliff:g> hoor nie"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Sleep op om te ontsluit"</string> <string name="phone_hint" msgid="3101468054914424646">"Sleep regs vir foon"</string> <string name="camera_hint" msgid="5241441720959174226">"Sleep links vir kamera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Geen"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioriteit"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Geen onderbrekings"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Net prioriteit"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Net wekkers"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Alles"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Geen\nonderbrekings nie"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Net\nprioriteit"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Net\nwekkers"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Laai tans (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> tot vol)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Wissel gebruiker"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Wissel gebruiker, huidige gebruiker <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Wiil jy jou sessie voortsit?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Begin van voor af"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, gaan voort"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Voeg nuwe gebruiker by?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel.\n\nEnige gebruiker kan programme vir al die ander gebruikers opdateer."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Batteryspaarder is aan"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Weier"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is die volumedialoog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Raak om die oorspronklike terug te stel."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 0c9aa53..a631b90 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ባትሪ ቆጣቢን አብራ"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ቅንብሮች"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"የአውሮፕላን ሁነታ"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ማያ በራስ ሰር አሽከርክር"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ድምጽ አጥፋ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ራስ ሰር"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ማያ ገጽ ቆልፍ።"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"ቅንብሮች"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"አጠቃላይ እይታ።"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ተጠቃሚ <xliff:g id="USER">%s</xliff:g>።"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>።"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi ጠፍቷል።"</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"የአውሮፕላን ሁነታ በርቷል።"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"አትረብሽ በርቷል፣ ቅድሚያ የሚሰጠው ብቻ።"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"አትረብሽ በርቷል፣ ምንም ማቋረጦች የሉም።"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"አትረብሽ በርቷል፣ ማንቂያዎች ብቻ።"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"አትረብሽ ጠፍቷል።"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"አትረብሽ ጠፍቷል።"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"አትረብሽ በርቷል።"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"የማወራረጃ ምግቦች መያዣ"</string> <string name="start_dreams" msgid="7219575858348719790">"የቀን ህልም"</string> <string name="ethernet_label" msgid="7967563676324087464">"ኤተርኔት"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"የአውሮፕላን ሁነታ"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"አትረብሽ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ቅድሚያ የሚሰጠው ብቻ"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ማንቂያዎች ብቻ"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"ምንም ማቋረጦች የሉም"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ብሉቱዝ"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ብሉቱዝ (<xliff:g id="NUMBER">%d</xliff:g> መሣሪያዎች)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ላይ አንሸራትት።"</string> <string name="description_direction_left" msgid="7207478719805562165">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ግራ አንሸራትት።"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ምንም ማቋረጦች የሉም። ማንቂያዎችም እንኳ።"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"ምንም ማቋረጦች የሉም"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"ቅድሚያ የሚሰጣቸው ማቋረጦች ብቻ"</string> + <string name="zen_alarms" msgid="5055668280767657759">"ማንቂያዎች ብቻ"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"ቀጣዩ ማንቂያ ደውልዎ በ<xliff:g id="ALARM_TIME">%s</xliff:g> ነው"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"ቀጣዩ ማንቂያ ደውልዎ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g> ነው"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"በ<xliff:g id="ALARM_TIME">%s</xliff:g> ያለውን ማንቂያ ደውልዎን አይሰሙትም"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"ለማስከፈት ወደ ላይ ያንሸራትቱ"</string> <string name="phone_hint" msgid="3101468054914424646">"ለስልክ ወደቀኝ ያንሸራትቱ"</string> <string name="camera_hint" msgid="5241441720959174226">"ለካሜራ ወደግራ ያንሸራትቱ"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"ምንም"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"ቅድሚያ"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"ምንም ማቋረጦች የሉም"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"ቅድሚያ የሚሰጠው ብቻ"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"ማንቂያዎች ብቻ"</string> <string name="interruption_level_all" msgid="1330581184930945764">"ሁሉም"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"ምንም\nመቆራረጦች የሉም"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"ቅድሚያ ተሰጪ\nብቻ"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"ማንቂያዎች\nብቻ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ሃይል በመሙላት ላይ (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> እስከሚሞላ ድረስ)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ተጠቃሚ ቀይር"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ተጠቃሚ ይለውጡ፣ የአሁን ተጠቃሚ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"ክፍለ-ጊዜዎን መቀጠል ይፈልጋሉ?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"እንደገና ጀምር"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"አዎ፣ ቀጥል"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"አዲስ ተጠቃሚ ይታከል?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"እርስዎ አንድ አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሱ ቦታ ማዘጋጀት አለበት።\n\nማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ሊያዘምን ይችላል።"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"የባትሪ ኃይል ቆጣቢ በርቷል"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ከልክል"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> የድምጽ መጠን መገናኛው ነው"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"የመጀመሪያውን ወደነበረበት ለመመለስ ይንኩ።"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index de7250d..dfaf408 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -48,7 +48,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"تشغيل توفير شحن البطارية"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"الإعدادات"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"وضع الطائرة"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"التدوير التلقائي للشاشة"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"كتم"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"تلقائي"</string> @@ -172,6 +171,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"شاشة التأمين."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"الإعدادات"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"النظرة عامة."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"المستخدم <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"تم إيقاف Wifi."</string> @@ -184,6 +185,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"تم تشغيل وضع الطائرة."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"تم تشغيل الرجاء عدم الإزعاج، الأولوية فقط."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"تم تشغيل \"الرجاء عدم الإزعاج\"، ممنوع الإزعاج."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"تم تشغيل الرجاء عدم الإزعاج، التنبيهات فقط."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"تم تعطيل \"الرجاء عدم الإزعاج\"."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"تم تعطيل \"الرجاء عدم الإزعاج\"."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"تم تشغيل \"الرجاء عدم الإزعاج\"."</string> @@ -234,9 +236,9 @@ <string name="dessert_case" msgid="1295161776223959221">"حالة الحلويات"</string> <string name="start_dreams" msgid="7219575858348719790">"حلم اليقظة"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"وضع الطائرة"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"الرجاء عدم الإزعاج"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"الأولوية فقط"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"التنبيهات فقط"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"عدم الإزعاج"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"بلوتوث"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"بلوتوث (<xliff:g id="NUMBER">%d</xliff:g> من الأجهزة)"</string> @@ -305,8 +307,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"تمرير لأعلى لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"تمرير لليسار لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"عدم المقاطعة، ولا بالتنبيهات كذلك."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"بدون مقاطعات"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"المقاطعات ذات الأولوية فقط"</string> + <string name="zen_alarms" msgid="5055668280767657759">"التنبيهات فقط"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"التنبيه المقبل في <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"التنبيه المقبل في <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"لن تسمع المنبهات في <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -316,9 +323,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"مرر سريعًا لأعلى لإلغاء القفل"</string> <string name="phone_hint" msgid="3101468054914424646">"مرر سريعًا إلى اليسار لفتح الهاتف"</string> <string name="camera_hint" msgid="5241441720959174226">"مرر سريعًا إلى اليمين لفتح الكاميرا"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"بدون"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"الأولوية"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"عدم الإزعاج"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"الأولوية فقط"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"التنبيهات فقط"</string> <string name="interruption_level_all" msgid="1330581184930945764">"الكل"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"عدم\nالإزعاج"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"الأولوية \nفقط"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"التنبيهات\nفقط"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"جارٍ الشحن (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> حتى الامتلاء)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"تبديل المستخدم"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"تبديل المستخدم، المستخدم الحالي <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -335,6 +346,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"هل تريد متابعة جلستك؟"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"البدء من جديد"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"نعم، متابعة."</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"هل تريد إضافة مستخدم جديد؟"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"عند إضافة مستخدم جديد، يلزمه إعداد مساحته.\n\nعلمًا بأنه يُمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"وضع توفير الطاقة قيد التشغيل"</string> @@ -386,4 +403,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"رفض"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> هو مربع حوار مستوى الصوت"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"المس لاستعادة الإعداد الأصلي."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 1f69b11..6bd9969 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Включване на режима за запазване на батерията"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Настройки"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Самолетен режим"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Авт. завъртане на екрана"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"БЕЗ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"АВТ."</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заключване на екрана."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Настройки"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Общ преглед."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Потребител: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Функцията за Wi-Fi се изключи."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Самолетният режим се включи."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Настройката „Не безпокойте“ е включена – само с приоритет."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Настройката „Не безпокойте“ е включена – без прекъсвания."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Настройката „Не безпокойте“ е включена в режим само с будилници."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Настройката „Не безпокойте“ е изключена."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Настройката „Не безпокойте“ е изключена."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Настройката „Не безпокойте“ е включена."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Витрина с десерти"</string> <string name="start_dreams" msgid="7219575858348719790">"Мечта"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Самолетен режим"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не безпокойте"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само с приоритет"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само будилници"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Без прекъсвания"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> устройства)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Плъзнете нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Плъзнете наляво за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Без прекъсвания. Дори без будилници."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Без прекъсвания"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Само приоритетни прекъсвания"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Само будилници"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Следващият ви будилник е в <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Следващият ви будилник е в/ъв <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Няма да чуете будилника си в <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Прекарайте пръст нагоре, за да отключите"</string> <string name="phone_hint" msgid="3101468054914424646">"Прекарайте пръст надясно, за да използвате телефона"</string> <string name="camera_hint" msgid="5241441720959174226">"Прекарайте пръст наляво, за да включите камерата"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Няма"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Приоритет"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Без прекъсвания"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Само с приоритет"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Само будилници"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Всички"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Без\nпрекъсвания"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Само\nс приоритет"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Само\nбудилници"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Зарежда се (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> до пълно зареждане)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Превключване между потребителите"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Превключване на потребителя – текущият е <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Искате ли да продължите сесията си?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Започване отначало"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Да, продължавам"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Да се добави ли нов потреб.?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Когато добавите нов потребител, той трябва да настрои работното си пространство.\n\nВсеки потребител може да актуализира приложенията за всички останали потребители."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Режимът за запазване на батерията е включен"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Отказване"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> изпълнява ролята на диалоговия прозорец за силата на звука"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Докоснете, за да възстановите оригинала."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 26fd0f4..8f057e4 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ব্যাটারি সঞ্চয়কারী চালু"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"সেটিংস"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"বিমান মোড"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"স্বতঃ-ঘূর্ণায়মান স্ক্রীণ"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"নিঃশব্দ করুন"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"স্বতঃ"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"লক স্ক্রীন।"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"সেটিংস"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"এক নজরে৷"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ব্যবহারকারী <xliff:g id="USER">%s</xliff:g>৷"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi বন্ধ হয়েছে।"</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"বিমান মোড চালু হয়েছে।"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"“বিরক্ত করবেন না” চালু করবেন, শুধুমাত্র অগ্রাধিকার৷"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"“বিরক্ত করবেন না” চালু করবেন, কোন বাধা নয়"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"“বিরক্ত করবেন না” চালু করবেন, শুধুমাত্র অ্যালার্মগুলি৷"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"“বিরক্ত করবেন না” বন্ধ৷"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"বিরক্ত করবেন না বন্ধ রয়েছে৷"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"বিরক্ত করবেন না চালু রয়েছে৷"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"ডেজার্ট কেস"</string> <string name="start_dreams" msgid="7219575858348719790">"স্ক্রিনসেভার"</string> <string name="ethernet_label" msgid="7967563676324087464">"ইথারনেট"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"বিমান মোড"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"বিরক্ত করবেন না"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"শুধুমাত্র অগ্রাধিকার"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"শুধুমাত্র অ্যালার্মগুলি"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"কোনো বাধা নয়"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> টি ডিভাইস)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য উপরের দিকে স্লাইড করুন৷"</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য বাম দিকে স্লাইড করুন৷"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"কোনো ব্যাঘাত ছাড়াই। এমনকি অ্যালার্মও নয়।"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"কোনো বাধা নয়"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"শুধুমাত্র প্রাধান্য বাধাগুলি"</string> + <string name="zen_alarms" msgid="5055668280767657759">"শুধুমাত্র অ্যালার্মগুলি"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"আপনার পরবর্তী অ্যালার্মের সময় <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"আপনার পরবর্তী অ্যালার্মের সময় <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> বাজলে আপনি অ্যালার্ম শুনতে পাবেন না"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"আনলক করতে উপরের দিকে সোয়াইপ করুন"</string> <string name="phone_hint" msgid="3101468054914424646">"ফোনের জন্য ডানদিকে সোয়াইপ করুন"</string> <string name="camera_hint" msgid="5241441720959174226">"ক্যামেরার জন্য ডানদিকে সোয়াইপ করুন"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"কোনো কিছুই নয়"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"অগ্রাধিকার"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"কোনো বাধা নেই"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"শুধুমাত্র অগ্রাধিকার"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"শুধুমাত্র অ্যালার্মগুলি"</string> <string name="interruption_level_all" msgid="1330581184930945764">"সমস্ত"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"কোনো\nবাঁধাদান নেই"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"শুধুমাত্র\nঅগ্রাধিকার"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"শুধুমাত্র\nঅ্যালার্মগুলি"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"চার্জ হচ্ছে (পূর্ণ হতে <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> সময় বাকি)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ব্যবহারকারী পাল্টে দিন"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ব্যবহারকারী পাল্টান, বর্তমান ব্যবহারকারী <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"আপনি কি আপনার সেশনটি অবিরত রাখতে চান?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"আবার শুরু করুন"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"হ্যাঁ, অবিরত থাকুন"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"নতুন ব্যবহারকারীকে যোগ করবেন?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ব্যাটারি সেভার চালু রয়েছে"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"প্রত্যাখ্যান করুন"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> হল ভলিউম ডায়লগ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"আসলটি পুনঃস্থাপন করতে স্পর্শ করুন৷"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 2454adb..706086a 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Activa l\'estalvi de bateria"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configuració"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode d\'avió"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Gira pantalla automàticament"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Silen."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO."</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueig"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuració"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visió general"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuari <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"La xarxa Wi-Fi està desactivada."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"S\'ha activat el Mode d\'avió."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"El mode No molesteu està activat (només amb prioritat)."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"El mode No molesteu està activat (cap interrupció)."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"El mode No molesteu està activat (només alarmes)."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"El mode No molesteu està desactivat."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"S\'ha desactivat el mode No molesteu."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"S\'ha activat el mode No molesteu."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Capsa de postres"</string> <string name="start_dreams" msgid="7219575858348719790">"Estalvi de pantalla"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mode d\'avió"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molesteu"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Només amb prioritat"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Només alarmes"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Cap interrupció"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositius)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Fes lliscar el dit cap amunt per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Fes lliscar el dit cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sense interrupcions (ni tan sols alarmes)"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Cap interrupció"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Només interrupcions amb prioritat"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Només alarmes"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"La propera alarma és a les <xliff:g id="ALARM_TIME">%s</xliff:g>."</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Propera alarma: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"No sentiràs l\'alarma a les <xliff:g id="ALARM_TIME">%s</xliff:g>."</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Fes lliscar el dit cap amunt per desbloquejar el teclat."</string> <string name="phone_hint" msgid="3101468054914424646">"Fes lliscar el dit cap a la dreta per obrir el telèfon."</string> <string name="camera_hint" msgid="5241441720959174226">"Fes lliscar el dit cap a l\'esquerra per obrir la càmera."</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Cap"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritat"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Cap interrupció"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Només amb prioritat"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Només alarmes"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Totes"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Sense\ninterrupcions"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Només\ninterr. prior."</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Només\nalarmes"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Carregant (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> per completar la càrrega)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Canvia d\'usuari"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Canvia l\'usuari. Usuari actual: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Vols continuar amb la sessió?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Torna a començar"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sí, continua"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Vols afegir un usuari nou?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar-se l\'espai.\n\nQualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Estalvi de bateria activada"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Denega"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> és el diàleg de volum"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca per restaurar l\'original."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index a3ba579..de7c62a 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -46,7 +46,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Zapnout úsporu baterie"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavení"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Režim Letadlo"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Autom. otočení obrazovky"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ZTLUM."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string> @@ -172,6 +171,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Obrazovka uzamčení"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavení"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Přehled"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Uživatel <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Připojení Wi-Fi je vypnuto."</string> @@ -184,6 +185,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Režim Letadlo je zapnutý."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Stav Nerušit je zapnutý – pouze prioritní vyrušení."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Stav Nerušit je zapnutý – žádná vyrušení."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Nerušit, pouze budíky"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Stav Nerušit je vypnutý."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Stav Nerušit je vypnutý"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Stav Nerušit je zapnutý."</string> @@ -234,9 +236,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Pult se sladkostmi"</string> <string name="start_dreams" msgid="7219575858348719790">"Spořič obrazovky"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Režim Letadlo"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nerušit"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Pouze prioritní"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Pouze budíky"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Žádná vyrušení"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> zařízení)"</string> @@ -305,8 +307,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Přejeďte prstem nahoru: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string> <string name="description_direction_left" msgid="7207478719805562165">"Přejeďte prstem doleva: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Žádná vyrušení, dokonce ani budíky."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Žádná vyrušení"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Pouze prioritní vyrušení"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Pouze budíky"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Další budík je nastaven na: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Další budík: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Neuslyšíte budík v <xliff:g id="ALARM_TIME">%s</xliff:g>."</string> @@ -316,9 +323,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Zařízení odemknete přejetím prstem nahoru"</string> <string name="phone_hint" msgid="3101468054914424646">"Telefon otevřete přejetím prstem vpravo."</string> <string name="camera_hint" msgid="5241441720959174226">"Fotoaparát otevřete přejetím prstem vlevo."</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Žádné"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritní"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Žádná vyrušení"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Pouze prioritní"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Pouze budíky"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Vše"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Nerušit\n"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Pouze\nprioritní"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Pouze\nbudíky"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Nabíjení (plně nabito za <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Přepnout uživatele"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Přepnout uživatele, aktuální uživatel: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -335,6 +346,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Chcete v relaci pokračovat?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Začít znovu"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ano, pokračovat"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Přidat nového uživatele?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Když přidáte nového uživatele, musí si nastavit vlastní prostor.\n\nJakýkoli uživatel může aktualizovat aplikace všech ostatních uživatelů."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Režim Úspora baterie je zapnutý."</string> @@ -386,4 +403,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmítnout"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je dialog hlasitosti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Klepnutím obnovíte originál."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 2d4fa0f..99fc264 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Aktivér batterisparefunktion"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Indstillinger"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flytilstand"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automatisk skærmrotation"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"LYDLØS"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låseskærm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Indstillinger"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oversigt."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Bruger <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi er slået fra."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Flytilstand er slået til."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"Vil ikke forstyrres\" er slået til, kun prioritet."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\"Vil ikke forstyrres\" er slået til, ingen afbrydelser."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"Vil ikke forstyrres\" er slået til, kun alarmer."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Vil ikke forstyrres\" er slået fra."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Vil ikke forstyrres\" er slået fra."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Vil ikke forstyrres\" er slået til."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertcase"</string> <string name="start_dreams" msgid="7219575858348719790">"Dagdrøm"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flytilstand"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Vil ikke forstyrres"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Kun prioritet"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Kun Alarmer"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Ingen afbrydelser"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> enheder)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Glid op for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Glid til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Ingen afbrydelser. Ikke engang alarmer."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Ingen afbrydelser"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Kun prioriterede afbrydelser"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Kun Alarmer"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Dit næste alarm er indstillet til kl. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Din næste alarm er indstillet til <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Du vil ikke kunne høre din alarm kl. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Stryg for at låse op"</string> <string name="phone_hint" msgid="3101468054914424646">"Stryg til højre for at bruge telefonen"</string> <string name="camera_hint" msgid="5241441720959174226">"Stryg til venstre for at åbne kameraet"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ingen"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritet"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Ingen afbrydelser"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Kun prioritet"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Kun Alarmer"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Alle"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Ingen\nafbrydelser"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Kun\nprioritet"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Kun\nalarmer"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Oplader (fuldt opladet om <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Skift bruger"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Skift bruger. Nuværende bruger er <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,9 +342,15 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Vil du fortsætte din session?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start forfra"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, fortsæt"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Vil du tilføje den nye bruger?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Når du tilføjer en ny bruger, skal personen konfigurere sit område.\n\nEnhver bruger kan opdatere apps for alle andre brugere."</string> - <string name="battery_saver_notification_title" msgid="237918726750955859">"Batteribesparelse er slået til"</string> + <string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparefunktion er slået til"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"Reducerer ydeevne og baggrundsdata"</string> <string name="battery_saver_notification_action_text" msgid="109158658238110382">"Deaktiver batterisparefunktion"</string> <string name="notification_hidden_text" msgid="1135169301897151909">"Indholdet er skjult"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Afvis"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er dialogboksen for lydstyrke"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tryk for at gendanne originalen."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index d97a063..eb0ea2c 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Energiesparmodus aktivieren"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Einstellungen"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WLAN"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flugmodus"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Bildschirm automatisch drehen"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"STUMM"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Sperrbildschirm"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Einstellungen"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Übersicht"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Nutzer: <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WLAN ist deaktiviert."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Der Flugmodus ist aktiviert."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"Nicht stören\" an, nur wichtige Unterbrechungen"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\"Nicht stören\" an, keine Unterbrechungen"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"Nicht stören\" an, nur Wecker"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Nicht stören\" aus"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Nicht stören\" deaktiviert"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Nicht stören\" aktiviert"</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertbehälter"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flugmodus"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nicht stören"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Nur wichtige Unterbrechungen"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Nur Wecker"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Keine Unterbrechungen"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Geräte)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach oben schieben"</string> <string name="description_direction_left" msgid="7207478719805562165">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links schieben"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Keine Unterbrechungen. Auch keine Weckrufe."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Keine Unterbrechungen"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Nur wichtige Unterbrechungen"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Nur Wecker"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Nächster Weckruf: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Nächster Weckruf: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Lautloser Weckruf um <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Zum Entsperren nach oben wischen"</string> <string name="phone_hint" msgid="3101468054914424646">"Zum Öffnen des Telefons nach rechts wischen"</string> <string name="camera_hint" msgid="5241441720959174226">"Zum Öffnen der Kamera nach links wischen"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Keine"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Wichtig"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Keine Unterbrechungen"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Nur wichtige Unterbrechungen"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Nur Wecker"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Alle"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Keine\nUnterbrechungen"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Nur\nwichtige"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Nur\nWecker"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Wird aufgeladen (voll in <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Nutzer wechseln"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Nutzer wechseln. Aktueller Nutzer: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Möchten Sie Ihre Sitzung fortsetzen?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Von vorn"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, weiter"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Neuen Nutzer hinzufügen?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Wenn Sie einen neuen Nutzer hinzufügen, muss dieser seinen Bereich einrichten.\n\nJeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Energiesparmodus ist aktiviert"</string> @@ -372,8 +389,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Alle ausblenden"</string> <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Bildschirm ist fixiert"</string> - <string name="screen_pinning_description" msgid="1346522416878235405">"Hiermit wird sie angezeigt, bis Sie die Fixierung aufheben. Berühren und halten Sie \"Zurück\" und \"Übersicht\" gleichzeitig, um die Fixierung aufzuheben."</string> - <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Hiermit wird sie angezeigt, bis Sie die Fixierung aufheben. Berühren und halten Sie \"Übersicht\", um die Fixierung aufzuheben."</string> + <string name="screen_pinning_description" msgid="1346522416878235405">"Der Bildschirm wird solange angezeigt, bis Sie die Fixierung aufheben. Berühren und halten Sie \"Zurück\" und \"Übersicht\" gleichzeitig, um die Fixierung aufzuheben."</string> + <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Der Bildschirm wird solange angezeigt, bis Sie die Fixierung aufheben. Berühren und halten Sie \"Übersicht\", wenn Sie die Fixierung aufheben möchten."</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nein danke"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ausblenden?"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ablehnen"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> regelt die Lautstärke."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Zum Wiederherstellen des Originals hier tippen"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 5ccd669..e4c85c1 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Ενεργοποίηση της εξοικονόμησης μπαταρίας"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ρυθμίσεις"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Λειτουργία πτήσης"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Αυτόματη περιστροφή οθόνης"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ΣΙΓΑΣΗ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ΑΥΤΟΜ."</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Κλείδωμα οθόνης."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ρυθμίσεις"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Επισκόπηση."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Χρήστης <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Το Wi-fi απενεργοποιήθηκε."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Ενεργή λειτουργία πτήσης."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Η λειτουργία \"Μην ενοχλείτε\" ενεργοποιήθηκε, μόνο προτεραιότητας."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Η λειτουργία \"Μην ενοχλείτε\" ενεργοποιήθηκε, χωρίς διακοπές."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Μην ενοχλείτε, μόνο ειδοποιήσεις."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Η λειτουργία \"Μην ενοχλείτε\" απενεργοποιήθηκε."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Η λειτουργία \"Μην ενοχλείτε\" απενεργοποιήθηκε."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Η λειτουργία \"Μην ενοχλείτε\" ενεργοποιήθηκε."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Επιδόρπιο"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Λειτουργία πτήσης"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Μην ενοχλείτε"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Μόνο προτεραιότητας"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Μόνο ειδοποιήσεις"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Χωρίς διακοπές"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> συσκευές)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Κύλιση προς τα επάνω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Κύλιση προς τα αριστερά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Χωρίς διακοπές. Ούτε ειδοποιήσεις,"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Χωρίς διακοπές"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Μόνο διακοπές προτεραιότητας"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Μόνο ειδοποιήσεις"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Το επόμενο ξυπνητήρι είναι στις <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Το επόμενο ξυπνητήρι είναι στις <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Δεν θα ακούτε το ξυπνητήρι σας στις <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Σύρετε για να ξεκλειδώσετε"</string> <string name="phone_hint" msgid="3101468054914424646">"Σύρετε προς τα δεξιά για το τηλέφωνο"</string> <string name="camera_hint" msgid="5241441720959174226">"Σύρετε αριστερά για τη φωτογραφική μηχανή"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Κανένα"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Προτεραιότητα"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Χωρίς διακοπές"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Μόνο προτεραιότητας"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Μόνο ειδοποιήσεις"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Όλα"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Χωρίς\nδιακοπές"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Μόνο\nπροτεραιότητας"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Μόνο\nειδοποιήσεις"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Φόρτιση (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> για πλήρη φόρτιση)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Εναλλαγή χρήστη"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Εναλλαγή χρήστη, τρέχων χρήστης <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Θέλετε να συνεχίσετε την περίοδο σύνδεσής σας;"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Έναρξη από την αρχή"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ναι, συνέχεια"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Προσθήκη νέου χρήστη;"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Η Εξοικονόμηση μπαταρίας είναι ενεργή"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Απόρριψη"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> αποτελεί το παράθυρο διαλόγου ελέγχου έντασης"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Αγγίξτε για επαναφορά αρχικού."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index dffe8ce..aadd011 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Turn on battery saver"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Settings"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Aeroplane mode"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Auto-rotate screen"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,7 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string> + <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi turned off."</string> @@ -180,6 +180,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Aeroplane mode turned on."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\'Do not disturb\' on, priority only."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\'Do not disturb\' on, no interruptions."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Do not disturb on, alarms only."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\'Do not disturb\' off."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\'Do not disturb\' turned off."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\'Do not disturb\' turned on."</string> @@ -230,9 +231,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Aeroplane mode"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"No interruptions"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Devices)"</string> @@ -301,8 +302,11 @@ <string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"No interruptions. Not even alarms."</string> + <string name="zen_priority_introduction" msgid="7253045784560169993">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string> + <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string> <string name="zen_no_interruptions" msgid="7970973750143632592">"No interruptions"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Priority interruptions only"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Alarms only"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Your next alarm is at <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Your next alarm is <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"You won\'t hear your alarm at <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +316,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> <string name="phone_hint" msgid="3101468054914424646">"Swipe right for phone"</string> <string name="camera_hint" msgid="5241441720959174226">"Swipe left for camera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"None"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Priority"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"No interruptions"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Priority only"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarms only"</string> <string name="interruption_level_all" msgid="1330581184930945764">"All"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"No\ninterruptions"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priority\nonly"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarms\nonly"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charging (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Switch user"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Switch user, current user <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +339,9 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Do you want to continue your session?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start again"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Yes, continue"</string> + <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string> + <string name="guest_notification_text" msgid="7513706222848825467">"Remove guest to delete apps and data"</string> + <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string> @@ -382,4 +393,5 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> + <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index dffe8ce..aadd011 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Turn on battery saver"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Settings"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Aeroplane mode"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Auto-rotate screen"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,7 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string> + <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi turned off."</string> @@ -180,6 +180,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Aeroplane mode turned on."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\'Do not disturb\' on, priority only."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\'Do not disturb\' on, no interruptions."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Do not disturb on, alarms only."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\'Do not disturb\' off."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\'Do not disturb\' turned off."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\'Do not disturb\' turned on."</string> @@ -230,9 +231,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Aeroplane mode"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"No interruptions"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Devices)"</string> @@ -301,8 +302,11 @@ <string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"No interruptions. Not even alarms."</string> + <string name="zen_priority_introduction" msgid="7253045784560169993">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string> + <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string> <string name="zen_no_interruptions" msgid="7970973750143632592">"No interruptions"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Priority interruptions only"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Alarms only"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Your next alarm is at <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Your next alarm is <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"You won\'t hear your alarm at <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +316,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> <string name="phone_hint" msgid="3101468054914424646">"Swipe right for phone"</string> <string name="camera_hint" msgid="5241441720959174226">"Swipe left for camera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"None"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Priority"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"No interruptions"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Priority only"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarms only"</string> <string name="interruption_level_all" msgid="1330581184930945764">"All"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"No\ninterruptions"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priority\nonly"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarms\nonly"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charging (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Switch user"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Switch user, current user <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +339,9 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Do you want to continue your session?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start again"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Yes, continue"</string> + <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string> + <string name="guest_notification_text" msgid="7513706222848825467">"Remove guest to delete apps and data"</string> + <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string> @@ -382,4 +393,5 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> + <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index dffe8ce..aadd011 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Turn on battery saver"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Settings"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Aeroplane mode"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Auto-rotate screen"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,7 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string> + <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi turned off."</string> @@ -180,6 +180,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Aeroplane mode turned on."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\'Do not disturb\' on, priority only."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\'Do not disturb\' on, no interruptions."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Do not disturb on, alarms only."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\'Do not disturb\' off."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\'Do not disturb\' turned off."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\'Do not disturb\' turned on."</string> @@ -230,9 +231,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Aeroplane mode"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"No interruptions"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Devices)"</string> @@ -301,8 +302,11 @@ <string name="description_direction_up" msgid="7169032478259485180">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"No interruptions. Not even alarms."</string> + <string name="zen_priority_introduction" msgid="7253045784560169993">"You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events and callers that you specify."</string> + <string name="zen_priority_customize_button" msgid="7948043278226955063">"Customise"</string> <string name="zen_no_interruptions" msgid="7970973750143632592">"No interruptions"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Priority interruptions only"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Alarms only"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Your next alarm is at <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Your next alarm is <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"You won\'t hear your alarm at <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +316,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> <string name="phone_hint" msgid="3101468054914424646">"Swipe right for phone"</string> <string name="camera_hint" msgid="5241441720959174226">"Swipe left for camera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"None"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Priority"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"No interruptions"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Priority only"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarms only"</string> <string name="interruption_level_all" msgid="1330581184930945764">"All"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"No\ninterruptions"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priority\nonly"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarms\nonly"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charging (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> until full)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Switch user"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Switch user, current user <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +339,9 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Do you want to continue your session?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start again"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Yes, continue"</string> + <string name="guest_notification_title" msgid="1585278533840603063">"Guest user"</string> + <string name="guest_notification_text" msgid="7513706222848825467">"Remove guest to delete apps and data"</string> + <string name="guest_notification_remove_action" msgid="8820670703892101990">"REMOVE GUEST"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string> @@ -382,4 +393,5 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Deny"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is the volume dialogue"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touch to restore the original."</string> + <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index af28b22..e754925 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Activar ahorro de batería"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configuración"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avión"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Girar la pantalla automáticamente"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SILENC"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla bloqueada"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Recientes"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desactivado"</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Modo de avión activado"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"No molestar activado (solo prioridad)"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"No molestar activado (sin interrupciones)"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"No molestar activado (solo alarmas)"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"No molestar desactivado"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"No molestar desactivado"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"No molestar activado"</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string> <string name="start_dreams" msgid="7219575858348719790">"Activar protector"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avión"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestar"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo prioridad"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo alarmas"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Sin interrupciones"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivos)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sin interrupciones (ni siquiera alarmas)"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Sin interrupciones"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Solo interrupciones de prioridad"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Solo alarmas"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Próxima alarma a la(s) <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Próxima alarma: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"No oirás la alarma a la(s) <xliff:g id="ALARM_TIME">%s</xliff:g>."</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Deslizar el dedo hacia arriba para desbloquear"</string> <string name="phone_hint" msgid="3101468054914424646">"Desliza hacia la derecha para abrir el teléfono."</string> <string name="camera_hint" msgid="5241441720959174226">"Desliza hacia la izquierda para acceder a la cámara."</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ninguno"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioridad"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Sin interrupciones"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Solo prioridad"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Solo alarmas"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Todo"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Sin\ninterrupciones"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Solo\nprioridad"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Solo\nalarmas"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Cargando (faltan <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> para completar)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Cambiar usuario"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Cambiar de usuario (usuario actual: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"¿Quieres retomar la sesión?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Volver a empezar"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sí, continuar"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"¿Agregar usuario nuevo?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Cuando agregas un nuevo usuario, esa persona debe configurar su espacio.\n\nCualquier usuario puede actualizar aplicaciones para todos los usuarios."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rechazar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar el original."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 989691a..c131176 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Activar ahorro de energía"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ajustes"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avión"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Girar pantalla automáticamente"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SILENC"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ajustes"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión general."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desactivado."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Modo avión activado."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"No molestar activado (solo prioritarias)."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"No molestar activado (sin interrupciones)."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"No molestar activado, solo alarmas."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"No molestar desactivado."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"No molestar desactivado."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"No molestar activado."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string> <string name="start_dreams" msgid="7219575858348719790">"Salvapantallas"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avión"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestar"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo prioritarias"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo alarmas"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Sin interrupciones"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivos)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sin interrupciones, ni siquiera alarmas."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Sin interrupciones"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Solo interrupciones de prioridad"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Solo alarmas"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Siguiente alarma: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Siguiente alarma: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"No oirás tu alarma a las <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Desliza el dedo hacia arriba para desbloquear"</string> <string name="phone_hint" msgid="3101468054914424646">"Desliza el dedo hacia la derecha para acceder al teléfono"</string> <string name="camera_hint" msgid="5241441720959174226">"Desliza el dedo hacia la izquierda para acceder a la cámara"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Nada"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioridad"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Sin interrupciones"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Solo prioritarias"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Solo alarmas"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Todo"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Sin\ninterrupciones"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Solo\ncon prioridad"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Solo\nalarmas"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Cargando (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> para completar)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Cambiar de usuario"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Cambiar de usuario (usuario actual <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"¿Quieres continuar con la sesión?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Volver a empezar"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sí, continuar"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"¿Añadir nuevo usuario?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Al añadir un usuario nuevo, este debe configurar su espacio.\n\nCualquier usuario puede actualizar las aplicaciones del resto de usuarios."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rechazar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> es el cuadro de diálogo de volumen"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar la versión original."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index 110ee53..387fe82 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Akusäästja sisselülitamine"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Seaded"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WiFi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lennurežiim"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Pööra ekraani automaatselt"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SUMMUTA"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kuva lukustamine."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Seaded"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ülevaade."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kasutaja <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi on välja lülitatud."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Lennukirežiim on sisse lülitatud."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Funktsioon Mitte segada on sisse lülitatud (ainult prioriteetsed)."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Funktsioon Mitte segada on sisse lülitatud (mitte ühtegi katkestust)."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Funktsioon Mitte segada on sisse lülitatud (ainult alarmid)."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Funktsioon Mitte segada on välja lülitatud."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Funktsioon Mitte segada on välja lülitatud."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Funktsioon Mitte segada on sisse lülitatud."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Maiustusekorv"</string> <string name="start_dreams" msgid="7219575858348719790">"Unistus"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lennurežiim"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Mitte segada"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Ainult prioriteetsed"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ainult alarmid"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Mitte ühtegi katkestust"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> seadet)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Lohistage üles: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Lohistage vasakule: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Katkestusi pole. Pole isegi hoiatusi."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Mitte ühtegi katkestust"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Ainult prioriteetsed katkestused"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Ainult alarmid"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Teie järgmine äratus on <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Teie järgmine äratus on <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Te ei kuule äratust <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Lukustuse tühistamiseks pühkige üles"</string> <string name="phone_hint" msgid="3101468054914424646">"Telefoni kasutamiseks pühkige paremale"</string> <string name="camera_hint" msgid="5241441720959174226">"Kaamera kasutamiseks pühkige vasakule"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Puudub"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioriteet"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Katkestusi pole"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Ainult prioriteetsed"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Ainult alarmid"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Kõik"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Katkestusi\npole"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Ainult\nprioriteetsed"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Ainult\nalarmid"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Laadimine (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>, kuni seade on täis)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Kasutaja vahetamine"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Kasutaja vahetamine, praegune kasutaja: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Kas soovite seansiga jätkata?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Alusta uuesti"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Jah, jätka"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Kas lisada uus kasutaja?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi.\n\nIga kasutaja saab värskendada rakendusi kõigi kasutajate jaoks."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Akusäästja on sisse lülitatud"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Keela"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> on helitugevuse dialoog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Originaali taastamiseks puudutage."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index 220a5f0..d8c1789 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Aktibatu bateria aurrezteko aukera"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ezarpenak"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Hegaldi modua"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Biratu pantaila automatikoki"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"DESAKTIBATU AUDIOA"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantaila blokeatzeko aukera."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ezarpenak"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikuspegi orokorra."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"<xliff:g id="USER">%s</xliff:g> erabiltzailea."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi konexioa desaktibatu egin da."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Hegaldi modua aktibatu egin da."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"Ez molestatu\" aukera aktibatuta dago, lehentasunezkoak soilik."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\"Ez molestatu\" aukera aktibatuta dago, etenaldirik gabe."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"Ez molestatu\" aukera aktibatuta dago, alarmak soilik."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Ez molestatu\" aukera desaktibatuta dago."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Ez molestatu\" aukera desaktibatuta dago."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Ez molestatu\" aukera aktibatuta dago."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Postreen kutxa"</string> <string name="start_dreams" msgid="7219575858348719790">"Pantaila-babeslea"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Hegaldi modua"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ez molestatu"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Lehentasunezkoak soilik"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmak soilik"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Etenaldirik gabe"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetootha (<xliff:g id="NUMBER">%d</xliff:g> gailu)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Lerratu gora hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Lerratu ezkerrera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Etenaldirik ez, ezta alarmaren bat bada ere."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Etenaldirik gabe"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Lehentasun-etenaldiak soilik"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Alarmak soilik"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Hurrengo alarma: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Hurrengo alarma: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Ez duzu entzungo alarma ordu honetan: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Desblokeatzeko, pasatu hatza gorantz"</string> <string name="phone_hint" msgid="3101468054914424646">"Telefonoa irekitzeko, pasatu hatza eskuinera."</string> <string name="camera_hint" msgid="5241441720959174226">"Kamera irekitzeko, pasatu hatza ezkerrera."</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Bat ere ez"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Lehentas."</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Etenaldirik gabe"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Lehentasunezkoak"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarmak soilik"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Guztiak"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Etenaldirik\ngabe"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Lehentasunezkoak\nsoilik"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarmak\nsoilik"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Kargatzen (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> guztiz kargatu arte)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Aldatu erabiltzailea"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Aldatu erabiltzailez. <xliff:g id="CURRENT_USER_NAME">%s</xliff:g> da saioa hasita duena."</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Saioarekin jarraitu nahi duzu?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Hasi berriro"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Bai, jarraitu"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Beste erabiltzaile bat gehitu?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Erabiltzaile bat gehitzen duzunean, horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Bateria aurrezlea aktibatuta dago"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ukatu"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> da bolumenaren leihoa"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Ukitu jatorrizkora leheneratzeko"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index b6a6ecb..7594ad9 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ذخیرهکننده باتری را روشن کنید"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"تنظیمات"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"حالت هواپیما"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"چرخش خودکار صفحه"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"بیصدا"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"خودکار"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"صفحه در حالت قفل."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"تنظیمات"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"نمای کلی."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"کاربر <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi خاموش شد."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"حالت هواپیما روشن شد."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"«مزاحم نشوید» روشن است، فقط اولویتدار."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"«مزاحم نشوید» روشن است، وقفه ایجاد نشود."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"حالت «مزاحم نشوید» روشن است، فقط هشدارها."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"«مزاحم نشوید» خاموش است."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"«مزاحم نشوید» خاموش شد."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"«مزاحم نشوید» روشن شد."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"ویترین دسر"</string> <string name="start_dreams" msgid="7219575858348719790">"رویاپردازی"</string> <string name="ethernet_label" msgid="7967563676324087464">"اترنت"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"حالت هواپیما"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"مزاحم نشوید"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"فقط اولویتدار"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"فقط هشدارها"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"وقفه ایجاد نشود"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"بلوتوث"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"بلوتوث ( <xliff:g id="NUMBER">%d</xliff:g> دستگاه)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"لغزاندن به بالا برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"لغزاندن به چپ برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"بدون قطعی. حتی هشدارها قطع نمیشوند."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"بدون وقفه"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"فقط وقفههای اولویتدار"</string> + <string name="zen_alarms" msgid="5055668280767657759">"فقط هشدارها"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"هشدار بعدی شما در ساعت <xliff:g id="ALARM_TIME">%s</xliff:g> است"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"هشدار بعدی شما <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g> است"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"هشدارتان را در ساعت <xliff:g id="ALARM_TIME">%s</xliff:g> نخواهید شنید"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"برای باز کردن قفل سریع به بالا بکشید"</string> <string name="phone_hint" msgid="3101468054914424646">"برای تلفن انگشت را تند به سمت چپ بکشید"</string> <string name="camera_hint" msgid="5241441720959174226">"برای دوربین انگشت را تند به سمت راست بکشید"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"هیچکدام"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"اولویت"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"بدون وقفه"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"فقط اولویتدار"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"فقط هشدارها"</string> <string name="interruption_level_all" msgid="1330581184930945764">"همه"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"بدون\nوقفه"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"فقط\nاولویتدار"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"فقط\nهشدارها"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"در حال شارژ (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> تا شارژ کامل)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"تغییر کاربر"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"تعویض کاربر، کاربر کنونی <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"آیا میخواهید جلسهتان را ادامه دهید؟"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"شروع مجدد"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"بله، ادامه داده شود"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"کاربر جدیدی اضافه میکنید؟"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"وقتی کاربر جدیدی را اضافه میکنید آن فرد باید فضای خودش را تنظیم کند.\n\nهر کاربری میتواند برنامهها را برای همه کاربران دیگر بهروزرسانی کند."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ذخیره کننده باتری روشن است."</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"رد کردن"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> کنترلکننده صدا است"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"برای بازیابی کنترلکننده اصلی، لمس کنید."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 4edd4c2..a131701 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Ota virransäästö käyttöön"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Asetukset"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lentokonetila"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Kierrä näyttöä automaattisesti"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ÄÄNET."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lukitse näyttö."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Asetukset"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Viimeisimmät."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Käyttäjä: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi poistettiin käytöstä."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Lentokonetila otettiin käyttöön."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Älä häiritse -tila on päällä, vain tärkeät."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Älä häiritse -tila on päällä, ei keskeytyksiä."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Älä häiritse -tila on päällä, vain herätykset toistetaan."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Älä häiritse -tila on pois päältä."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Älä häiritse -tila on pois päältä."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Älä häiritse -tila on päällä."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Jälkiruokavitriini"</string> <string name="start_dreams" msgid="7219575858348719790">"Unelmat"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lentokonetila"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Älä häiritse"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vain tärkeät"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vain herätykset"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Ei häiriöitä"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> laitetta)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Liu\'uta ylös ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Liu\'uta vasemmalle ja <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Ei keskeytyksiä, ei edes herätyksiä."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Ei häiriöitä"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Vain tärkeät häiriöt"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Vain herätykset"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Seuraava hälytysaika on <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Seuraava hälytysaika on <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Et kuule hälytystä klo <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Avaa lukitus pyyhkäisemällä ylös"</string> <string name="phone_hint" msgid="3101468054914424646">"Avaa puhelin pyyhkäisemällä oikealle"</string> <string name="camera_hint" msgid="5241441720959174226">"Avaa kamera pyyhkäisemällä oikealle"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ei mitään"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Tärkeät"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Ei keskeytyksiä"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Vain tärkeät"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Vain herätykset"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Kaikki"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Ei\nkeskeytyksiä"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Vain\ntärkeät"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Vain\nherätykset"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Ladataan (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> kunnes täynnä)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Vaihda käyttäjää"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Vaihda käyttäjä (nyt <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Haluatko jatkaa istuntoa?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Aloita alusta"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Kyllä, haluan jatkaa"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Lisätäänkö uusi käyttäjä?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Virransäästö on käytössä"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Estä"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> on äänenvoimakkuusvalinta."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Palauta alkuperäinen koskettamalla."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index a369dfd..9d10e48 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Activer l\'économiseur d\'énergie"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Paramètres"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode Avion"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Rotation auto de l\'écran"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUET"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOMATIQUE"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur : <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi désactivé"</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Le mode Avion est activé."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Mode « Ne pas déranger » activé, interruptions prioritaires uniquement."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Mode « Ne pas déranger » activé, sans interruption."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Mode « Ne pas déranger » activé, alarmes uniquement."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Mode « Ne pas déranger » désactivé."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Le mode « Ne pas déranger » a bien été désactivé."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Le mode « Ne pas déranger » a bien été activé."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string> <string name="start_dreams" msgid="7219575858348719790">"Écran de veille"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mode Avion"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priorités seulement"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes uniquement"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Aucune interruption"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> appareils)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Faire glisser le doigt vers le haut : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string> <string name="description_direction_left" msgid="7207478719805562165">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Aucune interruption. Même pas pour les alarmes."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Aucune interruption"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Interruptions prioritaires seulement"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Alarmes uniquement"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Prochaine alarme : <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Prochaine alarme : <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Vous n\'entendrez pas votre alarme à <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Glissez vers le haut pour déverrouiller"</string> <string name="phone_hint" msgid="3101468054914424646">"Balayez l\'écran vers la droite pour accéder au téléphone"</string> <string name="camera_hint" msgid="5241441720959174226">"Balayez l\'écran vers la gauche pour accéder à l\'appareil photo"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Aucun"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Priorité"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Aucune interruption"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Priorités seulement"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarmes uniquement"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Tous"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Aucune\ninterruption"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priorités\nuniquement"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarmes\nuniquement"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charge en cours... (chargée à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Changer d\'utilisateur"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Changer d\'utilisateur (utilisateur actuel <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Voulez-vous poursuivre la session?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Recommencer"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Oui, continuer"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Ajouter un utilisateur?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace.\n\nN\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"La fonction Économie d\'énergie est activée"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuser"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> correspond à la boîte de dialogue du volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Touchez pour restaurer l\'original."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 18dac4c..2788a87 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Activer l\'économiseur de batterie"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Paramètres"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode Avion"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Rotation automatique de l\'écran"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUET"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi désactivé."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Le mode Avion est activé."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Mode \"Ne pas déranger\" activé, interruptions prioritaires uniquement"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Mode \"Ne pas déranger\" activé, sans interruption"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Mode \"Ne pas déranger\" activé, alarmes uniquement"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Mode \"Ne pas déranger\" désactivé"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Le mode \"Ne pas déranger\" a bien été désactivé."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Le mode \"Ne pas déranger\" a bien été activé."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string> <string name="start_dreams" msgid="7219575858348719790">"Écran de veille interactif"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mode avion"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires uniquement"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes uniquement"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Aucune interruption"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> appareils)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Faites glisser vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Faites glisser vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Aucune sonnerie, pas même pour les alarmes"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Aucune sonnerie"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Sonneries prioritaires uniquement"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Alarmes uniquement"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Prochaine alarme : <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Prochaine alarme : <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Vous n\'entendrez pas votre alarme à <xliff:g id="ALARM_TIME">%s</xliff:g>."</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Faire glisser pour déverrouiller"</string> <string name="phone_hint" msgid="3101468054914424646">"Balayer l\'écran vers la droite pour accéder au téléphone"</string> <string name="camera_hint" msgid="5241441720959174226">"Balayer l\'écran vers la gauche pour accéder à l\'appareil photo"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Aucune"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritaire"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Aucune interruption"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Priorit. uniquement"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarmes uniquement"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Toujours"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Aucune\ninterruption"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priorité\nuniquement"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarmes\nuniquement"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Charge en cours… (chargé à 100 %% dans <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Changer d\'utilisateur"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Changer d\'utilisateur (utilisateur actuel : <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Voulez-vous poursuivre la dernière session ?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Non, nouvelle session"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Oui, continuer"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Ajouter un utilisateur ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace.\n\nN\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"L\'économiseur de batterie est activé"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuser"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> correspond à la boîte de dialogue du volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Appuyez pour restaurer l\'interface d\'origine."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 75c0cb9..a4786df 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Activar o aforro de batería"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configuración"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avión"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Xirar pantalla automaticamente"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"APAGAR"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -62,7 +61,7 @@ <string name="always_use_device" msgid="1450287437017315906">"Usar de forma predeterminada para dispositivo USB"</string> <string name="always_use_accessory" msgid="1210954576979621596">"Usar de forma predeterminada para este accesorio USB"</string> <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuración de erros de USB?"</string> - <string name="usb_debugging_message" msgid="2220143855912376496">"A identificación dixital da clave de RSA do ordenador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> + <string name="usb_debugging_message" msgid="2220143855912376496">"A impresión dixital da clave de RSA do ordenador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre desde este ordenador"</string> <string name="compat_mode_on" msgid="6623839244840638213">"Ampliar ata ocupar todo"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Estirar ata ocupar todo"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión xeral."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi desactivada."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Activouse o modo avión."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Non molestar activado, só prioridade."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Non molestar activado, sen interrupcións."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Non molestar activado, só alarmas."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"A opción Non molestar está desactivada."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Desactivouse a opción Non molestar."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Activouse a opción Non molestar."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Caixa de sobremesa"</string> <string name="start_dreams" msgid="7219575858348719790">"Protector pantalla"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avión"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Non molestar"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Só prioridade"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Só alarmas"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Sen interrupcións"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivos)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Pasa o dedo cara arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Non hai interrupcións nin alarmas."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Sen interrupcións"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Só interrupcións prioritarias"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Só alarmas"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"A túa próxima alarma ten lugar ás <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"A túa próxima alarma ten lugar o <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Non escoitarás a túa alarma ás <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Pasa o dedo cara arriba para desbloquear"</string> <string name="phone_hint" msgid="3101468054914424646">"Pasa o dedo cara á dereita para acceder ao teléfono"</string> <string name="camera_hint" msgid="5241441720959174226">"Pasa o dedo cara á esquerda para abrir a cámara"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ningún"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioridade"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Sen interrupcións"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Só prioridade"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Só alarmas"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Todas"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Ningunha\ninterrupción"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Só\nprioridade"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Só\nalarmas"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Cargando (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> para finalizar a carga)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Cambiar usuario"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Cambiar usuario, usuario actual: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Queres continuar coa túa sesión?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Comezar de novo"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Si, continuar"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Engadir un usuario novo?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Cando engadas un usuario novo, este deberá configurar o seu espazo\n\nCalquera usuario pode actualizar as aplicacións para todos os demais usuarios."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"O aforro de batería está activado"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Denegar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é o cadro de diálogo de volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toca para restaurar o orixinal."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 5c45c8b..7d6f51b 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"बैटरी बचतकर्ता को चालू करें"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिंग"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाई-फ़ाई"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"हवाई जहाज मोड"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"स्क्रीन अपनेआप घुमाएं"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"म्यूट करें"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"स्वत:"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"लॉक स्क्रीन."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिंग"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"अवलोकन."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"उपयोगकर्ता <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"वाई-फ़ाई को बंद किया गया."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"हवाई जहाज़ मोड को चालू किया गया."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"परेशान ना करें चालू, केवल प्राथमिकता."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"परेशान ना करें चालू है, कोई बाधा नहीं."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"परेशान ना करें चालू, केवल अलार्म."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"परेशान ना करें बंद."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"परेशान ना करें बंद किया गया."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"परेशान ना करें चालू किया गया."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"मिठाई का डिब्बा"</string> <string name="start_dreams" msgid="7219575858348719790">"स्क्रीनसेवर"</string> <string name="ethernet_label" msgid="7967563676324087464">"ईथरनेट"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"हवाई जहाज़ मोड"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"परेशान ना करें"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"केवल प्राथमिकता"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"केवल अलार्म"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"कोई मेसज और कॉल को नहीं रोका गया"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ब्लूटूथ"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ब्लूटूथ (<xliff:g id="NUMBER">%d</xliff:g> डिवाइस)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए ऊपर स्लाइड करें."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए बाएं स्लाइड करें."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ऐसा सेट करें की कोई कि अलार्म भी ना हो."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"कोई अवरोध नहीं"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"केवल प्राथमिकता वाले कल और मैसेज को रोकें"</string> + <string name="zen_alarms" msgid="5055668280767657759">"केवल अलार्म"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"आपका अगला अलार्म <xliff:g id="ALARM_TIME">%s</xliff:g> पर है"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"आपका अगला अलार्म <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g> पर है"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"आपको <xliff:g id="ALARM_TIME">%s</xliff:g> पर अपना अलार्म सुनाई नहीं देगा"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"अनलॉक करने के लिए ऊपर स्वाइप करें"</string> <string name="phone_hint" msgid="3101468054914424646">"फ़ोन के लिए दाएं स्वाइप करें"</string> <string name="camera_hint" msgid="5241441720959174226">"कैमरे के लिए बाएं स्वाइप करें"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"कोई नहीं"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"प्राथमिकता"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"कोई बाधा नहीं"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"केवल प्राथमिकता"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"केवल अलार्म"</string> <string name="interruption_level_all" msgid="1330581184930945764">"सभी"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"कोई बाधा\nनहीं"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"केवल\nप्राथमिकता"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"केवल\nअलार्म"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"चार्ज हो रहा है (पूरा होने में <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> बाकी)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"उपयोगकर्ता स्विच करें"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"उपयोगकर्ता स्विच करें, वर्तमान उपयोगकर्ता <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"क्या आप अपना सत्र जारी रखना चाहते हैं?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"पुन: प्रारंभ करें"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"हां, जारी रखें"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"नया उपयोगकर्ता जोड़ें?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उस व्यक्ति को अपना स्थान सेट करना होता है.\n\nकोई भी उपयोगकर्ता अन्य सभी उपयोगकर्ताओं के लिए ऐप्स अपडेट कर सकता है."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"बैटरी सेवर चालू है"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"अस्वीकार करें"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> वॉल्यूम संवाद है"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूल वॉल्यूम को फिर से लाने के लिए स्पर्श करें."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 4210738..7ea2336 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -45,7 +45,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Uključi uštedu baterije"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Postavke"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Način rada u zrakoplovu"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automatski zakreni zaslon"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Bez zv."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string> @@ -169,6 +168,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Zaključavanje zaslona."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Postavke"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pregled."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Korisnik <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi isključen."</string> @@ -181,6 +182,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Način rada u zrakoplovu uključen."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"Ne ometaj\" uključeno, samo prioritetno."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\"Ne ometaj\" uključeno, bez prekida."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"Ne ometaj\" uključeno, samo za alarme."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Ne ometaj\" isključeno."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Ne ometaj\" isključeno."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Ne ometaj\" uključeno."</string> @@ -231,9 +233,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Izlog za slastice"</string> <string name="start_dreams" msgid="7219575858348719790">"Sanjarenje"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Način rada u zrakoplovu"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne ometaj"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetno"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Bez prekida"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (broj uređaja: <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -302,8 +304,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Kliznite prema gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Kliznite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Bez prekida, čak ni za alarme."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Bez prekida"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Samo prioritetni prekidi"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Samo alarmi"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Vaš sljedeći alarm bit će u <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Vaš sljedeći alarm bit će u <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Nećete čuti alarm u <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -313,9 +320,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Prijeđite prstom prema gore za otključavanje"</string> <string name="phone_hint" msgid="3101468054914424646">"Prijeđite prstom udesno za telefon"</string> <string name="camera_hint" msgid="5241441720959174226">"Prijeđite prstom ulijevo za fotoaparat"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ništa"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritet"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Bez prekida"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Samo prioritetno"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Samo alarmi"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Sve"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Bez\nprekida"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Samo\nprioritetno"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Samo\nalarmi"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Punjenje (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> do napunjenosti)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Promjena korisnika"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Promjena korisnika, trenutačni korisnik <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -332,6 +343,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Želite li nastaviti sesiju?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Počni ispočetka"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Da, nastavi"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Dodati novog korisnika?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor.\n\nBilo koji korisnik može ažurirati aplikacije za sve ostale korisnike."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Štednja baterije je uključena"</string> @@ -383,4 +400,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odbij"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> predstavlja dijaloški okvir za upravljanje glasnoćom"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dodirnite da biste vratili izvorno."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 2e8c4f3..f674327 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Akkumulátorkímélő mód bekapcsolása"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Beállítások"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Repülőgép üzemmód"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Képernyő automatikus forgatása"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"NÉMÍT"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lezárási képernyő."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Beállítások"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Áttekintés."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Felhasználó: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi kikapcsolva."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Repülős üzemmód bekapcsolva."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"A „Ne zavarjanak” mód bekapcsolva. Csak prioritásos."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"A „Ne zavarjanak” mód bekapcsolva. Nincsenek értesítések."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"A „Ne zavarjanak” mód bekapcsolva. Csak riasztások."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"A „Ne zavarjanak” mód kikapcsolva."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"A „Ne zavarjanak” mód kikapcsolva."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"A „Ne zavarjanak” mód bekapcsolva."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Álmodozás"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Repülőgép üzemmód"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne zavarjanak"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Csak prioritásos"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Csak riasztások"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Ne zavarjon"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> eszköz)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa felfelé."</string> <string name="description_direction_left" msgid="7207478719805562165">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa balra."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Semmi sem zavarja meg, még a riasztások sem."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Ne zavarjon"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Csak prioritást élvező zavaró üzenetek"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Csak riasztások"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"A következő ébresztés ideje: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"A következő ébresztés napja és ideje: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Nem fogja hallani az ébresztést ekkor: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Húzza felfelé az ujját a feloldáshoz"</string> <string name="phone_hint" msgid="3101468054914424646">"A telefon eléréséhez csúsztassa ujját jobbra"</string> <string name="camera_hint" msgid="5241441720959174226">"A fényképezőgép eléréséhez csúsztassa ujját balra"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Nincs"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritást élvező"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Ne zavarjon"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Csak prioritásos"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Csak riasztások"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Összes"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Nincs\nmegszakítás"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Csak\nprioritás"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Csak\nriasztások"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Töltés (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> a teljes töltöttségig)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Felhasználóváltás"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Felhasználóváltás (a jelenlegi felhasználó: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Folytatja a munkamenetet?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Újrakezdés"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Igen, folytatom"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Új felhasználó hozzáadása?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját tárterületét.\n\nBármely felhasználó frissítheti az alkalmazásokat valamennyi felhasználó számára."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Akkumulátorkímélő mód bekapcsolva"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Elutasítás"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás kezeli a hangerőt"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Érintse meg az eredeti érték visszaállításához."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 91d36da..c3d0f6d 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Միացնել մարտկոցի տնտեսումը"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Կարգավորումներ"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Ինքնաթիռային ռեժիմ"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ինքնապտտվող էկրան"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"Համրեցնել"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"Ինքնաշխատ"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Էկրանի կողպում:"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Կարգավորումներ"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Համատեսք"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Օգտվող <xliff:g id="USER">%s</xliff:g>:"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>:"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi-ն անջատվեց:"</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Ինքնաթիռային ռեժիմը միացավ:"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Չխանգարելու ընտրանքը միացված է: Ընդհատել միայն կարևոր ծանուցումների դեպքում:"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Չխանգարելու ընտրանքը միացված է: Չընդհատել:"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Չանհանգստացնել՝ միայն զարթուցիչ"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Չխանգարելու ընտրանքն անջատված է:"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Չխանգարելու ընտրանքն անջատվեց:"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Չխանգարելու ընտրանքը միացվեց:"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Ցերեկային ռեժիմ"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Ինքնաթիռային ռեժիմ"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Չխանգարել"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Միայն կարևոր ծանուցումների դեպքում"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Միայն զարթուցիչ"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Չընդհատել"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> սարք)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Սահեցրեք վերև <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string> <string name="description_direction_left" msgid="7207478719805562165">"Սահեցրեք ձախ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Առանց ընդհատումների՝ ներառյալ զարթուցիչները:"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Առանց ընդհատումների"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Միայն կարևոր ընդհատումներ"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Միայն զարթուցիչ"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Ձեր հաջորդ զարթուցիչի ժամն է՝ <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Ձեր հաջորդ զարթուցիչի օրն է՝ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Դուք չեք լսի ձեր զարթուցիչը <xliff:g id="ALARM_TIME">%s</xliff:g>-ին:"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Սահեցրեք վերև` ապակողպելու համար"</string> <string name="phone_hint" msgid="3101468054914424646">"Հեռախոսի համար սահեցրեք աջ"</string> <string name="camera_hint" msgid="5241441720959174226">"Խցիկի համար սահեցրեք ձախ"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"-"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Կարևորություն"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Առանց ընդհատումների"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Միայն կարևորները"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Միայն զարթուցիչ"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Բոլորը"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Առանց\nընդհատումների"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Միայն\nկարևորները"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Միայն\nզարթուցիչ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Լիցքավորում (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> մինչև լրիվ լիցքավորումը)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Անջատել օգտվողին"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Փոխել օգտվողին. ներկայիս օգտվողն է՝ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Դուք ցանկանու՞մ եք շարունակել ձեր գործողությունը:"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Սկսել"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Այո, շարունակել"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Ավելացնե՞լ նոր պրոֆիլ:"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Երբ նոր օգտվող եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտվող կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Մարտկոցի տնտեսումը միացված է"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Մերժել"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ը ձայնի ուժգնության երկխոսության հավելված է"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Դիպչեք՝ սկզբնօրինակը վերականգնելու համար:"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index bacca07..f53cecc 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Aktifkan penghemat baterai"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Setelan"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode pesawat"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Rotasi layar otomatis"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"BUNGKAM"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Layar kunci."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Setelan"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ringkasan."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi dinonaktifkan."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Mode pesawat diaktifkan."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Status \"Jangan ganggu\" aktif, hanya untuk prioritas."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Status \"Jangan ganggu\" aktif, tanpa gangguan."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Jangan ganggu aktif, hanya alarm."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Status \"Jangan ganggu\" nonaktif."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Status \"Jangan ganggu\" dinonaktifkan."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Status \"Jangan ganggu\" diaktifkan."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Etalase Hidangan Penutup"</string> <string name="start_dreams" msgid="7219575858348719790">"Lamunan"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mode pesawat"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Jangan ganggu"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Hanya untuk prioritas"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Hanya alarm"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Tanpa gangguan"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Perangkat)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Geser ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Geser ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Tanpa gangguan, termasuk alarm."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Tidak ada interupsi"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Hanya interupsi prioritas"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Hanya alarm"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Alarm Anda berikutnya pukul <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Alarm Anda berikutnya hari <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Anda tidak akan mendengar alarm pukul <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Gesek ke atas untuk membuka kunci"</string> <string name="phone_hint" msgid="3101468054914424646">"Gesek ke kanan untuk menelepon"</string> <string name="camera_hint" msgid="5241441720959174226">"Gesek ke kiri untuk kamera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Tidak ada"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritas"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Tanpa gangguan"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Hanya untuk prioritas"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Hanya alarm"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Semua"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Tidak ada\ngangguan"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Hanya\nprioritas"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Hanya\nalarm"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Mengisi daya (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> hingga penuh)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Beralih pengguna"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Ganti pengguna, pengguna saat ini <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Lanjutkan sesi Anda?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Mulai"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ya, lanjutkan"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Tambahkan pengguna baru?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri.\n\n1Pengguna mana pun dapat memperbarui aplikasi untuk semua pengguna lain."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Penghemat baterai aktif"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tolak"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> adalah dialog volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Sentuh untuk memulihkan aslinya."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index ffd3361..8000344 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Kveikja á rafhlöðusparnaði"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Stillingar"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flugstilling"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Snúa skjá sjálfkrafa"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ÞAGGA"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"SJÁLFV"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lásskjár."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Stillingar"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Yfirlit."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Notandi: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Slökkt á Wi-Fi."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Kveikt á flugstillingu."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Kveikt á „Ónáðið ekki“, aðeins forgangur."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Kveikt á „Ónáðið ekki“, engar truflanir."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Kveikt á „Ónáðið ekki“, aðeins vekjarar."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Slökkt á „Ónáðið ekki“."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Slökkt á „Ónáðið ekki“."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Kveikt á „Ónáðið ekki“."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Eftirréttaborð"</string> <string name="start_dreams" msgid="7219575858348719790">"Skjávari"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flugstilling"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ónáðið ekki"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Aðeins forgangur"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Aðeins vekjarar"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Engar truflanir"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> tæki)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Strjúktu upp til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Strjúktu til vinstri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Engar truflanir. Ekki einu sinni vekjarar."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Engin truflun"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Aðeins forgangstruflanir"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Aðeins vekjarar"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Næsti vekjari er kl. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Næsti vekjari er <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Ekki mun heyrast í vekjaranum kl. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Strjúktu upp til að opna"</string> <string name="phone_hint" msgid="3101468054914424646">"Strjúktu til hægri fyrir síma"</string> <string name="camera_hint" msgid="5241441720959174226">"Strjúktu til vinstri fyrir myndavél"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Engar"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Forgangur"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Engar truflanir"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Aðeins forgangur"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Aðeins vekjarar"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Allar"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Engar\ntruflanir"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Aðeins\nforgangur"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Aðeins\nvekjarar"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Í hleðslu (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> fram að fullri hleðslu)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Skipta um notanda"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Skipta um notanda; núverandi notandi er <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Viltu halda áfram með lotuna?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Byrja upp á nýtt"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Já, halda áfram"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Bæta nýjum notanda við?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Þegar þú bætir nýjum notanda við þarf sá notandi að setja upp svæðið sitt.\n\nHvaða notandi sem er getur uppfært forrit fyrir alla aðra notendur."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Kveikt er á rafhlöðusparnaði"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Hafna"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er hljóðstyrksvalmyndin"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Snertu til að færa í upprunalegt horf."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 37cf79c..a0ceb62 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Attiva risparmio energetico"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Impostazioni"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modalità aereo"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Rotazione automatica schermo"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Schermata di blocco."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Impostazioni"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Panoramica."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utente <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi disattivato."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Modalità aereo attivata."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"Non disturbare\" attivo, solo con priorità."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\"Non disturbare\" attivo, nessuna interruzione."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"Non disturbare\" attivo, solo sveglie."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Non disturbare\" non attivo."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Non disturbare\" non attivo."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Non disturbare\" attivo."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Vetrina di dolci"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modalità aereo"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Non disturbare"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo con priorità"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo sveglie"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Nessuna interruzione"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivi)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Su per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"A sinistra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Senza interruzioni. Neanche sveglie."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Nessuna interruzione"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Solo interruzioni con priorità"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Solo sveglie"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Il tuo prossimo allarme è alle ore <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Il tuo prossimo allarme è il giorno <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Il tuo allarme non suonerà alle <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Scorri verso l\'alto per sbloccare"</string> <string name="phone_hint" msgid="3101468054914424646">"Scorri verso destra per accedere al telefono"</string> <string name="camera_hint" msgid="5241441720959174226">"Scorri verso sinistra per accedere alla fotocamera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Nessuna"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Priorità"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Nessuna interruzione"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Solo con priorità"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Solo sveglie"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Tutte"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Nessuna\ninterruzione"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Solo con\npriorità"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Solo\nsveglie"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"In carica (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> al termine)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Cambio utente"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Cambia utente, utente corrente <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Vuoi continuare la sessione?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Ricomincia"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sì, continua"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Aggiungere un nuovo utente?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Il nuovo utente, una volta aggiunto, deve impostare il proprio spazio.\n\nQualsiasi utente può aggiornare le app per tutti gli altri."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Risparmio batteria attivo"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Nega"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> rappresenta la finestra di dialogo relativa al volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tocca per ripristinare l\'originale."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index f7c66f7..b02ff0a 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -46,7 +46,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"הפעל חיסכון בסוללה"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"הגדרות"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"מצב טיסה"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"סיבוב אוטומטי של המסך"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"השתק"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"אוטומטי"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"מסך נעילה."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"הגדרות"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"סקירה."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"משתמש <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi כבוי."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"מצב טיסה הופעל."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\'נא לא להפריע\' פועל. הודעות בעדיפות בלבד."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\'נא לא להפריע\' פועל. ללא הפרעות."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\'נא לא להפריע\' הופעל. התראות בלבד."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\'נא לא להפריע\' כבוי."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\'נא לא להפריע\' כבוי."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\'נא לא להפריע\' פועל."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"מזנון קינוחים"</string> <string name="start_dreams" msgid="7219575858348719790">"חלום בהקיץ"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"מצב טיסה"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"נא לא להפריע"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"עדיפות בלבד"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"התראות בלבד"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"ללא הפרעות"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> מכשירים)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"הסט למעלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"הסט שמאלה כדי להציג <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ללא הפרעות. גם לא התראות."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"ללא הפרעות"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"רק הפרעות בעדיפות גבוהה"</string> + <string name="zen_alarms" msgid="5055668280767657759">"התראות בלבד"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"ההתראה הבאה שלך היא ב-<xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"ההתראה הבאה שלך היא ב<xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"לא תשמע את ההתראה שלך ב-<xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"החלק מעלה כדי לבטל את הנעילה"</string> <string name="phone_hint" msgid="3101468054914424646">"כדי להפעיל את הטלפון, החלק שמאלה"</string> <string name="camera_hint" msgid="5241441720959174226">"החלק ימינה להפעלת המצלמה"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"ללא"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"עדיפות"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"ללא הפרעות"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"עדיפות בלבד"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"התראות בלבד"</string> <string name="interruption_level_all" msgid="1330581184930945764">"הכל"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"ללא\nהפרעות"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"התראות בעדיפות\nבלבד"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"התראות\nבלבד"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"טוען (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> עד לסיום)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"החלפת משתמש"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"החלף משתמש. המשתמש הנוכחי הוא <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"האם ברצונך להמשיך בפעילות באתר?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"התחל מחדש"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"כן, המשך"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"האם להוסיף משתמש חדש?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את השטח שלו.\n\nכל משתמש יכול לעדכן אפליקציות עבור כל המשתמשים האחרים."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"תכונת \'חיסכון בסוללה\' פועלת"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"דחה"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> הוא תיבת הדו-שיח של עוצמת הקול"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"גע כדי לשחזר את עוצמת הקול המקורית."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 1d8a2f7..f8f767b 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"バッテリーセーバーをONにします"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"設定"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"機内モード"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"自動回転画面"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ミュート"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"オート"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ロック画面"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"最近"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ユーザー: <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-FiをOFFにしました。"</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"機内モードをONにしました。"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"[通知を非表示]はONで、重要な通知のみです。"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"[通知を非表示]はONで、サイレントです。"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"[通知を非表示]はONで、アラームのみです。"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"[通知を非表示]はOFFです。"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"[通知を非表示]をOFFにしました。"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"[通知を非表示]をONにしました。"</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"デザートケース"</string> <string name="start_dreams" msgid="7219575858348719790">"スクリーンセーバー"</string> <string name="ethernet_label" msgid="7967563676324087464">"イーサネット"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"機内モード"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"通知を非表示"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"重要な通知のみ"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"アラームのみ"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"サイレント"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth(端末数<xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"上にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string> <string name="description_direction_left" msgid="7207478719805562165">"左にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"サイレント(アラームも鳴りません)"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"サイレント"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"重要な通知のみ"</string> + <string name="zen_alarms" msgid="5055668280767657759">"アラームのみ"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"次のアラームは<xliff:g id="ALARM_TIME">%s</xliff:g>です"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"次のアラームは<xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>です"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g>のアラームは鳴りません"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"ロック解除するには上にスワイプしてください"</string> <string name="phone_hint" msgid="3101468054914424646">"右にスワイプして電話を表示"</string> <string name="camera_hint" msgid="5241441720959174226">"左にスワイプしてカメラを表示"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"なし"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"重要"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"サイレント"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"重要な通知のみ"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"アラームのみ"</string> <string name="interruption_level_all" msgid="1330581184930945764">"すべて"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"通知\nなし"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"重要な\n通知のみ"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"アラーム\nのみ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"充電中(フル充電まで<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ユーザーを切り替える"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ユーザーを切り替える、現在のユーザーは<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"セッションを続行しますか?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"最初から開始"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"続行"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"新しいユーザーを追加しますか?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。\n\nすべてのユーザーは他のユーザーに代わってアプリを更新できます。"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"バッテリーセーバーがON"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"許可しない"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>を音量ダイアログとして使用"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"タップすると元の音量ダイアログが復元されます。"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 9de70e8..4377663 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ბატარეის დაზოგვის ჩართვა"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"პარამეტრები"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"თვითმფრინავის რეჟიმი"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ავტოროტაციის ეკრანი"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"დადუმება"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ავტო."</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ეკრანის დაბლოკვა."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"პარამეტრები"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"მიმოხილვა"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"მომხმარებელი: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi გამორთულია."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"თვითმფრინავის რეჟიმი ჩაირთო."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"ჩართულია რეჟიმი „არ შემაწუხოთ\", მხოლოდ პრიორიტეტები."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"ჩართულია რეჟიმი „არ შემაწუხოთ\", შეწყვეტის გარეშე."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"„ნუ შემაწუხებთ“ ჩართულია, მხოლოდ გაფრთხილებები."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"„არ შემაწუხოთ“ გამორთულია"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"„არ შემაწუხოთ\" რეჟიმი გამორთულია."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"„არ შემაწუხოთ\" რეჟიმი ჩართულია."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"სადესერტო ყუთი"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"ეთერნეტი"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"თვითმფრინავის რეჟიმი"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"არ შემაწუხოთ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"მხოლოდ პრიორიტეტული"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"მხოლოდ გაფრთხილებები"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"შეფერხებების გაეშე"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> მოწყობილობა)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"გაასრიალეთ ზემოთ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string> <string name="description_direction_left" msgid="7207478719805562165">"გაასრიალეთ მარცხნივ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-თვის."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"წყვეტების გარეშე. მაღვიძარების შემთხვევაშიც კი."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"შეწყვეტების გარეშე"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"მხოლოდ პრიორიტეტული შეწყვეტები"</string> + <string name="zen_alarms" msgid="5055668280767657759">"მხოლოდ გაფრთხილებები"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"თქვენი შემდეგი მაღვიძარაა <xliff:g id="ALARM_TIME">%s</xliff:g>-ზე"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"თქვენი შემდეგი მაღვიძარაა <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"თქვენს მაღვიძარას <xliff:g id="ALARM_TIME">%s</xliff:g>-ზე ვერ გაიგონებთ"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"გაასრიალეთ ზევით განსაბლოკად"</string> <string name="phone_hint" msgid="3101468054914424646">"გადაფურცლეთ მარჯვნივ ტელეფონისთვის"</string> <string name="camera_hint" msgid="5241441720959174226">"კამერისთვის მარცხენა შენაცვლება"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"არცერთი"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"პრიორიტეტი"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"შეფერხებების გარეშე"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"მხოლოდ პრიორიტეტული"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"მხოლოდ გაფრთხილებები"</string> <string name="interruption_level_all" msgid="1330581184930945764">"ყველა"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"არ არის\nშეფერხებები"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"მხოლოდ\nპრიორიტეტულები"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"მხოლოდ\nგაფრთხილებები"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"(<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>-ის შეცვლა დასრულებამდე)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"მომხმარებლის გადართვა"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"მომხმარებლის გდართვა. ამჟამინდელი მომხმარებელი <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"გსურთ, თქვენი სესიის გაგრძელება?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ხელახლა დაწყება"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"დიახ, გავაგრძელოთ"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"დაემატოს ახალი მომხმარებელი?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს.\n\nნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ბატარეის დამზოგი ჩართულია"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"უარყოფა"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ხმოვან დიალოგშია"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ორიგინალის აღდგენისათვის, შეეხეთ."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index a340624..c4141e1 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Батарея үнемдегішін қосу"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Параметрлер"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Ұшақ режимі"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Авто айналатын экран"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ҮНСІЗ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"Авто"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Бекіту экраны."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Параметрлер"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Шолу."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Пайдаланушы <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi өшірілді."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Ұшақ режимі қосылды."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Мазаламау режимі қосулы, тек басымдық"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Мазаламау режимі қосулы, үзілістерсіз"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Кедергі жасамаңыз, тек дабылдар."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Мазаламау режимі өшірулі"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Мазаламау режимі өшірілді."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Мазаламау режимі қосылды."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Десерт жағдайы"</string> <string name="start_dreams" msgid="7219575858348719790">"Қалғу"</string> <string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Ұшақ режимі"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Мазаламау"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Тек басымдық"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Тек дабылдар"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Үзулерсіз"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> құрылғылары)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін жоғары сырғыту."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін солға сырғыту."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Үзілулер болмайды. Тіпті дабылдар да."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Үзулерсіз"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Тек басым үзулер"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Тек дабылдар"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Келесі дабыл — <xliff:g id="ALARM_TIME">%s</xliff:g> уақытында"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Келесі дабыл — <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> уақытында дабылды естімейсіз"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Бекітпесін ашу үшін жанаңыз"</string> <string name="phone_hint" msgid="3101468054914424646">"Телефон үшін оңға жанаңыз"</string> <string name="camera_hint" msgid="5241441720959174226">"Камера үшін солға жанаңыз"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ешқандай"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Басымдық"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Кедергілерсіз"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Тек басымдық"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Тек дабылдар"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Барлығы"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Кедергілер\nжоқ"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Тек\nбасымдық"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Тек\nдабылдар"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Зарядталуда (толғанша <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Пайдаланушыны ауыстыру"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Пайдаланушыны ауыстыру, ағымдағы пайдаланушы <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Сеансты жалғастыру керек пе?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Қайта бастау"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Иә, жалғастыру"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Жаңа пайд-ны қосу керек пе?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Жаңа пайдаланушыны қосқанда сол адам өз кеңістігін реттеуі керек.\n\nКез келген пайдаланушы барлық басқа пайдаланушылар үшін қолданбаларды жаңарта алады."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Батарея үнемдегіш қосулы"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Өшіру"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> — көлем диалогтық терезесі"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Түпнұсқаны қалпына келтіру үшін түртіңіз."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 4fb737c..8087373 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"បើកធាតុរក្សាថាមពលថ្ម"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ការកំណត់"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"វ៉ាយហ្វាយ"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ពេលជិះយន្តហោះ"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"បង្វិលអេក្រង់ស្វ័យប្រវត្តិ"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ស្ងាត់"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ស្វ័យប្រវត្តិ"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ចាក់សោអេក្រង់។"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"ការកំណត់"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ទិដ្ឋភាព។"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"អ្នកប្រើ <xliff:g id="USER">%s</xliff:g> ។"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"បានបិទវ៉ាយហ្វាយ។"</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"បានបើករបៀបជិះយន្តហោះ។"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"បានបើកមុខងារកុំរំខាន (អាទិភាពប៉ុណ្ណោះ)។"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"បានបើកមុខងារកុំរំខាន សូមកុំរំខាន"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"មុខងារកុំរំខានបានបើក សម្លេងរោទិ៍ប៉ុណ្ណោះ។"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"បានបិទមុខងារកុំរំខាន។"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"បានបិទមុខងារកុំរំខាន។"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"បានបើកមុខងារកុំរំខាន។"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"ករណី Dessert"</string> <string name="start_dreams" msgid="7219575858348719790">"ធាតុរក្សាអេក្រង់"</string> <string name="ethernet_label" msgid="7967563676324087464">"អ៊ីសឺរណិត"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"របៀបពេលជិះយន្តហោះ"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"កុំរំខាន"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"អាទិភាពប៉ុណ្ណោះ"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"សំឡេងរោទ៍ប៉ុណ្ណោះ"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"សូមកុំរំខាន"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ប៊្លូធូស"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ប៊្លូធូស (ឧបករណ៍ <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string> <string name="description_direction_left" msgid="7207478719805562165">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"គ្មានការផ្អាក។ គ្មានការជូនដំណឹងពីព្រឹត្តិការណ៍។"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"គ្មានការផ្អាក"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"តែការផ្អាកអាទិភាពប៉ុណ្ណោះ"</string> + <string name="zen_alarms" msgid="5055668280767657759">"សំឡេងរោទ៍ប៉ុណ្ណោះ"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"ការជូនដំណឹងបន្ទាប់របស់អ្នកគឺនៅម៉ោង <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"ការជូនដំណឹងបន្ទាប់របស់អ្នកគឺនៅ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"អ្នកនឹងមិនឮការជូនដំណឹងរបស់អ្នកនៅម៉ោង <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"អូសឡើងលើ ដើម្បីដោះសោ"</string> <string name="phone_hint" msgid="3101468054914424646">"អូសទៅស្ដាំដើម្បីបើកទូរស័ព្ទ"</string> <string name="camera_hint" msgid="5241441720959174226">"អូសទៅឆ្វេងដើម្បីប្រើម៉ាស៊ីនថត"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"គ្មាន"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"អាទិភាព"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"គ្មានការរំខាន"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"អាទិភាពប៉ុណ្ណោះ"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"សំឡេងរោទ៍ប៉ុណ្ណោះ"</string> <string name="interruption_level_all" msgid="1330581184930945764">"ទាំងអស់"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"មិនមានការរំខា\nទេ"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"អាទិភាព\nប៉ុណ្ណោះ"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"សំឡេងរោទ៍\nប៉ុណ្ណោះ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"កំពុងបញ្ចូលថ្ម (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ទើបពេញ)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ប្ដូរអ្នកប្រើ"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ប្ដូរអ្នកប្រើ អ្នកប្រើបច្ចុប្បន្ន <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"តើអ្នកចង់បន្តសម័យរបស់អ្នក?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ចាប់ផ្ដើម"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"បាទ/ចាស បន្ត"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"បន្ថែមអ្នកប្រើថ្មី?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ពេលអ្នកបន្ថែមអ្នកប្រើថ្មី អ្នកប្រើនោះត្រូវកំណត់ទំហំផ្ទាល់របស់គេ។\n\nអ្នកប្រើណាមួយក៏អាចធ្វើបច្ចុប្បន្នភាពកម្មវិធីសម្រាប់អ្នកប្រើផ្សេងបានដែរ។"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"កម្មវិធីសន្សំថ្មគឺបើក"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"បដិសេធ"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> គឺជាប្រអប់សម្លេង"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ប៉ះដើម្បីស្តារច្បាប់ដើម។"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 87a1bb4..fe138ce 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ಬ್ಯಾಟರಿ ಉಳಿತಾಯವನ್ನು ಆನ್ ಮಾಡಿ"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ಪರದೆಯನ್ನು ಸ್ವಯಂ-ತಿರುಗಿಸಿ"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ಮ್ಯೂಟ್"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ಸ್ವಯಂ"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ಲಾಕ್ ಪರದೆ."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ಸಮಗ್ರ ನೋಟ."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ಬಳಕೆದಾರ <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ವೈಫೈ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ ಅನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್, ಆದ್ಯತೆ ಮಾತ್ರ."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ, ಯಾವುದೇ ಅಡಚಣೆಗಳಿಲ್ಲ."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"ಅಲಾರಮ್ಗಳಿಗೆ ಮಾತ್ರ ಅಡಚಣೆ ಮಾಡಬೇಡಿ."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆಫ್ ಆಗಿದೆ."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"ತೊಂದರೆ ಮಾಡಬೇಡಿ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"ಡೆಸರ್ಟ್ ಕೇಸ್"</string> <string name="start_dreams" msgid="7219575858348719790">"ಡೇಡ್ರೀಮ್"</string> <string name="ethernet_label" msgid="7967563676324087464">"ಇಥರ್ನೆಟ್"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ಆದ್ಯತೆ ಮಾತ್ರ"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ಅಲಾರಮ್ಗಳು ಮಾತ್ರ"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"ಯಾವುದೇ ಅಡಚಣೆಗಳಿಲ್ಲ"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ಬ್ಲೂಟೂತ್"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ಬ್ಲೂಟೂತ್ (<xliff:g id="NUMBER">%d</xliff:g> ಸಾಧನಗಳು)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಮೇಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ಅಲಾರಂಗಳನ್ನು ಸೇರಿದಂತೆ ಯಾವುದೇ ಅಡಚಣೆಗಳಿಲ್ಲ."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"ಯಾವುದೇ ಅಡಚಣೆಗಳಿಲ್ಲ"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"ಆದ್ಯತೆಯ ಅಡಚಣೆಗಳು ಮಾತ್ರ"</string> + <string name="zen_alarms" msgid="5055668280767657759">"ಅಲಾರಮ್ಗಳು ಮಾತ್ರ"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"ನಿಮ್ಮ ಮುಂದಿನ ಅಲಾರಂ <xliff:g id="ALARM_TIME">%s</xliff:g> ಗೆ ಆಗಿದೆ"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"ನಿಮ್ಮ ಮುಂದಿನ ಅಲಾರಮ್ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g> ಆಗಿದೆ"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> ಗೆ ನೀವು ನಿಮ್ಮ ಅಲಾರಂ ಆಲಿಸುವುದಿಲ್ಲ"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="phone_hint" msgid="3101468054914424646">"ಫೋನ್ಗಾಗಿ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="camera_hint" msgid="5241441720959174226">"ಕ್ಯಾಮರಾಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"ಯಾವುದೂ ಇಲ್ಲ"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"ಆದ್ಯತೆ"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"ಯಾವುದೇ ಅಡಚಣೆಗಳಿಲ್ಲ"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"ಆದ್ಯತೆ ಮಾತ್ರ"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"ಅಲಾರಮ್ಗಳು ಮಾತ್ರ"</string> <string name="interruption_level_all" msgid="1330581184930945764">"ಎಲ್ಲ"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"ಯಾವುದೇ\nಅಡಚಣೆಗಳಿಲ್ಲ"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"ಆದ್ಯತೆ\nಮಾತ್ರ"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"ಅಲಾರಮ್ಗಳು\nಮಾತ್ರ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ ( ಪೂರ್ತಿ ಆಗುವವರೆಗೆ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ಬಳಕೆದಾರರನ್ನು ಬದಲಿಸಿ"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ಬಳಕೆದಾರರನ್ನು ಬದಲಿಸಿ, ಪ್ರಸ್ತುತ ಬಳಕೆದಾರ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"ನಿಮ್ಮ ಸೆಷನ್ ಮುಂದುವರಿಸಲು ಇಚ್ಚಿಸುವಿರಾ?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ಪ್ರಾರಂಭಿಸಿ"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ಹೌದು, ಮುಂದುವರಿ"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನವೀಕರಿಸಬಹುದು."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ಬ್ಯಾಟರಿ ರಕ್ಷಕ ಆನ್ ಆಗಿದೆ"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ನಿರಾಕರಿಸು"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ವಾಲ್ಯೂಮ್ ಸಂವಾದವಾಗಿದೆ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ಮೂಲ ಮರುಸ್ಥಾಪಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 9fe24f4..c525095 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"배터리 절약 기능 사용"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"설정"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"비행기 모드"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"자동 화면 회전"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"무시"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"자동"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"화면을 잠급니다."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"설정"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"최근 사용"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"사용자 <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi가 사용 중지되었습니다."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"비행기 모드를 사용합니다."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"알림 일시중지 사용, 중요 알림만 수신"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"알림 일시중지 사용, 방해 금지"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"알림 일시중지 사용, 알람만 수신"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"알림 일시중지 사용 중지"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"알림 일시중지가 사용 중지되었습니다."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"알림 일시중지를 사용합니다."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"디저트 케이스"</string> <string name="start_dreams" msgid="7219575858348719790">"화면 보호기"</string> <string name="ethernet_label" msgid="7967563676324087464">"이더넷"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"비행기 모드"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"알림 일시중지"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"중요 알림만"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"알람만 수신"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"방해 금지"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"블루투스"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"블루투스(<xliff:g id="NUMBER">%d</xliff:g>개의 기기)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 위로 슬라이드"</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 왼쪽으로 슬라이드"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"어떤 방해도 받지 않습니다. 알람도 울리지 않습니다."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"모든 알림 차단"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"최우선 알림만 수신"</string> + <string name="zen_alarms" msgid="5055668280767657759">"알람만 수신"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"다음 알람 시각: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"다음 알람 일시: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g>에 알람을 들을 수 없습니다."</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"위로 스와이프하여 잠금 해제"</string> <string name="phone_hint" msgid="3101468054914424646">"전화 기능을 사용하려면 오른쪽으로 스와이프하세요."</string> <string name="camera_hint" msgid="5241441720959174226">"카메라를 사용하려면 왼쪽으로 스와이프하세요."</string> - <string name="interruption_level_none" msgid="3831278883136066646">"수신 안함"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"최우선만 수신"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"방해 금지"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"중요 알림만"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"알람만 수신"</string> <string name="interruption_level_all" msgid="1330581184930945764">"모두 수신"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"방해\n금지"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"중요 알림만\n허용"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"알람만\n수신"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"충전 중(<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> 후 충전 완료)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"사용자 전환"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"사용자 전환, 현재 사용자 <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"세션을 계속 진행하시겠습니까?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"다시 시작"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"예, 계속합니다."</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"새 사용자를 추가할까요?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"배터리 세이버 사용 중"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"거부"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>은(는) 볼륨 대화입니다."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"원본을 복원하려면 터치하세요."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index 1a7aa8b..eca5b2c 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -52,8 +52,6 @@ <skip /> <!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) --> <skip /> - <!-- no translation found for status_bar_settings_airplane (4879879698500955300) --> - <skip /> <!-- no translation found for status_bar_settings_auto_rotation (3790482541357798421) --> <skip /> <!-- no translation found for status_bar_settings_mute_label (554682549917429396) --> @@ -194,6 +192,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Кулпуланган экран."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Жөндөөлөр"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Көз жүгүртүү."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Колдонуучу <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi өчүрүлдү."</string> @@ -206,6 +206,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Учак режими күйгүзүлдү."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Тынчымды алба деген күйүк, артыкчылыктуулар гана."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Тынчымды алба деген күйүк, үзгүлтүккө учуратуулар жок."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Тынчымды алба деген күйүк, ойготкучтар гана."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Тынчымды алба деген өчүк."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Тынчымды алба деген өчүрүлдү."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Тынчымды алба деген күйгүзүлдү."</string> @@ -256,9 +257,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Десерт себети"</string> <string name="start_dreams" msgid="7219575858348719790">"Кыялдануу"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Учак тартиби"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Тынчымды алба"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Артыкчылык гана"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ойготкучтар гана"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Үзгүлтүксүз"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> түзмөк)"</string> @@ -327,8 +328,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн жогору жылмыштырыңыз."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн солго жылмыштырыңыз."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Үзгүлтүктөр жок. Ойготкучтар дагы жок."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Үзгүлтүксүз"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Артыкчылыктуу үзгүлтүктөр гана"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Ойготкучтар гана"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Кийинки үн ишараты саат <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Кийинки үн ишараты <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Саат <xliff:g id="ALARM_TIME">%s</xliff:g> үн ишаратын укпайсыз."</string> @@ -338,9 +344,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Кулпуну ачуу үчүн серпип коюңуз"</string> <string name="phone_hint" msgid="3101468054914424646">"Телефонду колдонуу үчүн оңго серпип коюңуз"</string> <string name="camera_hint" msgid="5241441720959174226">"Камераны ачуу үчүн солго серпип коюңуз"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Эч нерсе жок"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Артыкчылыктуу"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Үзгүлтүксүз"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Артыкчылык гана"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Ойготкучтар гана"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Бардыгы"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Үзгүтүк\nжок"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Артыкчылыктуу\nгана"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Ойготкучтар\nгана"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Кубатталууда (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> толгонго чейин)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Колдонуучуну которуу"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Колдонуучуну күйгүзүү, учурдагы колдонуучу <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -357,6 +367,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Сеансыңызды улантасызбы?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Кайра баштоо"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ооба, уланта берели"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Жаңы колдонуучу кошосузбу?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Жаңы колдонуучу кошулганда, ал өз мейкиндигин түзүп алышы керек.\n\nКолдонмолорду бир колдонуучу жаңыртканда, ал калган бардык колдонуучулар үчүн да жаңырат."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Батареяны үнөмдөгүч күйгүзүлдү"</string> @@ -408,4 +424,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Жок"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> үндү катуулатуу диалогу"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Түпнусканы калыбына келтирүү үчүн тийип коюңуз."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-land/styles.xml b/packages/SystemUI/res/values-land/styles.xml index e58fbb1..8919198 100644 --- a/packages/SystemUI/res/values-land/styles.xml +++ b/packages/SystemUI/res/values-land/styles.xml @@ -18,10 +18,4 @@ <style name="BrightnessDialogContainer" parent="@style/BaseBrightnessDialogContainer"> <item name="android:layout_width">360dp</item> </style> - - <style name="SearchPanelScrim"> - <item name="android:layout_width">@dimen/search_panel_scrim_height</item> - <item name="android:layout_height">match_parent</item> - <item name="android:layout_gravity">right</item> - </style> </resources> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 4d215e3..8ce9eda 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ເປີດໃຊ້ໂຕປະຢັດແບັດເຕີຣີ"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ການຕັ້ງຄ່າ"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ໂໝດເທິງຍົນ"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ໝຸນໜ້າຈໍອັດຕະໂນມັດ"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ປິດສຽງ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ອັດຕະໂນມັດ"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ລັອກໜ້າຈໍ."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"ການຕັ້ງຄ່າ"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ພາບຮວມ."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ຜູ່ໃຊ້ <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ປິດ Wi-Fi ແລ້ວ."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ເປີດໂໝດຢູ່ໃນຍົນແລ້ວ."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"ຫ້າມລະກວນເປີດຢູ່, ບຸລິມະສິດເທົ່ານັ້ນ."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"ຫ້າມລະກວນເປີດຢູ່, ບໍ່ມີການຂັດຈັງຫວະ."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"ຫ້າມລົບກວນເປີດຢູ່, ໂມງປຸກເທົ່ານັ້ນ."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"ຫ້າມລົບກວນປິດຢູ່."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"ຢ່າລົບກວນປິດແລ້ວ."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"ຢ່າລົບກວນເປີດແລ້ວ."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"ກ່ອງຂອງຫວານ"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ໂໝດຢູ່ໃນຍົນ"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ຫ້າມລົບກວນ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ບຸລິມະສິດເທົ່ານັ້ນ"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ໂມງປຸກເທົ່ານັ້ນ"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"ບໍ່ມີການລົບກວນ"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> ອຸປະກອນ)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"ເລື່ອນໄປທາງຊ້າຍເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ບໍ່ມີການລົບກວນ. ບໍ່ວ່າຈະເປັນໂມງປຸກກໍຕາມ."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"ບໍ່ມີການລົບກວນ"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"ສະເພາະເລື່ອງສຳຄັນເທົ່ານັນ"</string> + <string name="zen_alarms" msgid="5055668280767657759">"ໂມງປຸກເທົ່ານັ້ນ"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"ໂມງປຸກຖັດໄປຂອງທ່ານແມ່ນ <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"ໂມງປຸກຖັດໄປຂອງທ່ານແມ່ນ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"ທ່ານຈະບໍ່ໄດ້ຍິນສຽງໂມງປຸກໃນເວລາ <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"ເລື່ອນຂຶ້ນເພື່ອປົດລັອກ"</string> <string name="phone_hint" msgid="3101468054914424646">"ປັດຂວາເພື່ອໃຊ້ໂທລະສັບ"</string> <string name="camera_hint" msgid="5241441720959174226">"ປັດຊ້າຍເພື່ອໃຊ້ກ້ອງ"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"ບໍ່ມີ"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"ລະດັບຄວາມສຳຄັນ"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"ບໍ່ມີການລົບກວນ"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"ບຸລິມະສິດເທົ່ານັ້ນ"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"ໂມງປຸກເທົ່ານັ້ນ"</string> <string name="interruption_level_all" msgid="1330581184930945764">"ທັງໝົດ"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"ບໍ່ມີ\nລົບກວນ"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"ບຸລິມະສິດ\nເທົ່ານັ້ນ"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"ໂມງປຸກ\nເທົ່ານັ້ນ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ກຳລັງສາກໄຟ (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ກວ່າຈະເຕັມ)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ສະລັບຜູ່ໃຊ້"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ປ່ຽນຜູ່ໃຊ້, ຜູ່ໃຊ້ປະຈຸບັນ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"ທ່ານຕ້ອງການສືບຕໍ່ເຊດຊັນຂອງທ່ານບໍ່?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ເລີ່ມຕົ້ນໃຫມ່"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ຕົກລົງ, ດຳເນີນການຕໍ່"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"ເພີ່ມຜູ່ໃຊ້ໃໝ່ບໍ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ເມື່ອທ່ານເພີ່ມຜູ່ໃຊ້ໃໝ່, ຜູ່ໃຊ້ນັ້ນຈະຕ້ອງຕັ້ງຄ່າພື້ນທີ່ບ່ອນຈັດເກັບຂໍ້ມູນຂອງລາວ.\n\nຜູ່ໃຊ້ທຸກຄົນສາມາດອັບເດດແອັບຯຂອງຜູ່ໃຊ້ຄົນອື່ນທັງໝົດໄດ້."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ເປີດໃຊ້ໂຕປະຢັດແບັດເຕີຣີແລ້ວ"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ປະຕິເສດ"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ແມ່ນໜ້າຕ່າງລະດັບສຽງ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ສໍາຜັດເພື່ອກູ້ຄືນຕົ້ນສະບັບ."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 1cb5980..7e211cd 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -46,7 +46,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Įj. Akum. tausojimo priemonę"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nustatymai"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lėktuvo režimas"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automatiškai sukti ekraną"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"NUTILD."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Užrakinimo ekranas."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Nustatymai"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Apžvalga."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Naudotojas <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"„Wi-Fi“ ryšys išjungtas."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Lėktuvo režimas įjungtas."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Funkcija „Netrukdyti“ įjungta. Tik prioritetiniai įvykiai."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Funkcija „Netrukdyti“ įjungta. Jokių pertraukčių."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Funkcija „Netrukdyti“ įjungta. Leidžiami tik signalai."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Funkcija „Netrukdyti“ išjungta."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Funkcija „Netrukdyti“ išjungta."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Funkcija „Netrukdyti“ įjungta."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Desertų dėklas"</string> <string name="start_dreams" msgid="7219575858348719790">"Svajonė"</string> <string name="ethernet_label" msgid="7967563676324087464">"Eternetas"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lėktuvo režimas"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Netrukdyti"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tik prioritetiniai įvykiai"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tik signalai"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Jokių pertraukčių"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"„Bluetooth“ (<xliff:g id="NUMBER">%d</xliff:g> įreng.)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Slyskite aukštyn link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Slyskite į kairę link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Nėra trikdžių. Nėra net įspėjimų."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Jokių pertraukčių"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Tik prioritetinės pertrauktys"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Tik signalai"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Kito signalo laikas: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Kito signalo laikas: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> signalo negirdėsite"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Perbraukite aukštyn, kad atrakintumėte"</string> <string name="phone_hint" msgid="3101468054914424646">"Perbraukite į dešinę, kad galėtumėte skambinti"</string> <string name="camera_hint" msgid="5241441720959174226">"Perbraukite į kairę, kad būtų įjungtas fotoaparatas"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Nėra"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritetas"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Jokių pertraukčių"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Tik prioritetiniai"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Tik signalai"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Visi"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Neleidžiama\ntrukdyti"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Tik\nprioritetiniai"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Tik\nsignalai"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Kraunama (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> iki visiško įkrovimo)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Perjungti naudotoją"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Perjungti naudotoją, dabartinis naudotojas <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Ar norite tęsti sesiją?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Pradėti iš naujo"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Taip, tęsti"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Pridėti naują naudotoją?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo erdvę.\n\nBet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Akumuliatoriaus tausojimo priemonė įjungta"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Atmesti"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ yra garsumo valdymo dialogo langas"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Palieskite, kad atkurtumėte originalą."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 5fdc0cd..c692791 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -45,7 +45,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Ieslēgt akumulatora jaudas taupīšanu"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Iestatījumi"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lidmašīnas režīms"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automātiska ekrāna pagriešana"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"IZ. SK."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string> @@ -169,6 +168,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Bloķēšanas ekrāns."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Iestatījumi"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pārskats."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Lietotājs: <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi ir izslēgts."</string> @@ -181,6 +182,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Lidojuma režīms ir ieslēgts."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Statuss Netraucēt ir ieslēgts, izvēlēts iestatījums Tikai prioritārie."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Statuss Netraucēt ir ieslēgts, izvēlēts iestatījums Bez pārtraukumiem."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Ieslēgts režīms “Netraucēt”, atļauti tikai signāli."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Statuss Netraucēt ir izslēgts."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Statuss Netraucēt tika izslēgts."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Statuss Netraucēt tika ieslēgts."</string> @@ -231,9 +233,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Saldo ēdienu stends"</string> <string name="start_dreams" msgid="7219575858348719790">"Ekrānsaudzētājs"</string> <string name="ethernet_label" msgid="7967563676324087464">"Tīkls Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lidojuma režīms"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Netraucēt"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tikai prioritārie"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tikai signāli"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Bez pārtraukumiem"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> ierīce(-es))"</string> @@ -302,8 +304,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Velciet uz augšu, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Velciet pa kreisi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Bez traucējumiem. Pat bez brīdinājumiem"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Nepārtraukt"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Tikai prioritārie pārtraukumi"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Tikai signāli"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Jūsu nākamā signāla laiks: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Jūsu nākamā signāla datums un laiks: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Jūs nedzirdēsiet iestatīto signālu: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -313,9 +320,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Velciet uz augšu, lai atbloķētu"</string> <string name="phone_hint" msgid="3101468054914424646">"Lai lietotu tālruni, velciet pa labi."</string> <string name="camera_hint" msgid="5241441720959174226">"Lai lietotu kameru, velciet pa kreisi."</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Nav"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritāte"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Bez pārtraukumiem"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Tikai prioritārie"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Tikai signāli"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Visi"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Nepārtraukt\n"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Tikai\nprioritārie"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Tikai\nsignāli"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Notiek uzlāde (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> līdz pilnīgai uzlādei)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Mainīt lietotāju"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Pārslēgt lietotāju; pašreizējais lietotājs: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -332,6 +343,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Vai vēlaties turpināt savu sesiju?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Sākt no sākuma"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Jā, turpināt"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Vai pievienot jaunu lietotāju?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kad pievienosiet jaunu lietotāju, viņam būs jāizveido savs profils.\n\nIkviens lietotājs var atjaunināt lietotnes citu lietotāju vietā."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Ieslēgts akumulatora enerģijas taupīšanas režīms"</string> @@ -383,4 +400,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Neatļaut"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ir skaļuma dialoglodziņš"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Pieskarieties, lai atjaunotu sākotnējo."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 83988c0..b13a58a 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Вклучете го штедачот на батерија"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Подесувања"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим на работа во авион"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Автоматско ротирање на екранот"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ИСКЛ."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"Автоматски"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заклучи екран."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Поставки"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Краток преглед."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Корисник <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi е исклученo."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Авионскиот режим е вклучен."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"„Не вознемирувај“ е вклучено, само приоритетни."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"„Не вознемирувај“ е вклучено, без прекини."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"„Не вознемирувај“ е вклучено, само аларми."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"„Не вознемирувај“ е исклучено."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"„Не вознемирувај“ е исклучено."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"„Не вознемирувај“ е вклучено."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим на работа во авион"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не вознемирувај"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само приоритетно"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само аларми"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Без прекини"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> уреди)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Лизгај нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Лизгај налево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Без прекини. Дури и без аларми."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Без прекини"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Само приоритетни прекини"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Само аларми"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Следниот аларм е во <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Следниот аларм е <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Нема да го слушнете алармот во <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Повлечете за да се отклучи"</string> <string name="phone_hint" msgid="3101468054914424646">"Повлечете надесно за телефон"</string> <string name="camera_hint" msgid="5241441720959174226">"Повлечете налево за камера"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ништо"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Приоритет"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Без прекини"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Само приоритетно"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Само аларми"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Сѐ"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Нема\nпрекини"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Само\nприоритетни"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Само\nаларми"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Се полни (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> додека не се наполни)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Промени го корисникот"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Промени го корисникот, тековен корисник <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Дали сакате да продолжите со сесијата?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Почни одново"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Да, продолжи"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Да се додаде нов корисник?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Кога додавате нов корисник, тоа лице треба да го постави својот простор.\n\nСекој корисник може да ажурира апликации за сите други корисници."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Штедачот на батерија е вклучен"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Одбиј"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> е дијалог за јачина на звук"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Допрете за да го вратите оригиналот."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index ee090f9..e0d3eaf 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ബാറ്ററി സേവർ ഓണാക്കുക"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ക്രമീകരണങ്ങൾ"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ഫ്ലൈറ്റ് മോഡ്"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"സ്ക്രീൻ യാന്ത്രികമായി തിരിക്കുക"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"മ്യൂട്ടുചെയ്യുക"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"യാന്ത്രികം"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ലോക്ക് സ്ക്രീൻ."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"ക്രമീകരണങ്ങൾ"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"കാഴ്ച."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ഉപയോക്താവ് <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"വൈഫൈ ഓഫാക്കി."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ഫ്ലൈറ്റ് മോഡ് ഓണാക്കി."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"ശല്യപ്പെടുത്തരുത് എന്നത് ഓണാണ്, മുൻഗണന മാത്രം."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"ശല്യപ്പെടുത്തരുത് എന്നത് ഓണാണ്, തടസ്സങ്ങളൊന്നുമില്ല."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\'ശല്യപ്പെടുത്തരുത്\' ഓണാണ്, അലാറം മാത്രം."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"ശല്ല്യപ്പെടുത്തരുത് എന്നത് ഓഫാണ്."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"ശല്യപ്പെടുത്തരുത് എന്നത് ഓഫാക്കി."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"ശല്യപ്പെടുത്തരുത് എന്നത് ഓണാക്കി."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"ഡെസേർട്ട് കെയ്സ്"</string> <string name="start_dreams" msgid="7219575858348719790">"ഡേഡ്രീം"</string> <string name="ethernet_label" msgid="7967563676324087464">"ഇതർനെറ്റ്"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ഫ്ലൈറ്റ് മോഡ്"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ശല്ല്യപ്പെടുത്തരുത്"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"മുൻഗണന മാത്രം"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"അലാറങ്ങൾ മാത്രം"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"തടസ്സങ്ങളൊന്നുമില്ല"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ബ്ലൂടൂത്ത്"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ബ്ലൂടൂത്ത് (<xliff:g id="NUMBER">%d</xliff:g> ഉപകരണങ്ങൾ)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി മുകളിലേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി ഇടത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"തടസ്സങ്ങളൊന്നുമില്ല. അലാറങ്ങൾ പോലുമില്ല."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"തടസ്സങ്ങളൊന്നുമില്ല"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"മുൻഗണനാ തടസ്സങ്ങൾ മാത്രം"</string> + <string name="zen_alarms" msgid="5055668280767657759">"അലാറങ്ങൾ മാത്രം"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"നിങ്ങളുടെ അടുത്ത അലാറം <xliff:g id="ALARM_TIME">%s</xliff:g>-നാണ്"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"നിങ്ങളുടെ അടുത്ത അലാറം <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>-നാണ്"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"നിങ്ങൾ <xliff:g id="ALARM_TIME">%s</xliff:g>-ന് അലാറം കേൾക്കില്ല"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"അൺലോക്കുചെയ്യുന്നതിന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്യുക"</string> <string name="phone_hint" msgid="3101468054914424646">"ഫോണിനായി വലതുവശത്ത് സ്വൈപ്പുചെയ്യുക"</string> <string name="camera_hint" msgid="5241441720959174226">"ക്യാമറയ്ക്കായി ഇടതുവശത്ത് സ്വൈപ്പുചെയ്യുക"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"ഒന്നുമില്ല"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"പ്രധാനപ്പെട്ടവ"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"തടസ്സങ്ങളൊന്നുമില്ല"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"മുൻഗണന മാത്രം"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"അലാറങ്ങൾ മാത്രം"</string> <string name="interruption_level_all" msgid="1330581184930945764">"എല്ലാം"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"തടസ്സങ്ങൾ\nഒന്നുമില്ല"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"മുൻഗണന\nമാത്രം"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"അലാറങ്ങൾ\nമാത്രം"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ചാർജ്ജുചെയ്യുന്നു (പൂർണ്ണമാകുന്നതിന്, <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ഉപയോക്താവ് മാറുക"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ഉപയോക്താവിനെ മാറ്റുക, <xliff:g id="CURRENT_USER_NAME">%s</xliff:g> എന്നയാളാണ് നിലവിലുള്ള ഉപയോക്താവ്"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"നിങ്ങളുടെ സെഷൻ തുടരണോ?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"പുനരാംരംഭിക്കുക"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"അതെ, തുടരുക"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"നിങ്ങൾ ഒരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിയ്ക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും അപ്ലിക്കേഷനുകൾ അപ്ഡേറ്റുചെയ്യാനാവും."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ബാറ്ററി സേവർ ഓണാണ്"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"നിരസിക്കുക"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g>, വോളിയം ഡയലോഗാണ്"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ആദ്യത്തേത് പുനഃസ്ഥാപിക്കാൻ സ്പർശിക്കുക."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index 66f287a..b68af61 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -42,7 +42,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Батерей хэмнэгчийг асаах"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Тохиргоо"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Нислэгийн горим"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Дэлгэцийг автоматаар эргүүлэх"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ХААХ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"АВТОМАТ"</string> @@ -166,6 +165,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Дэлгэц түгжих."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Тохиргоо"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Тойм"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Хэрэглэгч <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi унтраасан."</string> @@ -178,6 +179,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Нислэгийн горимыг асаасан."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Бүү саад болно уу.Зөвхөн чухал зүйлст."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Бүү саад болно уу. Аливаа саад учруулахгүй байна уу."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Бүү саад бол, зөвхөн сэрүүлгийг асаа."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Бүү саад бол."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Идэвхгүй болгох үйлдэлд бүү саад бол."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Идэвхжүүлэх үйлдэлд бүү саад бол."</string> @@ -228,9 +230,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Амттаны хайрцаг"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Нислэгийн горим"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Бүү саад бол"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Зөвхөн чухал зүйлс"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Зөвхөн сэрүүлэг"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Аливаа саад байхгүй байх"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Блютүүт"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Блютүүт (<xliff:g id="NUMBER">%d</xliff:g> төхөөрөмж)"</string> @@ -299,8 +301,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г гулсуулах."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх зүүнлүү гулсуулах."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Тасалдал байхгүй. Сэрүүлэг ч байхгүй."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Ямар ч тасалдалгүй"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Зөвхөн нэн тэргүүний тасалдалд"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Зөвхөн сэрүүлэг"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Таны дараагийн сэрүүлгийн цаг <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Таны дараагийн сэрүүлгийн цаг <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Та <xliff:g id="ALARM_TIME">%s</xliff:g>-д өөрийн сэрүүлгээ сонсохгүй"</string> @@ -310,9 +317,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Түгжээг тайлах бол шудрана уу"</string> <string name="phone_hint" msgid="3101468054914424646">"Утас гаргахын тулд баруун шударна уу"</string> <string name="camera_hint" msgid="5241441720959174226">"Камер гаргахын тулд зүүн шударна уу"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Хоосон"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Нэн тэргүүний"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Аливаа саад байхгүй байх"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Зөвхөн чухал зүйлс"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Зөвхөн сэрүүлэг"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Бүгд"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Ямар ч\nтасалдал байхгүй"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Зөвхөн\nхамгийн чухлыг"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Зөвхөн\nсэрүүлэг"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Цэнэглэж байна (дүүргэхэд <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Хэрэглэгчийг сэлгэх"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Хэрэглэгчийг сэлгэх, одоогийн хэрэглэгч <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -329,6 +340,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Та үргэлжлүүлэхийг хүсэж байна уу?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Дахин эхлүүлэх"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Тийм, үргэлжлүүлэх"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Шинэ хэрэглэгч нэмэх үү?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Та шинэ хэрэглэгч нэмбэл, тухайн хүн өөрийн профайлыг тохируулах шаардлагатай.\n\nАль ч хэрэглэгч бүх хэрэглэгчийн апп-уудыг шинэчлэх боломжтой."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Батерей хэмнэгч асаалттай"</string> @@ -380,4 +397,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Татгалзах"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь дууны диалог юм."</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Анхны хувилбарыг эргүүлэн хадгалахыг хүсвэл хүрнэ үү."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index f40429c..c9dd37e 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"बॅटरी बचतकर्ता चालू करा"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिंग्ज"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाय-फाय"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"विमान मोड"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"स्वयं-फिरणारी स्क्रीन"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"नि:शब्द करा"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"स्वयं"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"लॉक स्क्रीन."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिंग्ज"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"विहंगावलोकन."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"वापरकर्ता <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi बंद झाले."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"विमान मोड चालू केला."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"व्यत्यय आणू नका चालू, केवळ प्राधान्य."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"व्यत्यय आणू नका चालू, कोणताही व्यत्यय नाही."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"व्यत्यय आणू नका चालू, केवळ अलार्म."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"व्यत्यय आणू नका बंद."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"व्यत्यय आणू नका बंद करा"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"व्यत्यय आणू नका चालू करा"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"मिष्ठान्न प्रकरण"</string> <string name="start_dreams" msgid="7219575858348719790">"डेड्रीम"</string> <string name="ethernet_label" msgid="7967563676324087464">"इथरनेट"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"विमान मोड"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"व्यत्यय आणू नका"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"केवळ प्राधान्य"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"केवळ अलार्म"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"कोणतेही व्यत्यय नाही"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ब्लूटुथ"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ब (<xliff:g id="NUMBER">%d</xliff:g> डिव्हाइसेस)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी वर स्लाइड करा."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी डावीकडे स्लाइड करा."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"कोणतेही व्यत्यय नाहीत. अगदी अलार्मचे देखील नाहीत."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"कोणतेही व्यत्यय नाही"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"केवळ प्राधान्य दिलेले व्यत्यय"</string> + <string name="zen_alarms" msgid="5055668280767657759">"केवळ अलार्म"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"आपला पुढील अलार्म <xliff:g id="ALARM_TIME">%s</xliff:g> वाजता आहे"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"आपला पुढील अलार्म <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g> आहे"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"आपण आपला अलार्म <xliff:g id="ALARM_TIME">%s</xliff:g> वाजता ऐकणार नाही"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"अनलॉक करण्यासाठी स्वाइप करा"</string> <string name="phone_hint" msgid="3101468054914424646">"फोन साठी उजवीकडे स्वाइप करा"</string> <string name="camera_hint" msgid="5241441720959174226">"कॅमेर्यासाठी डावीकडे स्वाइप करा"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"काहीही नाही"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"प्राधान्य"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"कोणतेही व्यत्यय नाहीत"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"केवळ प्राधान्य"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"केवळ अलार्म"</string> <string name="interruption_level_all" msgid="1330581184930945764">"सर्व"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"कोणतेही व्यत्यय\nनाही"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"केवळ\nप्राधान्य"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"केवळ\nअलार्म"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"(<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> पूर्ण होईपर्यंत) चार्ज होत आहे"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"वापरकर्ता स्विच करा"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"वापरकर्ता स्विच करा, वर्तमान वापरकर्ता <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"आपण आपले सत्र सुरु ठेवू इच्छिता?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"येथून प्रारंभ करा"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"होय, सुरु ठेवा"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"नवीन वापरकर्ता जोडायचा?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"आपण एक नवीन वापरकर्ता जोडता तेव्हा, त्या व्यक्तीने त्यांचे स्थान सेट करणे आवश्यक असते.\n\nकोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अॅप्स अद्यतनित करू शकतो."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"बॅटरी बचतकर्ता चालू आहे"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"नकार द्या"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> हा व्हॉल्यूम संवाद आहे"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूळ पुनर्संचयित करण्यासाठी स्पर्श करा."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index 5ee867f..f5624a0 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Hidupkan penjimat bateri"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Tetapan"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mod pesawat"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Autoputar skrin"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"REDAM"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kunci skrin."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Tetapan"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikhtisar."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi dimatikan."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Mod pesawat dihidupkan."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Jangan ganggu dihidupkan, perkara penting sahaja."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Jangan ganggu dihidupkan, tiada gangguan."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Jangan ganggu dihidupkan, penggera sahaja."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Jangan ganggu dimatikan."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Jangan ganggu dimatikan."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Jangan ganggu dihidupkan."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Bekas Pencuci Mulut"</string> <string name="start_dreams" msgid="7219575858348719790">"Lamun"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mod kapal terbang"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Jangan ganggu"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Keutamaan sahaja"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Penggera sahaja"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Tiada gangguan"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Peranti)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Luncurkan ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Luncurkan ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Tiada gangguan, walau penggera sekalipun."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Tiada gangguan"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Gangguan keutamaan sahaja"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Penggera sahaja"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Penggera anda yang seterusnya pada <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Penggera anda yang seterusnya pada <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Anda tdk akan mdgr penggera anda pd <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Leret ke atas untuk membuka kunci"</string> <string name="phone_hint" msgid="3101468054914424646">"Leret ke kanan untuk telefon"</string> <string name="camera_hint" msgid="5241441720959174226">"Leret ke kiri untuk kamera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Tiada"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Keutamaan"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Tiada gangguan"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Keutamaan sahaja"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Penggera sahaja"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Semua"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Tiada\ngangguan"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Keutamaan\nsahaja"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Penggera\nsahaja"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Mengecas (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> sehingga penuh)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Tukar pengguna"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Tukar pengguna, pengguna semasa <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Adakah anda ingin meneruskan sesi anda?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Mulakan semula"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ya, teruskan"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Tambah pengguna baharu?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Apabila anda menambah pengguna baharu, orang itu perlu menyediakan ruang mereka.\n\nMana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Penjimat bateri dihidupkan"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tolak"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ialah dialog kelantangan"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Sentuh untuk memulihkan yang asal."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 8880f93..f0aa3b1 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရန်"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"အပြင်အဆင်များ"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ဝိုင်ဖိုင်"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"မျက်နှာပြင်အလိုအလျောက်လှည့်ရန်"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"မျက်နှာပြင် သော့ပိတ်ရန်"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"ဆက်တင်များ"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ခြုံကြည့်မှု။"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"သုံးစွဲသူ <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>။"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ကြိုးမဲ့ ပိတ်ထား။"</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"လေယာဉ် မုဒ်ကို ဖွင့်ထားလိုက်ပြီ။"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"မနှောင့်ယှက်ပါနှင့် ဖွင့်ထားသည်၊ ဦးစားပေးများသာ။"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"မနှောင့်ယှက်ပါနှင့် ဖွင့်ထားသည်၊ အနှောင့်အယှက်များ မရှိပါ။"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"အနှောင့်ယှက်ရ ဖွင့်ထားသည်။ နှိုးစက်များသာ။"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"မနှောင့်ယှက်ပါနှင့် ကိုပိတ်ထားသည်။"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"မနှောင့်ယှက်ပါနှင့် ကိုပိတ်ထားသည်။"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"မနှောင့်ယှက်ပါနှင့်ကို ဖွင့်ထားသည်။"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"မုန့်ထည့်သော ပုံး"</string> <string name="start_dreams" msgid="7219575858348719790">"ဒေးဒရင်းမ်"</string> <string name="ethernet_label" msgid="7967563676324087464">"အီသာနက်"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"မနှောက်ယှက်ပါနှင့်"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ဦးစားပေးများသာ"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"နှိုးစက်များသာ"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"ကြားဖြတ်ဝင်မှု ခွင့်မပြုရန်"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ဘလူးတု"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ဘလူးတု (<xliff:g id="NUMBER">%d</xliff:g> စက်များ)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အပေါ်ကို ပွတ်ဆွဲပါ"</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဖယ်ဘက်ကို ပွတ်ဆွဲပါ"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ကြားဖြတ်ဝင်မှုများ မရှိခဲ့။ နှိုးစက်ပင် မရှိခဲ့။"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"ကြားဖြတ်ဝင်မှု ခွင့်မပြုရန်"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"ဦးစားပေး ကြားဖြတ်ဝင်မှုများ သာလျှင်"</string> + <string name="zen_alarms" msgid="5055668280767657759">"နှိုးစက်များသာ"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"သင်၏ နောက် နှိုးစက်၏ အချိန်မှာ<xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"သင်၏ နောက် နှိုးစက်မှာ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"သင်သည် သင်၏ <xliff:g id="ALARM_TIME">%s</xliff:g> နှိုးစက်ကို ကြားရမည် မဟုတ်"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"သော့ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string> <string name="phone_hint" msgid="3101468054914424646">"ဖုန်း အတွက် ညာသို့ ပွတ်ဆွဲပါ"</string> <string name="camera_hint" msgid="5241441720959174226">"ကင်မရာ အတွက် ဘယ်သို့ ပွတ်ဆွဲပါ"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"မရှိ"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"ဦးစားပေးမှု"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"ကြားဖြတ်ဝင်မှု ခွင့်မပြုရန်"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"ဦးစားပေးများသာ"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"နှိုးစက်များသာ"</string> <string name="interruption_level_all" msgid="1330581184930945764">"အားလုံး"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">\n"ကြားဝင်မှု မရှိပါ"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"ဦးစားပေးမှု\nသာ"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"နှိုးစက်များ\nသာ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"(<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> အပြည့် အထိ) အားသွင်းနေ"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"အသုံးပြုသူကို ပြောင်းလဲရန်"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"အသုံးပြုသူကို ပြောင်းရန်၊ လက်ရှိ အသုံးပြုသူ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"သင်သည် သင်၏ ချိတ်ဆက်မှုကို ဆက်ပြုလုပ် လိုပါသလား?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"အစမှ ပြန်စပါ"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ဟုတ်ကဲ့၊ ဆက်လုပ်ပါ"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"အသုံးပြုသူ အသစ်ကို ထည့်ရမလား?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"သင်က အသုံးပြုသူ အသစ် တစ်ဦးကို ထည့်ပေးလိုက်လျှင်၊ ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရန် လိုအပ်မည်။\n\n အသုံးပြုသူ မည်သူမဆို ကျန်အသုံးပြုသူ အားလုံးတို့အတွက် appများကို မွမ်းမံပေးနိုင်သည်။"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ငြင်းပယ်သည်"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် အသံဒိုင်ယာလော့ခ်ဖြစ်သည်"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"မူရင်းအားပြန်လည်သိမ်းဆည်းရန် ထိပါ။"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 07cf096..ef64990 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Slå på batterisparing"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Innstillinger"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Trådløse nettverk"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flymodus"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Roter skjerm automatisk"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"DEMPET"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låseskjerm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Innstillinger"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oversikt."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Bruker: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi er slått av."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Flymodus er slått på."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"«Ikke forstyrr» er på – bare prioritert."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"«Ikke forstyrr» er på – ingen avbrytelser."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Ikke forstyrr er på – bare alarmer."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"«Ikke forstyrr» er av."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"«Ikke forstyrr» er slått av."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"«Ikke forstyrr» er slått på."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertmonter"</string> <string name="start_dreams" msgid="7219575858348719790">"Dagdrøm"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flymodus"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"«Ikke forstyrr»"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Bare prioritet"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Bare alarmer"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Ingen forstyrrelser"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> enheter)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Dra opp for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Dra til venstre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Ingen forstyrrelser, ikke engang alarmer."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Ingen forstyrrelser"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Bare prioriterte forstyrrelser"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Bare alarmer"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Den neste alarmen din er stilt inn kl. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Den neste alarmen din er stilt inn <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Du kommer ikke til å høre alarmen kl. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Sveip oppover for å låse opp"</string> <string name="phone_hint" msgid="3101468054914424646">"Sveip mot høyre for å åpne telefonen"</string> <string name="camera_hint" msgid="5241441720959174226">"Sveip mot venstre for å åpne kameraet"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ingen"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritet"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Ingen forstyrrelser"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Bare prioritet"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Bare alarmer"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Alle"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Ingen\nforstyrrelser"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Bare\nPrioritet"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Bare\nalarmer"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Lader (fulladet om <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Bytt bruker"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Bytt bruker, gjeldende bruker er <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Vil du fortsette økten?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Start på nytt"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, fortsett"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Vil du legge til en ny bruker?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område.\n\nAlle brukere kan oppdatere apper for alle andre brukere."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparing er på"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Ikke tillat"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> er volumdialogen"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Trykk for å gå tilbake til den opprinnelige volumdialogen."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 549bc8b..1561177 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"ब्याट्री बचत खोल्नुहोस्"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिङहरू"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाइफाइ"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"हवाइजहाज मोड"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"स्वत:घुम्ने स्क्रिन"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"म्युट गर्नुहोस्"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"स्वतः"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"स्क्रीन बन्द गर्नुहोस्।"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिङहरू"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"सारांश।"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"प्रयोगकर्ता <xliff:g id="USER">%s</xliff:g>।"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"वाइफाइ बन्द गरियो।"</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"हवाइजहाज मोड खोलियो।"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"प्राथमिकतालाई मात्र बाधा नपुर्याउनुहोस्।"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"बाधा नपुर्याउँनुहोस्, कुनै पनि अवरोध छैनन्।"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"बाधा नगर्नुहोस्, अलार्महरू मात्र।"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"निष्क्रियलाई बाधा नपुर्याउनुहोस्"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"निष्क्रिय गरिएकालाई अवरोध नपुर्याउनुहोस्।"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"सक्रिय रहेकोलाई अवरोध नपुर्याउनुहोस्।"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"दिवासपना"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"हवाइजहाज मोड"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"बाधा नपुर्याउँनुहोस्"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"प्राथमिकता मात्र"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"अलार्महरू मात्र"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"कुनै अवरोधहरू छैन"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ब्लुटुथ"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ब्लुटुथ (<xliff:g id="NUMBER">%d</xliff:g> उपकरणहरू)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसार्नुहोस्"</string> <string name="description_direction_left" msgid="7207478719805562165">"स्लाइड <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाँ।"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"कुनै रुकावट छैन। चेतावनी समेत छैन।"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"कुनै रुकावटहरू छैन"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"प्राथमिकता रुकावटहरूमा मात्र"</string> + <string name="zen_alarms" msgid="5055668280767657759">"अलार्महरू मात्र"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"तपाईंको अर्को सचेतक <xliff:g id="ALARM_TIME">%s</xliff:g> मा छ"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"तपाईंको अर्को सचेतक <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g> हो"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> मा तपाईंले आफ्नो सचेतक सुन्नुहुने छैन"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"अनलक गर्न स्वाप गर्नुहोस्"</string> <string name="phone_hint" msgid="3101468054914424646">"फोनका लागि दाँया स्वाइप"</string> <string name="camera_hint" msgid="5241441720959174226">"क्यामेराका लागि बाँया स्वाइप"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"कुनै पनि होइन"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"प्राथमिकता"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"कुनै अवरोधहरू छैनन्"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"प्राथमिकता मात्र"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"अलार्महरू मात्र"</string> <string name="interruption_level_all" msgid="1330581184930945764">"सबै"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">\n" अवरोधहरू छैनन्"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"प्राथमिकता \nमात्र"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"अलार्महरू \nमात्र"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"चार्ज हुँदै (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> पूर्ण भएसम्म)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"प्रयोगकर्ता फेर्नुहोस्"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"प्रयोगकर्ता, हालको प्रयोगकर्ता <xliff:g id="CURRENT_USER_NAME">%s</xliff:g> मा स्विच गर्नुहोस्"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"तपाईँ आफ्नो सत्र जारी गर्न चाहनुहुन्छ?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"सुरु गर्नुहोस्"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"हो, जारी राख्नुहोस्"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"नयाँ प्रयोगकर्ता थप्नुहुन्छ?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"ब्याट्रि सेभर चालु छ"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"अस्वीकार गर्नुहोस्"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> भोल्यूम संवाद हो"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"मूल पुनर्स्थापना गर्न छुनुहोस्।"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 4f2bcc5..24ace95 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Accubesparing inschakelen"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Instellingen"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wifi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Vliegtuigmodus"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Scherm automatisch draaien"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"DEMPEN"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Vergrendelingsscherm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Instellingen"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overzicht."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Gebruiker: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi uitgeschakeld."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Vliegtuigmodus ingeschakeld."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Niet storen aan, alleen prioriteit."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Niet storen aan, geen onderbrekingen."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Niet storen aan, alleen alarmen."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Niet storen uit."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Niet storen uitgeschakeld."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Niet storen ingeschakeld."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertshowcase"</string> <string name="start_dreams" msgid="7219575858348719790">"Dagdroom"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Vliegtuigmodus"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Niet storen"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Alleen prioriteit"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alleen alarmen"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Geen onderbrekingen"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> apparaten)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Veeg omhoog voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Veeg naar links voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Geen onderbrekingen. Zelfs geen alarm."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Geen onderbrekingen"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Alleen prioriteitsonderbrekingen"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Alleen alarmen"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Uw volgende alarm is om <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Uw volgende alarm is <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"U hoort uw alarm niet om <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Veeg omhoog om te ontgrendelen"</string> <string name="phone_hint" msgid="3101468054914424646">"Veeg naar rechts voor telefoon"</string> <string name="camera_hint" msgid="5241441720959174226">"Veeg naar links voor camera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Geen"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioriteit"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Geen onderbrekingen"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Alleen prioriteit"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Alleen alarmen"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Alle"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Geen\nonderbrekingen"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Alleen\nprioriteit"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alleen\nalarmen"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Opladen (vol over <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Gebruiker wijzigen"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Schakelen tussen gebruikers, huidige gebruiker <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Wilt u doorgaan met uw sessie?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Opnieuw starten"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, doorgaan"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Nieuwe gebruiker toevoegen?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Wanneer u een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen.\n\n1Elke gebruiker kan apps updaten voor alle andere gebruikers."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Accubesparing is ingeschakeld"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Afwijzen"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> is het volumedialoogvenster"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tik hierop om het origineel te herstellen."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 7e7253c..02c1d74 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -46,7 +46,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Włącz oszczędzanie baterii"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ustawienia"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Tryb samolotowy"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Autoobracanie ekranu"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"WYGAŚ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ekran blokady."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ustawienia"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Przegląd."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Użytkownik: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi wyłączone."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Tryb samolotowy został włączony."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Nie przeszkadzać (włączone, tylko priorytetowe)."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Nie przeszkadzać (włączone, bez przeszkadzania)."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Nie przeszkadzać (włączone, tylko alarmy)."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Nie przeszkadzać (wyłączone)."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Nieprzeszkadzanie wyłączone."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Nieprzeszkadzanie włączone."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Półka ze słodkościami"</string> <string name="start_dreams" msgid="7219575858348719790">"Wygaszacz ekranu"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Tryb samolotowy"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nie przeszkadzać"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tylko priorytetowe"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tylko alarmy"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Bez przeszkadzania"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (urządzenia: <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Przesuń w górę: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Przesuń w lewo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Żadnych powiadomień. Nawet alarmów."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Bez przerw"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Tylko dźwięki priorytetowe"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Tylko alarmy"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Następny alarm o <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Następny alarm: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Nie usłyszysz alarmu o <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Przesuń w górę, by odblokować"</string> <string name="phone_hint" msgid="3101468054914424646">"Przesuń w prawo, by przełączyć się na telefon"</string> <string name="camera_hint" msgid="5241441720959174226">"Przesuń w lewo, by włączyć aparat"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Żadne"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Priorytetowe"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Bez przeszkadzania"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Tylko priorytetowe"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Tylko alarmy"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Wszystkie"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">\n"0/}przeszkadzać"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Tylko\npriorytetowe"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Tylko\nalarmy"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Ładuje się (pełne naładowanie za <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Przełącz użytkownika"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Przełącz użytkownika. Bieżący użytkownik: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Chcesz kontynuować sesję?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Rozpocznij nową"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Tak, kontynuuj"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Dodać nowego użytkownika?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil.\n\nKażdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Oszczędzanie baterii jest włączone"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmów"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> steruje głośnością"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dotknij, by przywrócić pierwotną."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 14f60dc..2b802c0 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Ativar a poupança de bateria"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Definições"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo de avião"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Rodar ecrã automaticamente"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"D. SOM"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ecrã de bloqueio."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Definições"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visão geral."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilizador <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desligado."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Modo de avião ligado."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Não incomodar ligado, apenas prioridade."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Não incomodar ligado, sem interrupções."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Não incomodar ligado, apenas alarmes."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Não incomodar desligado."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Não incomodar desligado."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Não incomodar ligado."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrina de sobremesas"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo de avião"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não incomodar"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Apenas prioridade"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Apenas alarmes"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Sem interrupções"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Dispositivos)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Deslize para cima para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="description_direction_left" msgid="7207478719805562165">"Deslize para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sem interrupções. Nem mesmo alarmes."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Sem interrupções"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Apenas interrupções com prioridade"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Apenas alarmes"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"O próximo alarme é à(s) <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"O próximo alarme é <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Não vai ouvir o alarme à(s) <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Deslizar rapidamente com o dedo para cima para desbloquear"</string> <string name="phone_hint" msgid="3101468054914424646">"Deslize rapidamente para a direita para aceder ao telemóvel"</string> <string name="camera_hint" msgid="5241441720959174226">"Deslize rapidamente para a esquerda para aceder à câmara"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Nenhum"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioridade"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Sem interrupções"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Apenas prioridade"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Apenas alarmes"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Tudo"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Sem\ninterrupções"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Apenas\nprioridade"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Apenas\nalarmes"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"A carregar (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> até à carga máxima)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Mudar utilizador"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Mudar de utilizador; o utilizador atual é <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Pretende continuar a sessão?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Recomeçar"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sim, continuar"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Adicionar um novo utilizador?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço.\n\nQualquer utilizador pode atualizar aplicações para todos os outros utilizadores."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"A poupança de bateria está ligada"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Recusar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo do volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 15d869a..8d82942 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Ativar a economia de bateria"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configurações"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avião"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Girar automaticamente a tela"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUDO"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Tela de bloqueio."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configurações"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visão geral."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuário <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"O Wi-Fi foi desativado."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"O modo avião foi ativado."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"Não perturbe\" ativado, somente prioridade."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\"Não perturbe\" ativado, sem interrupções."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"Não perturbe\" ativado, somente alarmes."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Não perturbe\" desativado."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Não perturbe\" desativado."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Não perturbe\" ativado."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avião"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Só prioridade"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Sem interrupções"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivos)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string> <string name="description_direction_left" msgid="7207478719805562165">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Sem interrupções. Nem mesmo alarmes."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Sem interrupções"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Apenas interrupções prioritárias"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Somente alarmes"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Seu próximo alarme será às <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Seu próximo alarme será em <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Você não ouvirá o alarme às <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Deslize para cima para desbloquear"</string> <string name="phone_hint" msgid="3101468054914424646">"Deslize à direita p/ usar o telefone"</string> <string name="camera_hint" msgid="5241441720959174226">"Deslize à esquerda p/ usar a câmera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Nenhum"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioridade"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Sem interrupções"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Só prioridade"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Somente alarmes"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Tudo"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Sem\ninterrupções"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Somente\nprioridade"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Somente\nalarmes"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Carregando (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> até concluir)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Trocar usuário"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Alternar usuário. Usuário atual <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Deseja continuar a sessão?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Recomeçar"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sim, continuar"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Adicionar novo usuário?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Quando você adiciona um novo usuário, essa pessoa precisa configurar o próprio espaço.\n\nQualquer usuário pode atualizar apps para os demais usuários."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"A Economia de bateria está ativada"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Negar"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> é a caixa de diálogo referente ao volume"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Toque para restaurar o original."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index d517a42..06d9ac2 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -45,7 +45,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Activați economisirea bateriei"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Setări"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mod Avion"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Rotire automată a ecranului"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"DEZAC."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTOM."</string> @@ -169,6 +168,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ecranul de blocare."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Setări"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Vizualizare generală"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilizatorul <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Conexiunea prin Wi-Fi este dezactivată."</string> @@ -181,6 +182,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Modul Avion este activat."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Setarea „Nu deranja” este activată – numai prioritare."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Setarea „Nu deranja” este activată – fără întreruperi."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Setarea „Nu deranja” este activată – numai alarme."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Setarea „Nu deranja” este dezactivată."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Setarea „Nu deranja” a fost dezactivată."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Setarea „Nu deranja” a fost activată."</string> @@ -231,9 +233,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrina cu dulciuri"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Mod Avion"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nu deranja"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Numai cu prioritate"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Numai alarme"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Fără întreruperi"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispozitive)"</string> @@ -302,8 +304,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Glisaţi în sus pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Glisaţi spre stânga pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Fără întreruperi. Nici măcar alarme."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Fără întreruperi"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Numai întreruperi cu prioritate"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Numai alarme"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Următoarea alarmă este setată la <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Următoarea alarmă este la <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Nu veți auzi alarma la <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -313,9 +320,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Glisați în sus pentru a debloca"</string> <string name="phone_hint" msgid="3101468054914424646">"Glisați la dreapta pentru a acesa telefonul"</string> <string name="camera_hint" msgid="5241441720959174226">"Glisați la stânga pentru a accesa camera foto"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Niciuna"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritate"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Fără întreruperi"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Numai cu prioritate"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Numai alarme"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Toate"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Fără\nîntreruperi"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Numai\ncu prioritate"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Numai\nalarme"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Se încarcă (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> până la finalizare)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Comutați între utilizatori"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Schimbați utilizatorul (utilizator actual <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string> @@ -332,6 +343,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Vreți să continuați sesiunea?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Începeți din nou"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Da, continuați"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Adăugați utilizator nou?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul.\n\nOrice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Economisirea bateriei este activată"</string> @@ -383,4 +400,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Refuzați"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> afișează caseta de dialog pentru volum"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Atingeți pentru a reveni la setarea inițială."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index b53b581..b6c506f 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -46,7 +46,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Включить режим энергосбережения"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Настройки"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим полета"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Автоповорот экрана"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ВЫКЛ."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"АВТО"</string> @@ -172,6 +171,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заблокированный экран."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Настройки"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Обзор."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Пользователь <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Модуль Wi-Fi отключен."</string> @@ -184,6 +185,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Режим полета включен."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Режим \"Не беспокоить\" включен. Будут показаны только важные оповещения."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Включен режим \"Не беспокоить\". Все оповещения отключены."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Не беспокоить – только будильник."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Режим \"Не беспокоить\" выключен."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Режим \"Не беспокоить\" выключен."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Режим \"Не беспокоить\" включен."</string> @@ -234,9 +236,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Коробка со сладостями"</string> <string name="start_dreams" msgid="7219575858348719790">"Заставка"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим полета"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не беспокоить"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Только важные"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Только будильник"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Без оповещений"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -305,8 +307,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Проведите вверх, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Проведите влево, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Никаких оповещений, даже от будильника."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Не беспокоить"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Только важные оповещения"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Только будильник"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Следующий будильник: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Следующий будильник: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Следующий будильник: <xliff:g id="ALARM_TIME">%s</xliff:g>. Звук отключен."</string> @@ -316,9 +323,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Проведите вверх, чтобы разблокировать"</string> <string name="phone_hint" msgid="3101468054914424646">"Чтобы позвонить, пролистните вправо"</string> <string name="camera_hint" msgid="5241441720959174226">"Чтобы включить камеру, пролистните влево"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Не беспокоить"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Важные"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Не беспокоить"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Только важные"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Только будильник"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Все"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Не\nбеспокоить"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Только\nважные"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Только\nбудильник"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Зарядка батареи (осталось <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Сменить пользователя."</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Сменить аккаунт. Вход выполнен под именем <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>."</string> @@ -335,6 +346,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Продолжить сеанс?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Начать заново"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Да, продолжить"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Добавить пользователя?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"После создания профиля его необходимо настроить.\n\nОбновлять приложения для всех аккаунтов может любой пользователь устройства."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Включен режим энергосбережения"</string> @@ -386,4 +403,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Нет"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"Приложение <xliff:g id="APP_NAME">%1$s</xliff:g> назначено регулятором громкости"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Нажмите, чтобы восстановить приложение по умолчанию."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 8bf3a29..1e1d981 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"බැටරි සුරැකීම සක්රිය කරන්න"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"සැකසීම්"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"අහස්යානා ආකාරය"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ස්වයංක්රීයව-භ්රමණය වන තිරය"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"නිශ්ශබ්ද කරන්න"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ස්වයංක්රීය"</string> @@ -168,6 +167,7 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"අගුළු තිරය."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"සැකසීම්"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"දළ විශ්ලේෂණය."</string> + <string name="accessibility_desc_confirm" msgid="3446792278337969766">"තහවුරු කරන්න"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"පරිශීලකයා <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi අක්රියයි."</string> @@ -180,6 +180,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"අහස්යානා ආකාරය සක්රීයයි."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"බාධා නොකරන්න ක්රියාත්මකයි, ප්රමුඛතා පමණි."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"බාධා නොකරන්න ක්රියාත්මකයි, බාධා කිරීම් නැත."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"බාධා නොකරන්න ක්රියාත්මකයි, ප්රමුඛතා පමණි."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"බාධා නොකරන්න ක්රියා විරහිතයි."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"බාධා නොකරන්න ක්රියා විරහිත කරන ලදි."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"බාධා නොකරන්න ක්රියාත්මක කරන ලදි"</string> @@ -230,9 +231,9 @@ <string name="dessert_case" msgid="1295161776223959221">"අතුරුපස අවස්තාව"</string> <string name="start_dreams" msgid="7219575858348719790">"දවල් හීනය"</string> <string name="ethernet_label" msgid="7967563676324087464">"ඊතර නෙට්"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"අහස්යානා ආකාරය"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"බාධා නොකරන්න"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ප්රමුඛතාව පමණයි"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ඇඟවීම් පමණි"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"බාධා කිරීම් නැත"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"බ්ලූටූත්"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"බ්ලූටූත් (උපාංග <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -301,8 +302,11 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා උඩට සර්පණය කරන්න."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා වමට සර්පණය කරන්න."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"අතුරු බිඳීම් නැත. අඩුම තරමේ අනතුරු ඇඟවීමක්වත් නැත."</string> + <string name="zen_priority_introduction" msgid="7253045784560169993">"සීනු, සිහි කැඳවීම්, සිදුවීම් සහ ඔබ සඳහන් කරන අමතන්නන් හැර වෙනත් ශබ්ද සහ කම්පන වලින් ඔබව බාධා නොකරයි."</string> + <string name="zen_priority_customize_button" msgid="7948043278226955063">"අභිරුචිකරණය"</string> <string name="zen_no_interruptions" msgid="7970973750143632592">"අතුරු බිදුම් නැත"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"ප්රමුඛ අතුරු බිඳීම් පමණයි"</string> + <string name="zen_alarms" msgid="5055668280767657759">"ඇඟවීම් පමණි"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"ඔබගේ ඊළඟ සීනුව <xliff:g id="ALARM_TIME">%s</xliff:g> තිබේ"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"ඔබගේ ඊළඟ සීනුව <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g> වේ"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> හි තිබෙන ඔබගේ සීනුව ඔබට ඇසෙන්නේ නැත"</string> @@ -312,9 +316,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"අගුළු ඇරීමට ස්වයිප් කරන්න."</string> <string name="phone_hint" msgid="3101468054914424646">"දුරකථන සඳහා දකුණට ස්වයිප් කරන්න"</string> <string name="camera_hint" msgid="5241441720959174226">"කැමරාව සඳහා දකුණට ස්වයිප් කරන්න"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"කිසිවක් නැත"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"ප්රමුඛතාව"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"බාධා කිරීම් නැත"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"ප්රමුඛතාව පමණයි"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"ඇඟවීම් පමණි"</string> <string name="interruption_level_all" msgid="1330581184930945764">"සියලු"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"බාධා\nනොකරන්න"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"ප්රමුඛතා\nපමණි"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"ඇඟවීම්\nපමණි"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ආරෝපණය වෙමින් (සම්පුර්ණ වන තෙක් <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"පරිශීලක මාරුව"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"පරිශීලකයා මාරු කරන්න,දැන් සිටින පරිශීලකයා <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +339,9 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"ඔබගේ සැසිය දිගටම කරගෙන යෑමට ඔබට අවශ්යද?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"යළි මුල සිට අරඹන්න"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ඔව්, දිගටම කරගෙන යන්න"</string> + <string name="guest_notification_title" msgid="1585278533840603063">"ආගන්තුක පරිශිලකයා"</string> + <string name="guest_notification_text" msgid="7513706222848825467">"යෙදුම් සහ දත්ත ඉවත් කිරීමට ආගන්තුකයා ඉවත් කරන්න"</string> + <string name="guest_notification_remove_action" msgid="8820670703892101990">"ආගන්තුකයා ඉවත් කරන්නද?"</string> <string name="user_add_user_title" msgid="4553596395824132638">"අලුත් පරිශීලකයෙක් එකතු කරන්නද?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"ඔබ අලුත් පරිශීලකයෙක් එකතු කරන විට, එම පුද්ගලයා ඔහුගේ වැඩ කරන ඉඩ සකසා ගත යුතුය.\n\nසියළුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යාවත්කාලීන කළ හැක."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"බැටරිය සුරකින්නා සක්රීයයි"</string> @@ -382,4 +393,5 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ප්රතික්ෂේප කරන්න"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ධාරිතා සංවාදයයි"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"මුල් තත්ත්වය නැවත ප්රතිසාධනය කිරීමට ස්පර්ශ කරන්න."</string> + <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"ඔබ කාර්යාල පැතිකඩේ සිටියි"</string> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index a17b8ec..72e30b5 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -46,7 +46,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Zapnúť šetrič batérie"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavenia"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Režim v lietadle"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Automatické otočenie obrazovky"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"STLMIŤ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -172,6 +171,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Uzamknutá obrazovka"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavenia"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Prehľad"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Používateľ: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Pripojenie Wi-Fi je vypnuté."</string> @@ -184,6 +185,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Režim v lietadle je zapnutý."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Stav Nerušiť je zapnutý, iba prioritné."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Stav Nerušiť je zapnutý, žiadne prerušenia."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Stav Nerušiť je zapnutý, iba budíky."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Stav Nerušiť je vypnutý."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Stav Nerušiť je vypnutý."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Stav Nerušiť je zapnutý."</string> @@ -234,9 +236,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Pult s dezertami"</string> <string name="start_dreams" msgid="7219575858348719790">"Šetrič obrazovky"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Režim v lietadle"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nerušiť"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Iba prioritné"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Iba budíky"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Žiadne prerušenia"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Rozhranie Bluetooth (počet zariadení: <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -305,8 +307,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Prejdite prstom nahor: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Prejdite prstom doľava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Žiadne vyrušenia, ani budíky"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Žiadne vyrušenia"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Iba prioritné vyrušenia"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Iba budíky"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Ďalší budík: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Ďalší budík: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Váš budík o <xliff:g id="ALARM_TIME">%s</xliff:g> sa nespustí"</string> @@ -316,9 +323,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Zariadenie odomknete prejdením prstom nahor"</string> <string name="phone_hint" msgid="3101468054914424646">"Telefón otvoríte prejdením prstom doľava"</string> <string name="camera_hint" msgid="5241441720959174226">"Fotoaparát otvoríte prejdením prstom doľava"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Žiadne"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritné"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Žiadne prerušenia"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Iba prioritné"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Iba budíky"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Všetky"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Žiadne\nprerušenia"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Iba\nprioritné"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Iba\nbudíky"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Nabíja sa (úplné nabitie o <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Prepnutie používateľa"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Prepnúť používateľa (súčasný používateľ: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>)"</string> @@ -335,6 +346,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Chcete v relácii pokračovať?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Začať odznova"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Áno, pokračovať"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Pridať nového používateľa?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor.\n\nAkýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Šetrič batérie je zapnutý"</string> @@ -376,7 +393,7 @@ <string name="screen_pinning_title" msgid="3273740381976175811">"Obrazovka je pripnutá"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Ak ho chcete uvoľniť, stlačte a podržte súčasne tlačidlá Späť a Prehľad."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidla Prehľad."</string> - <string name="screen_pinning_positive" msgid="3783985798366751226">"Rozumiem"</string> + <string name="screen_pinning_positive" msgid="3783985798366751226">"Dobre"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nie, vďaka"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Skryť <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Táto položka sa znova zobrazí, keď ju v nastaveniach opätovne zapnete."</string> @@ -386,4 +403,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Odmietnuť"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je dialóg hlasitosti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Klepnutím obnovíte originál."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 177ef1e..2c8e221 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -46,7 +46,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Vklop varčevanja z energijo"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavitve"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Način za letalo"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Samodejno zasukaj zaslon"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"TIHO"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"SAMOD."</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Zaklenjen zaslon"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavitve"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pregled."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Uporabnik: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi je izklopljen."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Način za letalo je vklopljen."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Način »ne moti« je vklopljen, samo prednostno."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Način »ne moti« je vklopljen, ni prekinitev."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Način »ne moti« je vklopljen, samo alarmi."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Način »ne moti« je izklopljen."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Način »ne moti« je izklopljen."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Način »ne moti« je vklopljen."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrina za sladice"</string> <string name="start_dreams" msgid="7219575858348719790">"Sanjarjenje"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Način za letalo"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne moti"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prednostno"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Brez prekinitev"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (št. naprav: <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Povlecite navzgor za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Povlecite v levo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Brez motenj. Celo brez alarmov."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Brez prekinitev"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Samo prednostne prekinitve"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Samo alarmi"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Vaš naslednji alarm je ob <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Vaš naslednji alarm: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Alarma ob <xliff:g id="ALARM_TIME">%s</xliff:g> ne boste slišali"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Povlecite, da odklenete"</string> <string name="phone_hint" msgid="3101468054914424646">"Povlecite v desno za telefon"</string> <string name="camera_hint" msgid="5241441720959174226">"Povlecite v levo za fotoaparat"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Nič"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prednost"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Brez prekinitev"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Samo prednostno"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Samo alarmi"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Vse"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Brez\nprekinitev"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Samo\nprednostno"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Samo\nalarmi"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Polnjenje (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> do napolnjenosti)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Preklop med uporabniki"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Preklop med uporabniki, trenutni uporabnik <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Želite nadaljevati sejo?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Začni znova"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Da, nadaljuj"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Dodajanje novega uporabnika?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Varčevanje z energijo akumulatorja je vklopljeno"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Zavrni"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> je pogovorno okno glede prostornine"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Dotaknite se, če želite obnoviti izvirnik."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 0262dd7..a51f8ad 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -45,7 +45,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Укључи штедњу батерије"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Подешавања"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим рада у авиону"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Аутоматско ротирање екрана"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"УГАСИ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"АУТОM."</string> @@ -169,6 +168,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Закључани екран."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Подешавања"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Преглед."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Корисник: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi је искључен."</string> @@ -181,6 +182,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Режим рада у авиону је укључен."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Подешавање Не узнемиравај је укључено, само приоритетни прекиди."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Подешавање Не узнемиравај је укључено, без прекида."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Подешавање Не узнемиравај је укључено, само аларми."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Подешавање Не узнемиравај је искључено."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Подешавање Не узнемиравај је искључено."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Подешавање Не узнемиравај је укључено."</string> @@ -231,9 +233,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Витрина са посластицама"</string> <string name="start_dreams" msgid="7219575858348719790">"Сањарење"</string> <string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим рада у авиону"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не узнемиравај"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само приоритетни прекиди"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само аларми"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Без прекида"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> уређаја)"</string> @@ -302,8 +304,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Превуците нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Превуците улево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Нема прекида. Чак ни аларма."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Без прекида"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Само приоритетни прекиди"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Само аларми"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Следећи аларм је у <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Следећи аларм: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Нећете чути аларм у <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -313,9 +320,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Превуците нагоре да бисте откључали"</string> <string name="phone_hint" msgid="3101468054914424646">"Превуците удесно за телефон"</string> <string name="camera_hint" msgid="5241441720959174226">"Превуците улево за камеру"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ниједан"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Приоритет"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Без прекида"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Само приоритетни прекиди"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Само аларми"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Све"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Без\nпрекида"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Само\nприорит. прекиди"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Само\nаларми"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Пуњење (пун је за <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Замени корисника"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Промените корисника, актуелни корисник је <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -332,6 +343,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Желите ли да наставите сесију?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Почни из почетка"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Да, настави"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Додајете новог корисника?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Када додате новог корисника, та особа треба да подеси сопствени простор.\n\nСваки корисник може да ажурира апликације за све остале кориснике."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Штедња батерије је укључена"</string> @@ -383,4 +400,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Одбиј"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> је дијалог за јачину звука"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Додирните да бисте вратили оригинал."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 71d0596..ccf94eb 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Aktivera batterisparläge"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Inställningar"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flygplansläge"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Rotera skärmen automatiskt"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"TYST"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låsskärm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Inställningar"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Översikt."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Användare <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi har inaktiverats."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Flygplansläget har aktiverats."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Stör ej har aktiverats. Endast prioriterade."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Stör ej har aktiverats. Inga avbrott."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Stör ej är aktiverat, endast alarm."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Stör ej av."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Stör ej har inaktiverats."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Stör ej har aktiverats."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertdisken"</string> <string name="start_dreams" msgid="7219575858348719790">"Dagdröm"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flygplansläge"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Stör ej"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Endast prioriterade"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Endast alarm"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Inga avbrott"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> enheter)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Dra uppåt för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="description_direction_left" msgid="7207478719805562165">"Dra åt vänster för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Inga avbrott. Inte ens alarm."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Inga avbrott"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Bara prioriterade samtal och aviseringar"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Endast alarm"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Nästa alarm är kl. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Nästa alarm är <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Alarmet kommer inte att höras kl. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Dra uppåt om du vill låsa upp"</string> <string name="phone_hint" msgid="3101468054914424646">"Dra åt höger om du vill visa telefonen"</string> <string name="camera_hint" msgid="5241441720959174226">"Dra åt vänster om du vill visa kameran"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Ingen"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prioritet"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Inga avbrott"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Bara prioriterade"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Endast alarm"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Alla"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Stör\nej"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Endast\nprioriterade"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Endast\nalarm"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Laddar (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> tills batteriet är fulladdat)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Byt användare"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Byt användare. Aktuell användare: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Vill du fortsätta sessionen?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Börja om"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ja, fortsätt"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Lägga till ny användare?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme.\n\nAlla användare kan uppdatera appar för samtliga användares räkning."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparläget har aktiverats"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Neka"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> används som volymkontroll"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Tryck här om du vill återställa den ursprungliga appen."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 1811864..c01d0ac 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Washa kiokoa betri"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Mipangilio"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Mtandao-Hewa"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Hali ya Ndege"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Skrini ijizungushe kiotomatiki"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"PUUZA"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"KIOTOMATIKI"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Skrini iliyofungwa."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Mipangilio"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Muhtasari."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Mtumiaji <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi imezimwa."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Hali ya ndegeni imewashwa."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Kipengee cha usinisumbue kimewashwa, kipaumbele pekee."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Kipengee cha usinisumbue kimewashwa, hakuna kukatizwa."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Kipengee cha usinisumbue kimewashwa, kengele pekee."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Kipengee cha usinisumbue kimezimwa."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Kipengee cha usinisumbue kimezimwa."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Kipengee cha usinisumbue kimewashwa."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Sanduku la Vitindamlo"</string> <string name="start_dreams" msgid="7219575858348719790">"Hali Tulivu"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Hali ya ndege"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Usinisumbue"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Kipaumbele tu"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Kengele pekee"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Hakuna kukatizwa"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (Vifaa <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Sogeza juu kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="description_direction_left" msgid="7207478719805562165">"Sogeza kushoto kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Hakuna kukatizwa. Hata kama ni kengele."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Hakuna kukatizwa"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Mambo yenye kipaumbele pekee yakatize"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Kengele pekee"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Kengele yako inayofuata itakuwa saa <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Kengele yako inayofuata itakuwa <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Hutasikia kengele yako ifikapo <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Telezesha kidole ili ufungue"</string> <string name="phone_hint" msgid="3101468054914424646">"Telezesha kidole kulia ili ufikie simu"</string> <string name="camera_hint" msgid="5241441720959174226">"Telezesha kidole kushoto ili ufikie kamera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Hamna"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Kipaumbele"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Hakuna kukatizwa"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Kipaumbele tu"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Kengele pekee"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Zote"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Hakuna\nukatizaji"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Kipaumbele\npekee"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Kengele\npekee"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Inachaji (Imebakisha <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ijae)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Badili mtumiaji"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Badili mtumiaji, mtumiaji wa sasa <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Je, unataka kuendelea na kipindi chako?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Anza tena"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ndiyo, endelea"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Ungependa kuongeza mtumiaji?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Unapomwongeza mtumiaji mpya, mtu huyo anahitaji kusanidi nafasi yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa ajili ya watumiaji wengine wote."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Kiokoa betri kimewashwa"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Kataa"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ni mazungumzo ya sauti"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Gusa ili urejeshe ya awali."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sw600dp/styles.xml b/packages/SystemUI/res/values-sw600dp/styles.xml index 156fa65..4d7d6b5 100644 --- a/packages/SystemUI/res/values-sw600dp/styles.xml +++ b/packages/SystemUI/res/values-sw600dp/styles.xml @@ -19,12 +19,6 @@ <item name="android:layout_width">480dp</item> </style> - <style name="SearchPanelScrim"> - <item name="android:layout_width">match_parent</item> - <item name="android:layout_height">@dimen/search_panel_scrim_height</item> - <item name="android:layout_gravity">bottom</item> - </style> - <style name="UserDetailView"> <item name="numColumns">4</item> </style> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 1c246c5..2632a81 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"பேட்டரி சேமிப்பானை இயக்கு"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"அமைப்பு"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"வைஃபை"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"விமானப் பயன்முறை"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"திரையைத் தானாகச் சுழற்று"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"முடக்கு"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"தானியங்கு"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"பூட்டுத் திரை."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"அமைப்பு"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"மேலோட்டப் பார்வை."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"பயனர் <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"வைஃபை முடக்கப்பட்டது."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"விமானப் பயன்முறை இயக்கப்பட்டது."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"தொந்தரவு செய்ய வேண்டாம் என்பது இயக்கப்பட்டது, முதன்மை மட்டும்."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"தொந்தரவு செய்ய வேண்டாம் என்பது இயக்கப்பட்டது, குறுக்கீடுகள் இல்லை."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"தொந்தரவு செய்ய வேண்டாம் என்பது இயக்கப்பட்டது, அலாரங்கள் மட்டும்."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"தொந்தரவு செய்ய வேண்டாம் என்பது முடக்கப்பட்டது."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"தொந்தரவு செய்ய வேண்டாம் என்பது முடக்கப்பட்டது."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"தொந்தரவு செய்ய வேண்டாம் என்பது இயக்கப்பட்டது."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"இனிப்பு வடிவங்கள்"</string> <string name="start_dreams" msgid="7219575858348719790">"பகல்கனா"</string> <string name="ethernet_label" msgid="7967563676324087464">"ஈதர்நெட்"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"விமானப் பயன்முறை"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"தொந்தரவு செய்ய வேண்டாம்"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"முதன்மை மட்டும்"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"அலாரங்கள் மட்டும்"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"குறுக்கீடுகள் வேண்டாம்"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"புளூடூத்"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"புளூடூத் (<xliff:g id="NUMBER">%d</xliff:g> சாதனங்கள்)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு மேலாக இழுக்கவும்."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு இடதுபக்கமாக இழுக்கவும்."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"அறிவிப்பும் இல்லை. அலாரங்களும் இல்லை."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"தெரிவிக்காதே"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"முக்கிய அறிவிப்புகள் மட்டும்"</string> + <string name="zen_alarms" msgid="5055668280767657759">"அலாரங்கள் மட்டும்"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"அடுத்த அலாரம் - <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"அடுத்த அலாரம் - <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> க்கு அலாரத்தைக் கேட்க மாட்டீர்கள்"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"திறக்க, மேலே ஸ்வைப் செய்யவும்"</string> <string name="phone_hint" msgid="3101468054914424646">"ஃபோனுக்கு, வலப்புறம் ஸ்வைப் செய்க"</string> <string name="camera_hint" msgid="5241441720959174226">"கேமராவிற்கு இடப்புறம் ஸ்வைப் செய்க"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"ஏதுமில்லை"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"முன்னுரிமை"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"குறுக்கீடுகள் வேண்டாம்"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"முன்னுரிமை மட்டும்"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"அலாரங்கள் மட்டும்"</string> <string name="interruption_level_all" msgid="1330581184930945764">"எல்லாம்"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"குறுக்கீடுகள்\nவேண்டாம்"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"முன்னுரிமைகள்\nமட்டும்"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"அலாரங்கள்\nமட்டும்"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"சார்ஜாகிறது (முழு சார்ஜிற்கு <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ஆகும்)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"பயனரை மாற்று"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"பயனரை மாற்று, தற்போதைய பயனர் <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"உங்கள் அமர்வைத் தொடர விருப்பமா?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"மீண்டும் தொடங்கு"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"தொடரவும்"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"புதியவரைச் சேர்க்கவா?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்.\n\nஎந்தவொரு பயனரும், மற்ற எல்லா பயனர்களுக்காகவும் பயன்பாடுகளைப் புதுப்பிக்கலாம்."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"பேட்டரி சேமிப்பான் இயக்கத்தில் உள்ளது"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"நிராகரி"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"ஒலியளவு செய்தி: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"அசலை மீட்டமைக்கத் தொடவும்."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index cc5d2ad..8fe687e 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"బ్యాటరీ సేవర్ను ఆన్ చేయి"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"సెట్టింగ్లు"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ఎయిర్ప్లేన్ మోడ్"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"స్క్రీన్ను స్వయంచాలకంగా తిప్పండి"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"మ్యూట్"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"స్వయంచాలకం"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"లాక్ స్క్రీన్."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"సెట్టింగ్లు"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"అవలోకనం."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"వినియోగదారు <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"వైఫై ఆఫ్ చేయబడింది."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ఎయిర్ప్లైన్ మోడ్ ఆన్ చేయబడింది."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"అంతరాయం కలిగించవద్దు ఆన్లో ఉంది, ప్రాధాన్యత మాత్రమే."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"అంతరాయం కలిగించవద్దు ఆన్లో ఉంది, అంతరాయాలు ఉండవు."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"అంతరాయం కలిగించవద్దు ఆన్లో ఉంది, అలారాలు మాత్రమే."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"అంతరాయం కలిగించవద్దు ఆఫ్లో ఉంది."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"అంతరాయం కలిగించవద్దు ఆఫ్ చేయబడింది."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"అంతరాయం కలిగించవద్దు ఆన్ చేయబడింది."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"డెజర్ట్ కేస్"</string> <string name="start_dreams" msgid="7219575858348719790">"డేడ్రీమ్"</string> <string name="ethernet_label" msgid="7967563676324087464">"ఈథర్నెట్"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ఎయిర్ప్లేన్ మోడ్"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"అంతరాయం కలిగించవద్దు"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ప్రాధాన్యత మాత్రమే"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"అలారాలు మాత్రమే"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"అంతరాయాలు ఉండవు"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"బ్లూటూత్"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"బ్లూటూత్ (<xliff:g id="NUMBER">%d</xliff:g> పరికరాలు)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం పైకి స్లైడ్ చేయండి."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం ఎడమవైపుకు స్లైడ్ చేయండి."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"అంతరాయాలు లేవు. అలారాలు కూడా లేవు."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"అంతరాయాలు లేకుండా"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"ప్రాధాన్య అంతరాయాలు మాత్రమే"</string> + <string name="zen_alarms" msgid="5055668280767657759">"అలారాలు మాత్రమే"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"మీ తదుపరి అలారం <xliff:g id="ALARM_TIME">%s</xliff:g>కి ఉంది"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"మీ తదుపరి అలారం <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"మీరు <xliff:g id="ALARM_TIME">%s</xliff:g>కి సెట్ చేసిన అలారం మీకు వినిపించదు"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"అన్లాక్ చేయడానికి ఎగువకు స్వైప్ చేయండి"</string> <string name="phone_hint" msgid="3101468054914424646">"ఫోన్ కోసం కుడివైపుకి స్వైప్ చేయండి"</string> <string name="camera_hint" msgid="5241441720959174226">"కెమెరా కోసం ఎడమవైపుకి స్వైప్ చేయండి"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"వేటికీ వద్దు"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"ప్రాధాన్యత"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"అంతరాయాలు ఉండవు"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"ప్రాధాన్యత మాత్రమే"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"అలారాలు మాత్రమే"</string> <string name="interruption_level_all" msgid="1330581184930945764">"అన్నిటికీ"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"అంతరాయాలు\nఉండకూడదు"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"ప్రాధాన్యమైనవి\nమాత్రమే"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"అలారాలు\nమాత్రమే"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ఛార్జ్ అవుతోంది (పూర్తిగా నిండటానికి <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"వినియోగదారుని మార్చు"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"వినియోగదారుని మార్చు, ప్రస్తుత వినియోగదారు <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"మీరు మీ సెషన్ని కొనసాగించాలనుకుంటున్నారా?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"మొదటి నుండి ప్రారంభించు"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"అవును, కొనసాగించు"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"కొత్త వినియోగదారుని జోడించాలా?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"మీరు కొత్త వినియోగదారుని జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం అనువర్తనాలను నవీకరించగలరు."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"బ్యాటర్ సేవర్ ఆన్ చేయబడింది"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"తిరస్కరించు"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> అనేది వాల్యూమ్ డైలాగ్"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"అసలుదాన్ని పునరుద్ధరించడానికి తాకండి."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 1c064e5..48b0a38 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"เปิดโหมดประหยัดแบตเตอรี่"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"การตั้งค่า"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WiFi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"โหมดใช้งานบนเครื่องบิน"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"หมุนหน้าจออัตโนมัติ"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ปิดเสียง"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"อัตโนมัติ"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ล็อกหน้าจอ"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"การตั้งค่า"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ภาพรวม"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ผู้ใช้ <xliff:g id="USER">%s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ปิด Wi-Fi แล้ว"</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"เปิดโหมดบนเครื่องบินแล้ว"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"การห้ามรบกวนเปิดอยู่ เฉพาะเรื่องสำคัญเท่านั้น"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"การห้ามรบกวนเปิดอยู่ ห้ามรบกวน"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"เปิดการห้ามรบกวนอยู่ ปลุกได้เท่านั้น"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"การห้ามรบกวนปิดอยู่"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"ปิดการห้ามรบกวนแล้ว"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"เปิดการห้ามรบกวนแล้ว"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"ชั้นแสดงของหวาน"</string> <string name="start_dreams" msgid="7219575858348719790">"เดย์ดรีม"</string> <string name="ethernet_label" msgid="7967563676324087464">"อีเทอร์เน็ต"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"โหมดใช้บนเครื่องบิน"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ห้ามรบกวน"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"เฉพาะเรื่องสำคัญ"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"เฉพาะปลุกเท่านั้น"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"ไม่มีการรบกวน"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"บลูทูธ"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"บลูทูธ (<xliff:g id="NUMBER">%d</xliff:g> อุปกรณ์)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"เลื่อนขึ้นเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string> <string name="description_direction_left" msgid="7207478719805562165">"เลื่อนไปทางซ้ายเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ไม่มีการรบกวน แม้แต่นาฬิกาปลุก"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"ไม่มีการรบกวน"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"เฉพาะเรื่องสำคัญเท่านั้น"</string> + <string name="zen_alarms" msgid="5055668280767657759">"เฉพาะปลุกเท่านั้น"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"การปลุกครั้งถัดไปของคุณคือเวลา <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"การปลุกครั้งถัดไปของคุณคือ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"คุณจะไม่ได้ยินเสียงปลุกในเวลา <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"กวาดขึ้นเพื่อปลดล็อก"</string> <string name="phone_hint" msgid="3101468054914424646">"กวาดไปทางขวาเพื่อใช้โทรศัพท์"</string> <string name="camera_hint" msgid="5241441720959174226">"กวาดไปทางซ้ายเพื่อใช้กล้องถ่ายรูป"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"ไม่มี"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"สำคัญ"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"ไม่มีการรบกวน"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"เฉพาะเรื่องสำคัญ"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"เฉพาะปลุกเท่านั้น"</string> <string name="interruption_level_all" msgid="1330581184930945764">"ทั้งหมด"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"ไม่มี\nการรบกวน"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"เฉพาะเรื่อง\nสำคัญ"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"เฉพาะปลุก\nเท่านั้น"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"กำลังชาร์จ (อีก <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> เต็ม)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"สลับผู้ใช้"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"เปลี่ยนผู้ใช้จากผู้ใช้ปัจจุบัน <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"คุณต้องการอยู่ในเซสชันต่อไปไหม"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"เริ่มต้นใหม่"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ใช่ ดำเนินการต่อ"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"ต้องการเพิ่มผู้ใช้ใหม่ใช่ไหม"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง\n\nผู้ใช้ทุกคนสามารถอัปเดตแอปสำหรับผู้ใช้รายอื่นทุกคนได้"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"เปิดโหมดประหยัดแบตเตอรี่อยู่"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"ปฏิเสธ"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> เป็นช่องโต้ตอบระดับเสียง"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"แตะเพื่อคืนค่าดั้งเดิม"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 6ecd402..9c5daa8 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"I-on ang pagtitipid ng baterya"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Mga Setting"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Airplane mode"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"I-auto-rotate ang screen"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Mga Setting"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User na si <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Na-off ang wifi."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Na-on ang Airplane mode."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Naka-on ang huwag istorbohin, priyoridad lang."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Naka-on ang huwag istorbohin, walang mga paggambala."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Naka-on ang huwag istorbohin, mga alarm lang."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Naka-off ang huwag istorbohin."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Na-off na ang huwag istorbohin"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Na-on na ang huwag istorbohin."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Airplane mode"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Huwag istorbohin"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priyoridad lang"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Mga alarm lang"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Walang mga paggambala"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> (na) Device)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Mag-slide pataas para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Mag-slide pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Walang mga pagkaantala. Kahit mga alarma."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Walang mga paggambala"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Mga may priyoridad na paggambala lang"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Mga alarm lang"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Ang susunod mong alarma ay sa <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Ang susunod mong alarma ay <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Hindi mo maririnig ang alarma mo ng <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Mag-swipe pataas upang i-unlock"</string> <string name="phone_hint" msgid="3101468054914424646">"Mag-swipe pakanan para sa telepono"</string> <string name="camera_hint" msgid="5241441720959174226">"Mag-swipe pakaliwa para sa camera"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Wala"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Prayoridad"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Walang pagkaantala"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Priyoridad lang"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Mga alarm lang"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Lahat"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Walang\npagkaantala"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priyoridad\nlang"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Mga alarm\nlang"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Nagtsa-charge (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> hanggang mapuno)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Magpalit ng user"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Magpalit ng user, kasalukuyang user <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Gusto mo bang ipagpatuloy ang iyong session?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Magsimulang muli"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Oo, magpatuloy"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Magdagdag ng bagong user?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo.\n\nAng sinumang user ay maaaring mag-update ng mga app para sa lahat ng iba pang user."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Naka-on ang tagatipid ng baterya"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Tanggihan"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"Ang <xliff:g id="APP_NAME">%1$s</xliff:g> ang volume dialog"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Pindutin upang ibalik ang orihinal."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 7209af0..7c44bf1 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Pil tasarrufunu aç"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ayarlar"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Kablosuz"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Uçak modu"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ekranı otomatik döndür"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"KAPAT"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"OTOMTK"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kilit ekranı"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ayarlar"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Genel Bakış."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kullanıcı: <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Kablosuz kapatıldı."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Uçak modu açıldı."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Rahatsız etmeyin ayarı açık, yalnızca öncelikliler."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Rahatsız etmeyin ayarı açık, kesme yok."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Rahatsız etmeyin ayarı açık, yalnızca alarmlar."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Rahatsız etmeyin\" ayarı kapalı."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Rahatsız etmeyin\" ayarı kapalı."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"Rahatsız etmeyin\" ayarı açık."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Tatlı Kutusu"</string> <string name="start_dreams" msgid="7219575858348719790">"Hafif uyku"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Uçak modu"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Rahatsız etmeyin"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Yalnızca öncelikliler"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Yalnızca alarmlar"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Kesme yok"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Cihaz)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için yukarı kaydırın."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sola kaydırın."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Kesinti yok. Uyarı bile yok."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Kesinti yok"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Sadece öncelikli kesintiler"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Yalnızca alarmlar"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Bir sonraki alarmın saati: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Bir sonraki alarmınız: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> olarak ayarlanan alarmı duymayacaksınız"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Kilidi açmak için hızlıca yukarı kaydırın"</string> <string name="phone_hint" msgid="3101468054914424646">"Telefon için sağa kaydırın"</string> <string name="camera_hint" msgid="5241441720959174226">"Kamera için sola kaydırın"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Yok"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Öncelik"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Kesinti yok"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Yalnızca öncelikli"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Yalnızca alarmlar"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Tümü"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Kesinti\nyok"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Yalnızca\nöncelik"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Yalnızca\nalarmlar"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Şarj oluyor (tamamen dolmasına <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> kaldı)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Kullanıcı değiştirme"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Kullanıcı değiştir. Geçerli kullanıcı: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Oturumunuza devam etmek istiyor musunuz?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Baştan başla"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Evet, devam et"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Yeni kullanıcı eklensin mi?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Yeni bir kullanıcı eklediğinizde, bu kişinin kendi alanını ayarlaması gerekir.\n\nHerhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Pil tasarrufu açık"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Reddet"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ses denetimi iletişim kutusu olarak ayarlandı"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Orijinali geri yüklemek için dokunun."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 8c582f8..76ed716 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -46,7 +46,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Увімкнути режим заощадження заряду акумулятора"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Налаштування"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим польоту"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Повертати екран автоматично"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ІГНОР."</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"АВТОМ."</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заблокований екран."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Налаштування"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Огляд."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Користувач <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi вимкнено."</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Режим польоту ввімкнено."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Режим \"Не турбувати\" ввімкнено, лише пріоритетні."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Режим \"Не турбувати\" ввімкнено, без сповіщень."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Увімкнено режим \"Не турбувати\", дозволено лише сигнали."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Режим \"Не турбувати\" вимкнено."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Режим \"Не турбувати\" вимкнено."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Режим \"Не турбувати\" ввімкнено."</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Вітрина десертів"</string> <string name="start_dreams" msgid="7219575858348719790">"Заставка"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим польоту"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не турбувати"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Лише пріоритетні"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Лише сигнали"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Без сповіщень"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (пристроїв: <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Проведіть пальцем угору, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Проведіть пальцем ліворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Без сповіщень і сигналів будильника."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Без сповіщень"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Лише пріоритетні сповіщення"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Лише сигнали"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Наступний сигнал: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Наступний сигнал: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Сигнал не лунатиме о <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Проведіть пальцем угору, щоб розблокувати"</string> <string name="phone_hint" msgid="3101468054914424646">"Проведіть пальцем праворуч, щоб скористатися телефоном"</string> <string name="camera_hint" msgid="5241441720959174226">"Проведіть пальцем ліворуч, щоб скористатися камерою"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Немає"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Пріоритетні"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Без сповіщень"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Лише пріоритетні"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Лише сигнали"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Усі"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Без\nсповіщень"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Лише\nприорітетні"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Лише\nсигнали"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Заряджання (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> до повного зарядження)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Змінити користувача"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Змінити користувача, поточний користувач – <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Продовжити сеанс?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Почати знову"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Так, продовжити"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Додати нового користувача?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Користувач має налаштувати свій профіль після створення.\n\nБудь-який користувач пристрою може оновлювати додатки для решти користувачів."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Режим заощадження заряду акумулятора ввімкнено"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Відхилити"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> призначено регулятором гучності"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Торкніться, щоб відновити оригінал."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index f402071..608c6d3 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"بیٹری کی بچت آن کریں"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ترتیبات"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ہوائی جہاز وضع"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"سکرین کو خودکار طور پر گھمائیں"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"خاموش کریں"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"خودکار"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"مقفل اسکرین۔"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"ترتیبات"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"مجموعی جائزہ۔"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"صارف <xliff:g id="USER">%s</xliff:g>۔"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>۔"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi کو آف کر دیا گیا۔"</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ہوائی جہاز وضع کو آن کر دیا گیا۔"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"ڈسٹرب نہ کریں آن ہے، صرف ترجیحی۔"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"ڈسٹرب نہ کریں آن ہے، کوئی مداخلتیں نہیں۔"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"ڈسٹرب نہ کریں آن ہے، صرف الارمز۔"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"ڈسٹرب نہ کریں آف ہے۔"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"ڈسٹرب نہ کریں کو آف کر دیا گیا۔"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"ڈسٹرب نہ کریں کو آن کر دیا گیا۔"</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"ڈیزرٹ کیس"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"ایتھرنیٹ"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ہوائی جہاز طرز"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ڈسٹرب نہ کریں"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"صرف ترجیحی"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"صرف الارمز"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"کوئی مداخلتیں نہیں"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"بلوٹوتھ"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"بلوٹوتھ (<xliff:g id="NUMBER">%d</xliff:g> آلات)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے اوپر سلائیڈ کریں۔"</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے بائیں سلائیڈ کریں۔"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"کوئی مداخلتیں نہیں ہیں۔ یہاں تک کہ الارمز بھی نہیں ہیں۔"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"کوئی مداخلتیں نہیں ہیں"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"صرف ترجیحی مداخلتیں"</string> + <string name="zen_alarms" msgid="5055668280767657759">"صرف الارمز"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"آپ کا اگلا الارم <xliff:g id="ALARM_TIME">%s</xliff:g> بجے ہے"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"آپ کا اگلا الارم <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g> ہے"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"آپ کو <xliff:g id="ALARM_TIME">%s</xliff:g> بجے اپنا الارم سنائی نہیں دیگا"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"غیر مقفل کرنے کیلئے اوپر سوائپ کریں"</string> <string name="phone_hint" msgid="3101468054914424646">"فون کیلئے دائیں سوائپ کریں"</string> <string name="camera_hint" msgid="5241441720959174226">"کیمرہ کیلئے بائیں سوائپ کریں"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"کوئی نہیں"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"ترجیح"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"کوئی مداخلتیں نہیں"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"صرف ترجیحی"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"صرف الارمز"</string> <string name="interruption_level_all" msgid="1330581184930945764">"سبھی"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"کوئی مداخلتیں\nنہیں"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"صرف\nترجیحی"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"صرف\nالارمز"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"چارج ہو رہا ہے (مکمل ہونے تک <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> باقی ہیں)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"صارف سوئچ کریں"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"صارف سوئچ کریں، موجودہ صارف <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"کیا آپ اپنا سیشن جاری رکھنا چاہتے ہیں؟"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"دوبارہ شروع کریں"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ہاں، جاری رکھیں"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"نیا صارف شامل کریں؟"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔\n\nکوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"بیٹری سیور آن ہے"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"مسترد کریں"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> والیوم ڈائلاگ ہے"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"اصل کو بحال کرنے کیلئے ٹچ کریں۔"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 782d5e1..63af257 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Quvvat tejash funksiyasini yoqing"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Sozlamalar"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Parvoz rejimi"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ekranni avtomatik burish"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Qulflash ekrani."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Sozlamalar"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Umumiy nazar."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Foydalanuvchi <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi o‘chirildi."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Parvoz rejimi yoqildi."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"“Bezovta qilinmasin” funksiyasi yoqilgan, faqat muhim bildirishnomalar ko‘rsatiladi."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"“Bezovta qilinmasin” funksiyasi yoqilgan, bezovta qilinmaydi."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Bezovta qilinmasin, faqat signallar"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"“Bezovta qilinmasin” funksiyasi o‘chirilgan."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"“Bezovta qilinmasin” funksiyasi o‘chirildi."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"“Bezovta qilinmasin” funksiyasi yoqildi."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Tush kurish"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Parvoz rejimi"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Bezovta qilinmasin"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Faqat muhimlari"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Faqat signallar"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Tanaffuslarsiz"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g>ta qurilma)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun yuqoriga suring."</string> <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun chapga suring."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Hech narsa bezovta qilmaydi, hatto uyg‘otkichlar ham."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Tanaffuslarsiz"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Faqat ustuvor tanaffuslar"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Faqat signallar"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Keyingi uyg‘otkich: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Keyingi uyg‘otkich: <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Keyingi uyg‘otkich: <xliff:g id="ALARM_TIME">%s</xliff:g>. Ovoz eshitilmaydi."</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Qulfdan chiqarish uchun yuqoriga suring"</string> <string name="phone_hint" msgid="3101468054914424646">"Telefonni ochish uchun o‘ngga"</string> <string name="camera_hint" msgid="5241441720959174226">"Kamerani ochish uchun chapga suring"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Hech biri"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Ustuvorlik"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Bezovta qilinishlarsiz"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Faqat muhimlari"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Faqat signallar"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Barchasi"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Uzilishlar\nbo‘lmasin"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Faqat\nmuhimlar"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Faqat\nsignallar"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Quvvat olmoqda (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>da to‘ladi)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Foydalanuvchini almashtirish"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Foydalanuvchini o‘zgartirish. Joriy foydalanuvchi – <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Seansni davom ettirmoqchimisiz?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Boshidan boshlansin"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Ha, davom ettirilsin"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Yangi foyd-chi qo‘shilsinmi?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Yangi foydalanuvchi qo‘shilgach, o‘sha shaxs o‘z hududini sozlashi lozim bo‘ladi.\n\nHar qanday foydalanuvchi ilovalarni barcha foydalanuvchilar uchun yangilashi mumkin."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Quvvat tejash yoqilgan"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Rad etish"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ovoz balandligini boshqaradi"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Aslini tiklash uchun bosing."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 7343c6f..a434168 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Bật trình tiết kiệm pin"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Cài đặt"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Chế độ trên máy bay"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Tự động xoay màn hình"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"TẮT TIẾNG"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"TỰ ĐỘNG"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Màn hình khóa."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Cài đặt"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Tổng quan."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Người dùng <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Đã tắt Wifi."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Đã bật chế độ trên máy bay."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Bật tính năng không làm phiền, chỉ ưu tiên."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Bật tính năng không làm phiền, không có gián đoạn."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Bật tính năng không làm phiền, chỉ báo thức."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Tắt tính năng không làm phiền."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Đã tắt tính năng không làm phiền."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Đã bật tính năng không làm phiền."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Tủ trưng bày bánh ngọt"</string> <string name="start_dreams" msgid="7219575858348719790">"Chế độ ngủ"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Chế độ trên máy bay"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Không làm phiền"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Chỉ ưu tiên"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Chỉ báo thức"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Không có gián đoạn nào"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> thiết bị)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Trượt lên để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Trượt sang trái để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Không có gián đoạn. Thậm chí không có cảnh báo."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Không có gián đoạn nào"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Chỉ các gián đoạn ưu tiên"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Chỉ báo thức"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"Lần báo thức tiếp theo của bạn vào lúc <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Lần báo thức tiếp theo của bạn là <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Bạn sẽ không nghe thấy báo thức lúc <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Vuốt lên để mở khóa"</string> <string name="phone_hint" msgid="3101468054914424646">"Vuốt sang phải để mở điện thoại"</string> <string name="camera_hint" msgid="5241441720959174226">"Vuốt sang trái để mở máy ảnh"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Không có"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Ưu tiên"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Không có gián đoạn nào"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Chỉ ưu tiên"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Chỉ báo thức"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Tất cả"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Không có\ngián đoạn"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Chỉ\nưu tiên"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Chỉ\nbáo thức"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Đang sạc (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> cho đến khi đầy)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Chuyển đổi người dùng"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Chuyển người dùng, người dùng hiện tại <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Bạn có muốn tiếp tục phiên của mình không?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Bắt đầu lại"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Có, tiếp tục"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Thêm người dùng mới?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Khi bạn thêm người dùng mới, người dùng đó cần thiết lập dung lượng lưu trữ của mình.\n\nMọi người dùng đều có thể cập nhật ứng dụng cho tất cả người dùng khác."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Trình tiết kiệm pin đang bật"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Từ chối"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> là hộp thoại khối lượng"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Chạm để khôi phục bản gốc."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index ca2cfef..4e3c265 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"开启节电助手"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"设置"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WLAN"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"飞行模式"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"自动旋转屏幕"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"静音"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"自动"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"锁定屏幕。"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"设置"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"概览。"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"用户:<xliff:g id="USER">%s</xliff:g>。"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WLAN已关闭。"</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"飞行模式已开启。"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"勿扰模式已开启,仅限优先打扰。"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"勿扰模式已开启,禁止打扰。"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"勿扰模式已开启,仅限闹钟。"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"勿扰模式关闭。"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"已关闭勿扰模式。"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"已开启勿扰模式。"</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"甜品盒"</string> <string name="start_dreams" msgid="7219575858348719790">"互动屏保"</string> <string name="ethernet_label" msgid="7967563676324087464">"有线网络"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飞行模式"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"勿扰"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"仅限优先打扰"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"仅限闹钟"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"禁止打扰"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"蓝牙"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"蓝牙(<xliff:g id="NUMBER">%d</xliff:g> 台设备)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"向上滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="description_direction_left" msgid="7207478719805562165">"向左滑动以<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"零打扰(甚至不发出闹钟提醒)。"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"禁止打扰"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"仅限优先打扰内容"</string> + <string name="zen_alarms" msgid="5055668280767657759">"仅限闹钟"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"下次闹钟响铃时间:<xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"下次闹钟响铃时间:<xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"您在<xliff:g id="ALARM_TIME">%s</xliff:g>将不会听到闹钟响铃"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"向上滑动即可解锁"</string> <string name="phone_hint" msgid="3101468054914424646">"向右滑动可打开拨号界面"</string> <string name="camera_hint" msgid="5241441720959174226">"向左滑动可打开相机"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"无"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"优先"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"勿扰"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"仅限优先打扰"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"仅限闹钟"</string> <string name="interruption_level_all" msgid="1330581184930945764">"全部"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"禁止\n打扰"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"仅限\n优先打扰"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"仅限\n闹钟"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"正在充电(还需<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>充满)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"切换用户"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"切换用户,当前用户为<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"要继续您的会话吗?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"重新开始"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"是,继续"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"要添加新用户吗?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"当您添加新用户时,该用户必须设置自己的空间。\n\n任何用户均可为其他所有用户更新应用。"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"节电助手已开启"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒绝"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”已用作音量控制对话框"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"触摸即可恢复原始设置。"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 04a841d..d6be63f 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"開啟省電模式"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"設定"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"飛行模式"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"自動旋轉螢幕"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"關閉"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"自動"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"上鎖畫面。"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"概覽"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"使用者:<xliff:g id="USER">%s</xliff:g>。"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi 已關閉。"</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"飛行模式已開啟。"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"開啟「請勿騷擾」,僅限優先。"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"開啟「請勿騷擾」,不允許干擾。"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"開啟「請勿騷擾」,僅限鬧鐘。"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"「請勿騷擾」關閉"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"已關閉「請勿騷擾」。"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"已開啟「請勿騷擾」。"</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"Daydream"</string> <string name="ethernet_label" msgid="7967563676324087464">"以太網"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飛行模式"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"請勿騷擾"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"僅限優先"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅限鬧鐘"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"不允許干擾"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"藍牙"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"藍牙 (<xliff:g id="NUMBER">%d</xliff:g> 部裝置)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"不干擾 (即使鬧鐘也不例外)。"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"不允許干擾"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"只限重要干擾"</string> + <string name="zen_alarms" msgid="5055668280767657759">"僅限鬧鐘"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"下次鬧鐘時間:<xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"下次鬧鐘時間:<xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"您不會聽到<xliff:g id="ALARM_TIME">%s</xliff:g> 的鬧鐘"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"向上快速滑動即可解鎖"</string> <string name="phone_hint" msgid="3101468054914424646">"向右快速滑動即可使用手機功能"</string> <string name="camera_hint" msgid="5241441720959174226">"向左快速滑動即可使用相機功能"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"無"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"重要"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"不允許干擾"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"僅限優先"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"僅限鬧鐘"</string> <string name="interruption_level_all" msgid="1330581184930945764">"全部"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"不允許\n干擾"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"僅限\n優先"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"僅限\n鬧鐘"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"充電中 (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>後完成充電)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"切換使用者"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"切換使用者,目前使用者是<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"您要繼續您的工作階段嗎?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"重新開始"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"是的,請繼續"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者均可為所有其他使用者更新應用程式。"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"省電模式已開啟"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒絕"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」為音量對話框"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"輕觸即可復原。"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 98ae37c..ddab028 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"開啟節約耗電量模式"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"設定"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"飛行模式"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"自動旋轉螢幕"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"關閉"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"自動"</string> @@ -170,6 +169,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"螢幕鎖定。"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"總覽。"</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"使用者:<xliff:g id="USER">%s</xliff:g>。"</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi 已關閉。"</string> @@ -182,6 +183,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"飛航模式已開啟。"</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"「零打擾」設定為開啟,只會顯示優先通知。"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"「零打擾」設定為開啟,不接受任何干擾。"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"「零打擾」設定為開啟,只會顯示鬧鐘。"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"「零打擾」設定為關閉。"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"已停用「零打擾」設定。"</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"已啟用「零打擾」設定。"</string> @@ -232,9 +234,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="7219575858348719790">"休眠模式"</string> <string name="ethernet_label" msgid="7967563676324087464">"乙太網路"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飛航模式"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"零打擾"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"僅顯示優先通知"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅允許鬧鐘"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"無干擾"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"藍牙"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"藍牙 (<xliff:g id="NUMBER">%d</xliff:g> 個裝置)"</string> @@ -303,8 +305,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="description_direction_left" msgid="7207478719805562165">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"不干擾 (即使鬧鐘也不例外)。"</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"不允許干擾"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"僅限優先干擾"</string> + <string name="zen_alarms" msgid="5055668280767657759">"僅允許鬧鐘"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"下次鬧鐘時間:<xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"下次鬧鐘時間:<xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"您不會聽到<xliff:g id="ALARM_TIME">%s</xliff:g> 的鬧鐘"</string> @@ -314,9 +321,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"向上滑動即可解鎖"</string> <string name="phone_hint" msgid="3101468054914424646">"向右滑動可使用手機功能"</string> <string name="camera_hint" msgid="5241441720959174226">"向左滑動可使用相機功能"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"無"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"優先"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"無干擾"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"僅顯示優先通知"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"僅允許鬧鐘"</string> <string name="interruption_level_all" msgid="1330581184930945764">"全部"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"無\n干擾"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"僅允許\n優先通知"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"僅允許\n鬧鐘"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"充電中 (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>後充飽)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"切換使用者"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"切換使用者,目前使用者是<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -333,6 +344,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"您要繼續這個工作階段嗎?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"重新開始"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"是,請繼續"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者皆可為其他所有使用者更新應用程式。"</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"節約耗電量模式已啟用"</string> @@ -384,4 +401,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"拒絕"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」現在是預設的音量控制對話方塊。"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"輕觸這裡即可恢復原始設定。"</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 0136eb1..e91577d 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -44,7 +44,6 @@ <string name="battery_saver_start_action" msgid="5576697451677486320">"Vula isilondolozi sebhethri"</string> <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Izilungiselelo"</string> <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"I-Wi-Fi"</string> - <string name="status_bar_settings_airplane" msgid="4879879698500955300">"Imodi yendiza"</string> <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Ukuzulazula kweskrini okuzenzakalelayo"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"THULISA"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"OKUZENZAKALELAYO"</string> @@ -168,6 +167,8 @@ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Khiya isikrini."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Izilungiselelo"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Buka konke."</string> + <!-- no translation found for accessibility_desc_confirm (3446792278337969766) --> + <skip /> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Umsebenzisi <xliff:g id="USER">%s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"I-Wifi ivaliwe."</string> @@ -180,6 +181,7 @@ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Imodi yendiza ivuliwe."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Ukungaphazamisi kuvuliwe, okubalulekile kuphela."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"Ungaphazamisi, akukho ukuphazamiseka."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Ukungaphazamisi kuvuliwe, ama-alamu kuphela."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Ukungaphazamisi kuvaliwe."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Ukungaphazamisi kuvaliwe."</string> <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Ukungaphazamisi kuvuliwe."</string> @@ -230,9 +232,9 @@ <string name="dessert_case" msgid="1295161776223959221">"Isikhwama soswidi"</string> <string name="start_dreams" msgid="7219575858348719790">"Ukuphupha emini"</string> <string name="ethernet_label" msgid="7967563676324087464">"I-Ethernet"</string> - <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Isimo sendiza"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ungaphazamisi"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Okubalulekile kuphela"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ama-alamu kuphela"</string> <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Azikho iziphazamiso"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"I-Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"I-Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> amadivayisi)"</string> @@ -301,8 +303,13 @@ <string name="description_direction_up" msgid="7169032478259485180">"Shelelisela ngenhla ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Shelelisela ngakwesokunxele ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Akukho ukuphazamiseka. Nama-alamu imbala."</string> + <!-- no translation found for zen_priority_introduction (7253045784560169993) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> <string name="zen_no_interruptions" msgid="7970973750143632592">"Azikho iziphazamiso"</string> <string name="zen_important_interruptions" msgid="3477041776609757628">"Iziphazamiso ezibalulekile kuphela"</string> + <string name="zen_alarms" msgid="5055668280767657759">"Ama-alamu kuphela"</string> <string name="zen_alarm_information_time" msgid="5235772206174372272">"I-alamu yakho elandelayo ingo<xliff:g id="ALARM_TIME">%s</xliff:g>"</string> <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"I-alamu yakho elandelayo ingo-<xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> <string name="zen_alarm_warning" msgid="6873910860111498041">"Ngeke uzwe i-alamu yakho ngo-<xliff:g id="ALARM_TIME">%s</xliff:g>"</string> @@ -312,9 +319,13 @@ <string name="keyguard_unlock" msgid="8043466894212841998">"Swayiphela phezulu ukuze uvule"</string> <string name="phone_hint" msgid="3101468054914424646">"Swayiphela ngakwesokudla ukuze uthole ifoni"</string> <string name="camera_hint" msgid="5241441720959174226">"Swayiphela ngakwesokunxele ukuze uthole ikhamela"</string> - <string name="interruption_level_none" msgid="3831278883136066646">"Lutho"</string> - <string name="interruption_level_priority" msgid="6517366750688942030">"Okubalulekile"</string> + <string name="interruption_level_none" msgid="8284541443482072628">"Azikho iziphazamiso"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"Okubalulekile kuphela"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Ama-alamu kuphela"</string> <string name="interruption_level_all" msgid="1330581184930945764">"Konke"</string> + <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Akukho\nukuphazamiseka"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Okubalulekile\nkuphela"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Ama-alamu\nkuphela"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Iyashaja (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ize igcwale)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Shintsha umsebenzisi"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Shintsha umsebenzisi, umsebenzisi wamanje ngu-<xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -331,6 +342,12 @@ <string name="guest_wipe_session_message" msgid="8476238178270112811">"Ingabe ufuna ukuqhubeka ngesikhathi sakho?"</string> <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Qala phansi"</string> <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Yebo, qhubeka"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (7513706222848825467) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> <string name="user_add_user_title" msgid="4553596395824132638">"Engeza umsebenzisi omusha?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha isikhala sakhe.\n\nNoma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza kubo bonke abasebenzisi."</string> <string name="battery_saver_notification_title" msgid="237918726750955859">"Isilondolozi sebhethri sivuliwe"</string> @@ -382,4 +399,6 @@ <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Phika"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> yingxoxo yevolumu"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Thinta ukuze ubuyisele kokwangempela."</string> + <!-- no translation found for managed_profile_foreground_toast (3199278359979281097) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index 6ecdca3..24f92ef 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -72,5 +72,15 @@ <attr name="verticalSpacing" format="dimension" /> <attr name="horizontalSpacing" format="dimension" /> </declare-styleable> + + <!-- Theme for icons in the status bar (light/dark). background/fillColor is used for dual tone + icons like wifi and signal, and singleToneColor is used for icons with only one tone. + Contract: Pixel with fillColor blended over backgroundColor blended over translucent should + equal to singleToneColor blended over translucent. --> + <declare-styleable name="TonedIcon"> + <attr name="backgroundColor" format="integer" /> + <attr name="fillColor" format="integer" /> + <attr name="singleToneColor" format="integer" /> + </declare-styleable> </resources> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index d4aeab6..1f1455a 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -44,6 +44,7 @@ <color name="qs_subhead">#99FFFFFF</color><!-- 60% white --> <color name="qs_detail_empty">#24B0BEC5</color><!-- 14% blue grey 200 --> <color name="qs_detail_button">#FFB0BEC5</color><!-- 100% blue grey 200 --> + <color name="qs_detail_button_white">#B3FFFFFF</color><!-- 70% white --> <color name="qs_detail_transition">#66FFFFFF</color> <color name="qs_detail_progress_track">#99009688</color><!-- 60% deep teal 500 --> <color name="data_usage_secondary">#99FFFFFF</color><!-- 60% white --> @@ -108,8 +109,7 @@ <color name="notification_guts_text_color">#b2FFFFFF</color> <color name="notification_guts_btn_color">#FFFFFFFF</color> - <color name="search_panel_circle_color">#ffffff</color> - <color name="search_panel_ripple_color">#ffbbbbbb</color> + <color name="assist_orb_color">#ffffff</color> <color name="keyguard_user_switcher_background_gradient_color">#77000000</color> <color name="doze_small_icon_background_color">#ff434343</color> @@ -129,6 +129,14 @@ <color name="segmented_button_selected">#FFFFFFFF</color> <color name="segmented_button_unselected">#B3B0BEC5</color><!-- 70% blue grey 200 --> - <color name="volume_panel_divider">#1FFFFFFF</color><!-- 12% white --> - <color name="light_mode_icon_color">#FF616161</color><!-- grey 700 --> + + <color name="dark_mode_icon_color_single_tone">#99000000</color> + <color name="dark_mode_icon_color_dual_tone_background">#3d000000</color> + <color name="dark_mode_icon_color_dual_tone_fill">#7a000000</color> + + <color name="light_mode_icon_color_single_tone">#ffffff</color> + <color name="light_mode_icon_color_dual_tone_background">#4dffffff</color> + <color name="light_mode_icon_color_dual_tone_fill">#ffffff</color> + + <color name="zen_introduction_message_background">#ff009688</color><!-- deep teal 500 --> </resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 2e9e9f7..2e44547 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -147,7 +147,7 @@ <integer name="heads_up_default_snooze_length_ms">60000</integer> <!-- Minimum display time for a heads up notification, in milliseconds. --> - <integer name="heads_up_notification_minimum_time">3000</integer> + <integer name="heads_up_notification_minimum_time">2000</integer> <!-- milliseconds before the heads up notification accepts touches. --> <integer name="heads_up_sensitivity_delay">700</integer> @@ -276,9 +276,6 @@ <!-- Doze: alpha to apply to small icons when dozing --> <integer name="doze_small_icon_alpha">222</integer><!-- 87% of 0xff --> - <!-- Volume: time to delay dismissing the volume panel after a click is performed --> - <integer name="volume_panel_dismiss_delay">200</integer> - <!-- Hotspot tile: number of days to show after feature is used. --> <integer name="days_to_show_hotspot_tile">30</integer> @@ -293,5 +290,8 @@ <!-- Enable the default volume dialog --> <bool name="enable_volume_ui">true</bool> + + <!-- Duration of the full carrier network change icon animation. --> + <integer name="carrier_network_change_anim_time">3000</integer> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index c24cd64..7e50454 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -330,7 +330,7 @@ keyguard_clock_height_fraction_* for the difference between min and max.--> <dimen name="keyguard_clock_notifications_margin_min">24dp</dimen> <dimen name="keyguard_clock_notifications_margin_max">36dp</dimen> - <dimen name="heads_up_window_height">250dp</dimen> + <dimen name="heads_up_scrim_height">250dp</dimen> <!-- The minimum amount the user needs to swipe to go to the camera / phone. --> <dimen name="keyguard_min_swipe_amount">110dp</dimen> @@ -344,15 +344,6 @@ <!-- The chevron padding to the circle when hinting --> <dimen name="hint_chevron_circle_padding">16dp</dimen> - <!-- Volume panel dialog y offset --> - <dimen name="volume_panel_top">0dp</dimen> - - <!-- Volume panel dialog width --> - <dimen name="volume_panel_width">344dp</dimen> - - <!-- Volume panel z depth --> - <dimen name="volume_panel_z">3dp</dimen> - <!-- Distance between notifications and header when they are considered to be colliding. --> <dimen name="header_notifications_collide_distance">48dp</dimen> @@ -471,22 +462,23 @@ <dimen name="go_to_full_shade_appearing_translation">200dp</dimen> <!-- The diameter of the search panel circle. --> - <dimen name="search_panel_circle_size">88dp</dimen> + <dimen name="assist_orb_size">144dp</dimen> - <!-- The margin to the edge of the screen from where the circle starts to appear --> - <dimen name="search_panel_circle_base_margin">80dp</dimen> + <!-- The margin to the edge of the screen from where the orb starts to appear --> + <dimen name="assist_orb_base_margin">22dp</dimen> - <!-- The amount the circle translates when appearing --> - <dimen name="search_panel_circle_travel_distance">80dp</dimen> + <!-- The amount the orb translates when appearing --> + <dimen name="assist_orb_travel_distance">26dp</dimen> - <!-- The elevation of the search panel circle --> - <dimen name="search_panel_circle_elevation">12dp</dimen> + <!-- The elevation of the orb --> + <dimen name="assist_orb_elevation">12dp</dimen> - <!-- The height of the scrim behind the search panel circle. --> - <dimen name="search_panel_scrim_height">250dp</dimen> + <!-- The height of the scrim behind the orb. --> + <dimen name="assist_orb_scrim_height">250dp</dimen> - <!-- How far the user needs to drag up to invoke search. --> - <dimen name="search_panel_threshold">100dp</dimen> + <!-- The height of the scrim behind the search panel circle. Should be navigation_bar_height + + 8dp. --> + <dimen name="assist_orb_navbar_scrim_height">56dp</dimen> <!-- The width/height of the phone/camera/unlock icon view on keyguard. --> <dimen name="keyguard_affordance_height">56dp</dimen> @@ -572,4 +564,7 @@ <!-- Screen pinning inner nav bar outer circle size --> <dimen name="screen_pinning_nav_highlight_outer_size">84dp</dimen> + <!-- Padding to be used on the bottom of the fingerprint icon on Keyguard so it better aligns + with the other icons. --> + <dimen name="fingerprint_icon_additional_padding">12dp</dimen> </resources> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 3fc75d2..6d84727 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -37,6 +37,8 @@ <item type="id" name="doze_saved_filter_tag"/> <item type="id" name="qs_icon_tag"/> <item type="id" name="scrim"/> + <item type="id" name="hun_scrim_alpha_start"/> + <item type="id" name="hun_scrim_alpha_end"/> <item type="id" name="notification_power"/> <item type="id" name="notification_screenshot"/> <item type="id" name="notification_hidden"/> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index b696787..67a0bc6 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -100,9 +100,6 @@ <!-- Name of the button that links to the Wifi settings screen. [CHAR LIMIT=NONE] --> <string name="status_bar_settings_wifi_button">Wi-Fi</string> - <!-- Label in the system panel for airplane mode (all radios are turned off)[CHAR LIMIT=30] --> - <string name="status_bar_settings_airplane">Airplane mode</string> - <!-- Label in system panel saying the device will use the orientation sensor to rotate [CHAR LIMIT=30] --> <string name="status_bar_settings_auto_rotation">Auto-rotate screen</string> @@ -362,6 +359,9 @@ <!-- Content description of the airplane mode icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_airplane_mode">Airplane mode.</string> + <!-- Content description of the carrier network changing icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_carrier_network_change_mode">Carrier network changing.</string> + <!-- Content description of the battery level icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_battery_level">Battery <xliff:g id="number">%d</xliff:g> percent.</string> @@ -413,6 +413,8 @@ <string name="accessibility_desc_settings">Settings</string> <!-- Content description for the recent apps panel (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_desc_recent_apps">Overview.</string> + <!-- Content description for the confirm button in the zen mode panel introduction message. [CHAR LIMIT=NONE] --> + <string name="accessibility_desc_confirm">Confirm</string> <!-- Content description of the user tile in quick settings (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_quick_settings_user">User <xliff:g id="user" example="John Doe">%s</xliff:g>.</string> @@ -438,6 +440,8 @@ <string name="accessibility_quick_settings_dnd_priority_on">Do not disturb on, priority only.</string> <!-- Content description of the do not disturb tile in quick settings when on in none (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_quick_settings_dnd_none_on">Do not disturb on, no interruptions.</string> + <!-- Content description of the do not disturb tile in quick settings when on in alarms only (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_quick_settings_dnd_alarms_on">Do not disturb on, alarms only.</string> <!-- Content description of the do not disturb tile in quick settings when off (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_quick_settings_dnd_off">Do not disturb off.</string> <!-- Announcement made when do not disturb changes to off (not shown on the screen). [CHAR LIMIT=NONE] --> @@ -566,12 +570,12 @@ <!-- Textual description of Ethernet connections --> <string name="ethernet_label">Ethernet</string> - <!-- QuickSettings: Airplane mode [CHAR LIMIT=NONE] --> - <string name="quick_settings_airplane_mode_label">Airplane mode</string> <!-- QuickSettings: Do not disturb [CHAR LIMIT=NONE] --> <string name="quick_settings_dnd_label">Do not disturb</string> <!-- QuickSettings: Do not disturb - Priority only [CHAR LIMIT=NONE] --> <string name="quick_settings_dnd_priority_label">Priority only</string> + <!-- QuickSettings: Do not disturb - Alarms only [CHAR LIMIT=NONE] --> + <string name="quick_settings_dnd_alarms_label">Alarms only</string> <!-- QuickSettings: Do not disturb - No interruptions [CHAR LIMIT=NONE] --> <string name="quick_settings_dnd_none_label">No interruptions</string> <!-- QuickSettings: Bluetooth [CHAR LIMIT=NONE] --> @@ -724,12 +728,21 @@ <!-- Zen mode: No interruptions title, with a warning about alarms. [CHAR LIMIT=60] --> <string name="zen_no_interruptions_with_warning">No interruptions. Not even alarms.</string> + <!-- Zen mode: Priority only introduction message on first use --> + <string name="zen_priority_introduction">You won\'t be disturbed by sounds and vibrations, except from alarms, reminders, events, and callers you specify.</string> + + <!-- Zen mode: Priority only customization button label --> + <string name="zen_priority_customize_button">Customize</string> + <!-- Zen mode: No interruptions. [CHAR LIMIT=40] --> <string name="zen_no_interruptions">No interruptions</string> <!-- Zen mode: Only important interruptions. [CHAR LIMIT=40] --> <string name="zen_important_interruptions">Priority interruptions only</string> + <!-- Zen mode: Only alarms. [CHAR LIMIT=40] --> + <string name="zen_alarms">Alarms only</string> + <!-- Zen mode: Next alarm information - just a time. [CHAR LIMIT=40] --> <string name="zen_alarm_information_time">Your next alarm is at <xliff:g id="alarm_time" example="5:00 PM">%s</xliff:g></string> @@ -758,14 +771,26 @@ <string name="camera_hint">Swipe left for camera</string> <!-- Interruption level: None. [CHAR LIMIT=20] --> - <string name="interruption_level_none">None</string> + <string name="interruption_level_none">No interruptions</string> <!-- Interruption level: Priority. [CHAR LIMIT=20] --> - <string name="interruption_level_priority">Priority</string> + <string name="interruption_level_priority">Priority only</string> + + <!-- Interruption level: Alarms only. [CHAR LIMIT=20] --> + <string name="interruption_level_alarms">Alarms only</string> <!-- Interruption level: All. [CHAR LIMIT=20] --> <string name="interruption_level_all">All</string> + <!-- Interruption level: None. Optimized for narrow two-line display. [CHAR LIMIT=20] --> + <string name="interruption_level_none_twoline">No\ninterruptions</string> + + <!-- Interruption level: Priority. Optimized for narrow two-line display. [CHAR LIMIT=20] --> + <string name="interruption_level_priority_twoline">Priority\nonly</string> + + <!-- Interruption level: Alarms only. Optimized for narrow two-line display. [CHAR LIMIT=20] --> + <string name="interruption_level_alarms_twoline">Alarms\nonly</string> + <!-- Indication on the keyguard that is shown when the device is charging. [CHAR LIMIT=40]--> <string name="keyguard_indication_charging_time">Charging (<xliff:g id="charging_time_left" example="4 hours and 2 minutes">%s</xliff:g> until full)</string> @@ -816,6 +841,15 @@ <!-- Notification when resuming an existing guest session: Action that continues with the current session [CHAR LIMIT=35] --> <string name="guest_wipe_session_dontwipe">Yes, continue</string> + <!-- Title of the notification shown to a new guest user [CHAR LIMIT=60] --> + <string name="guest_notification_title">Guest user</string> + + <!-- Text of the notification shown to a new guest user [CHAR LIMIT=60] --> + <string name="guest_notification_text">Remove guest to delete apps and data</string> + + <!-- Remove action in the notification shown to a new guest user [CHAR LIMIT=30] --> + <string name="guest_notification_remove_action">REMOVE GUEST</string> + <!-- Title for add user confirmation dialog [CHAR LIMIT=30] --> <string name="user_add_user_title" msgid="2108112641783146007">Add new user?</string> @@ -965,4 +999,10 @@ <!-- VolumeUI restoration notification: text --> <string name="volumeui_notification_text">Touch to restore the original.</string> + + <!-- Volume dialog zen toggle switch title --> + <string name="volume_zen_switch_text" translatable="false">@*android:string/zen_mode_feature_name</string> + + <!-- Toast shown when user unlocks screen and managed profile activity is in the foreground --> + <string name="managed_profile_foreground_toast">You are in the Work profile</string> </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 07fcb82..ef2e6f3 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -138,9 +138,8 @@ <item name="android:textColor">@color/system_accent_color</item> </style> - <style name="TextAppearance.QS.VolumeSuppressor"> + <style name="TextAppearance.QS.Introduction"> <item name="android:textSize">14sp</item> - <item name="android:textColor">@color/qs_tile_text</item> </style> <style name="TextAppearance.QS.DetailButton"> @@ -151,6 +150,10 @@ <item name="android:gravity">center</item> </style> + <style name="TextAppearance.QS.DetailButton.White"> + <item name="android:textColor">@color/qs_detail_button_white</item> + </style> + <style name="TextAppearance.QS.DetailEmpty"> <item name="android:textSize">@dimen/qs_detail_empty_text_size</item> <item name="android:textColor">@color/qs_subhead</item> @@ -201,11 +204,6 @@ <style name="Animation.StatusBar"> </style> - <style name="Animation.StatusBar.HeadsUp"> - <item name="android:windowEnterAnimation">@anim/heads_up_enter</item> - <item name="android:windowExitAnimation">@anim/heads_up_exit</item> - </style> - <style name="systemui_theme" parent="@android:style/Theme.DeviceDefault"> <item name="android:colorPrimary">@color/system_primary_color</item> <item name="android:colorControlActivated">@color/system_accent_color</item> @@ -229,12 +227,6 @@ <item name="android:gravity">center</item> </style> - <!-- Window animations used for volume panel. --> - <style name="VolumePanelAnimation"> - <item name="android:windowEnterAnimation">@*android:anim/popup_enter_material</item> - <item name="android:windowExitAnimation">@*android:anim/popup_exit_material</item> - </style> - <style name="TextAppearance.Material.Notification.Parenthetical" parent="@*android:style/TextAppearance.Material.Notification"> <item name="android:textStyle">italic</item> @@ -246,12 +238,6 @@ <item name="android:layout_height">match_parent</item> </style> - <style name="SearchPanelScrim"> - <item name="android:layout_width">match_parent</item> - <item name="android:layout_height">@dimen/search_panel_scrim_height</item> - <item name="android:layout_gravity">bottom</item> - </style> - <style name="UserDetailView"> <item name="numColumns">3</item> </style> @@ -265,4 +251,15 @@ <item name="android:backgroundDimEnabled">false</item> <item name="android:alertDialogTheme">@style/Theme.SystemUI.Dialog.Alert</item> </style> + + <style name="DualToneLightTheme"> + <item name="backgroundColor">@color/light_mode_icon_color_dual_tone_background</item> + <item name="fillColor">@color/light_mode_icon_color_dual_tone_fill</item> + <item name="singleToneColor">@color/light_mode_icon_color_single_tone</item> + </style> + <style name="DualToneDarkTheme"> + <item name="backgroundColor">@color/dark_mode_icon_color_dual_tone_background</item> + <item name="fillColor">@color/dark_mode_icon_color_dual_tone_fill</item> + <item name="singleToneColor">@color/dark_mode_icon_color_single_tone</item> + </style> </resources> diff --git a/packages/SystemUI/res/values/volume.xml b/packages/SystemUI/res/values/volume.xml new file mode 100644 index 0000000..f516104 --- /dev/null +++ b/packages/SystemUI/res/values/volume.xml @@ -0,0 +1,87 @@ +<!-- + Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android"> + + <item name="volume_expand_animation_duration" type="integer">300</item> + + <color name="volume_icon_color">#ffffffff</color> + <color name="volume_settings_icon_color">#7fffffff</color> + + <dimen name="volume_slider_interspacing">2dp</dimen> + <dimen name="volume_offset_top">0dp</dimen> + <dimen name="volume_button_size">48dp</dimen> + + <item name="volume_secondary_alpha" format="float" type="dimen">0.3</item> + + <style name="VolumeDialogAnimations"> + <item name="android:windowEnterAnimation">@android:anim/fade_in</item> + <item name="android:windowExitAnimation">@android:anim/fade_out</item> + </style> + + <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless"> + <item name="android:background">@drawable/btn_borderless_rect</item> + </style> + + <style name="TextAppearance" /> + + <style name="TextAppearance.Volume"> + <item name="android:textStyle">normal</item> + <item name="android:textColor">#ffffffff</item> + <item name="android:fontFamily">sans-serif</item> + </style> + + <style name="TextAppearance.Volume.ZenSwitch"> + <item name="android:textSize">16sp</item> + <item name="android:fontFamily">sans-serif-medium</item> + </style> + + <style name="TextAppearance.Volume.ZenSwitchSummary"> + <item name="android:textSize">14sp</item> + <item name="android:fontFamily">sans-serif-medium</item> + </style> + + <style name="TextAppearance.Volume.ZenSwitchDetail"> + <item name="android:textSize">14sp</item> + <item name="android:fontFamily">sans-serif</item> + <item name="android:textColor">#ffb0b3c5</item> + </style> + + <string-array name="volume_stream_titles" translatable="false"> + <item>Voice calls</item> <!-- STREAM_VOICE_CALL --> + <item>System</item> <!-- STREAM_SYSTEM --> + <item>Notifications</item> <!-- STREAM_RING --> + <item>Media</item> <!-- STREAM_MUSIC --> + <item>Alarms</item> <!-- STREAM_ALARM --> + <item></item> <!-- STREAM_NOTIFICATION --> + <item>Bluetooth calls</item> <!-- STREAM_BLUETOOTH_SCO --> + <item></item> <!-- STREAM_SYSTEM_ENFORCED --> + <item></item> <!-- STREAM_DTMF --> + <item></item> <!-- STREAM_TTS --> + </string-array> + + <string name="volume_dnd_is_on" translatable="false">Do not disturb is on</string> + <string name="volume_turn_off" translatable="false">Turn off</string> + <string name="volume_stream_muted" translatable="false">%s silent</string> + <string name="volume_stream_vibrate" translatable="false">%s vibrate</string> + <string name="volume_stream_suppressed" translatable="false">%1$s silent — %2$s</string> + <string name="volume_stream_muted_dnd" translatable="false">%s silent — No interruptions</string> + <string name="volume_stream_limited_dnd" translatable="false">%s — Priority only</string> + <string name="volume_stream_vibrate_dnd" translatable="false">%s vibrate — Priority only</string> + <string name="volume_dnd_ends_in" translatable="false">Do not disturb ends in %s</string> + <string name="volume_dnd_ends_at" translatable="false">Do not disturb ends at %s</string> + <string name="volume_end_now" translatable="false">End now</string> + +</resources>
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index 2e95498..292c9c2 100755 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -16,6 +16,7 @@ package com.android.systemui; +import android.animation.ArgbEvaluator; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -80,6 +81,12 @@ public class BatteryMeterView extends View implements DemoMode, private BatteryController mBatteryController; private boolean mPowerSaveEnabled; + private int mDarkModeBackgroundColor; + private int mDarkModeFillColor; + + private int mLightModeBackgroundColor; + private int mLightModeFillColor; + private class BatteryTracker extends BroadcastReceiver { public static final int UNKNOWN_LEVEL = -1; @@ -245,6 +252,13 @@ public class BatteryMeterView extends View implements DemoMode, mBoltPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mBoltPaint.setColor(context.getColor(R.color.batterymeter_bolt_color)); mBoltPoints = loadBoltPoints(res); + + mDarkModeBackgroundColor = + context.getColor(R.color.dark_mode_icon_color_dual_tone_background); + mDarkModeFillColor = context.getColor(R.color.dark_mode_icon_color_dual_tone_fill); + mLightModeBackgroundColor = + context.getColor(R.color.light_mode_icon_color_dual_tone_background); + mLightModeFillColor = context.getColor(R.color.light_mode_icon_color_dual_tone_fill); } public void setBatteryController(BatteryController batteryController) { @@ -309,14 +323,30 @@ public class BatteryMeterView extends View implements DemoMode, return color; } - public void setIconTint(int tint) { - mIconTint = tint; - mFramePaint.setColorFilter(new PorterDuffColorFilter(tint, PorterDuff.Mode.SRC_ATOP)); - mBoltPaint.setColor(tint); - mChargeColor = tint; + public void setDarkIntensity(float darkIntensity) { + int backgroundColor = getBackgroundColor(darkIntensity); + int fillColor = getFillColor(darkIntensity); + mIconTint = fillColor; + mFramePaint.setColor(backgroundColor); + mBoltPaint.setColor(backgroundColor); + mChargeColor = fillColor; invalidate(); } + private int getBackgroundColor(float darkIntensity) { + return getColorForDarkIntensity( + darkIntensity, mLightModeBackgroundColor, mDarkModeBackgroundColor); + } + + private int getFillColor(float darkIntensity) { + return getColorForDarkIntensity( + darkIntensity, mLightModeFillColor, mDarkModeFillColor); + } + + private int getColorForDarkIntensity(float darkIntensity, int lightColor, int darkColor) { + return (int) ArgbEvaluator.getInstance().evaluate(darkIntensity, lightColor, darkColor); + } + @Override public void draw(Canvas c) { BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java index bc7f745..fece07f 100644 --- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java +++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java @@ -322,6 +322,10 @@ public class ExpandHelper implements Gefingerpoken { isInside(mScrollAdapter.getHostView(), x, y) && mScrollAdapter.isScrolledToTop(); mResizedView = findView(x, y); + if (mResizedView != null && !mCallback.canChildBeExpanded(mResizedView)) { + mResizedView = null; + mWatchingForPull = false; + } mInitialTouchY = ev.getY(); break; diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java new file mode 100644 index 0000000..68b1968 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import android.annotation.StringDef; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Map; + +public final class Prefs { + private Prefs() {} // no instantation + + @Retention(RetentionPolicy.SOURCE) + @StringDef({ + Key.SEARCH_APP_WIDGET_ID, + Key.DEBUG_MODE_ENABLED, + Key.HOTSPOT_TILE_LAST_USED, + Key.COLOR_INVERSION_TILE_LAST_USED, + Key.DND_TILE_VISIBLE, + Key.DND_TILE_COMBINED_ICON, + Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, + Key.DND_FAVORITE_BUCKET_INDEX, + Key.DND_NONE_SELECTED, + }) + public @interface Key { + String SEARCH_APP_WIDGET_ID = "searchAppWidgetId"; + String DEBUG_MODE_ENABLED = "debugModeEnabled"; + String HOTSPOT_TILE_LAST_USED = "HotspotTileLastUsed"; + String COLOR_INVERSION_TILE_LAST_USED = "ColorInversionTileLastUsed"; + String DND_TILE_VISIBLE = "DndTileVisible"; + String DND_TILE_COMBINED_ICON = "DndTileCombinedIcon"; + String DND_CONFIRMED_PRIORITY_INTRODUCTION = "DndConfirmedPriorityIntroduction"; + String DND_FAVORITE_BUCKET_INDEX = "DndCountdownMinuteIndex"; + String DND_NONE_SELECTED = "DndNoneSelected"; + } + + public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) { + return get(context).getBoolean(key, defaultValue); + } + + public static void putBoolean(Context context, @Key String key, boolean value) { + get(context).edit().putBoolean(key, value).apply(); + } + + public static int getInt(Context context, @Key String key, int defaultValue) { + return get(context).getInt(key, defaultValue); + } + + public static void putInt(Context context, @Key String key, int value) { + get(context).edit().putInt(key, value).apply(); + } + + public static long getLong(Context context, @Key String key, long defaultValue) { + return get(context).getLong(key, defaultValue); + } + + public static void putLong(Context context, @Key String key, long value) { + get(context).edit().putLong(key, value).apply(); + } + + public static Map<String, ?> getAll(Context context) { + return get(context).getAll(); + } + + public static void remove(Context context, @Key String key) { + get(context).edit().remove(key).apply(); + } + + public static void registerListener(Context context, + OnSharedPreferenceChangeListener listener) { + get(context).registerOnSharedPreferenceChangeListener(listener); + } + + public static void unregisterListener(Context context, + OnSharedPreferenceChangeListener listener) { + get(context).unregisterOnSharedPreferenceChangeListener(listener); + } + + private static SharedPreferences get(Context context) { + return context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelCircleView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelCircleView.java deleted file mode 100644 index f33e2b8..0000000 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelCircleView.java +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.systemui; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.PropertyValuesHolder; -import android.animation.ValueAnimator; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Outline; -import android.graphics.Paint; -import android.graphics.Rect; -import android.util.AttributeSet; -import android.view.View; -import android.view.ViewOutlineProvider; -import android.view.animation.AnimationUtils; -import android.view.animation.Interpolator; -import android.view.animation.LinearInterpolator; -import android.widget.FrameLayout; -import android.widget.ImageView; -import com.android.systemui.statusbar.phone.PhoneStatusBar; - -import java.util.ArrayList; - -public class SearchPanelCircleView extends FrameLayout { - - private final int mCircleMinSize; - private final int mBaseMargin; - private final int mStaticOffset; - private final Paint mBackgroundPaint = new Paint(); - private final Paint mRipplePaint = new Paint(); - private final Rect mCircleRect = new Rect(); - private final Rect mStaticRect = new Rect(); - private final Interpolator mFastOutSlowInInterpolator; - private final Interpolator mAppearInterpolator; - private final Interpolator mDisappearInterpolator; - - private boolean mClipToOutline; - private final int mMaxElevation; - private boolean mAnimatingOut; - private float mOutlineAlpha; - private float mOffset; - private float mCircleSize; - private boolean mHorizontal; - private boolean mCircleHidden; - private ImageView mLogo; - private boolean mDraggedFarEnough; - private boolean mOffsetAnimatingIn; - private float mCircleAnimationEndValue; - private ArrayList<Ripple> mRipples = new ArrayList<Ripple>(); - - private ValueAnimator mOffsetAnimator; - private ValueAnimator mCircleAnimator; - private ValueAnimator mFadeOutAnimator; - private ValueAnimator.AnimatorUpdateListener mCircleUpdateListener - = new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - applyCircleSize((float) animation.getAnimatedValue()); - updateElevation(); - } - }; - private AnimatorListenerAdapter mClearAnimatorListener = new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mCircleAnimator = null; - } - }; - private ValueAnimator.AnimatorUpdateListener mOffsetUpdateListener - = new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - setOffset((float) animation.getAnimatedValue()); - } - }; - - - public SearchPanelCircleView(Context context) { - this(context, null); - } - - public SearchPanelCircleView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public SearchPanelCircleView(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public SearchPanelCircleView(Context context, AttributeSet attrs, int defStyleAttr, - int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - if (mCircleSize > 0.0f) { - outline.setOval(mCircleRect); - } else { - outline.setEmpty(); - } - outline.setAlpha(mOutlineAlpha); - } - }); - setWillNotDraw(false); - mCircleMinSize = context.getResources().getDimensionPixelSize( - R.dimen.search_panel_circle_size); - mBaseMargin = context.getResources().getDimensionPixelSize( - R.dimen.search_panel_circle_base_margin); - mStaticOffset = context.getResources().getDimensionPixelSize( - R.dimen.search_panel_circle_travel_distance); - mMaxElevation = context.getResources().getDimensionPixelSize( - R.dimen.search_panel_circle_elevation); - mAppearInterpolator = AnimationUtils.loadInterpolator(mContext, - android.R.interpolator.linear_out_slow_in); - mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(mContext, - android.R.interpolator.fast_out_slow_in); - mDisappearInterpolator = AnimationUtils.loadInterpolator(mContext, - android.R.interpolator.fast_out_linear_in); - mBackgroundPaint.setAntiAlias(true); - mBackgroundPaint.setColor(context.getColor(R.color.search_panel_circle_color)); - mRipplePaint.setColor(context.getColor(R.color.search_panel_ripple_color)); - mRipplePaint.setAntiAlias(true); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - drawBackground(canvas); - drawRipples(canvas); - } - - private void drawRipples(Canvas canvas) { - for (int i = 0; i < mRipples.size(); i++) { - Ripple ripple = mRipples.get(i); - ripple.draw(canvas); - } - } - - private void drawBackground(Canvas canvas) { - canvas.drawCircle(mCircleRect.centerX(), mCircleRect.centerY(), mCircleSize / 2, - mBackgroundPaint); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mLogo = (ImageView) findViewById(R.id.search_logo); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - mLogo.layout(0, 0, mLogo.getMeasuredWidth(), mLogo.getMeasuredHeight()); - if (changed) { - updateCircleRect(mStaticRect, mStaticOffset, true); - } - } - - public void setCircleSize(float circleSize) { - setCircleSize(circleSize, false, null, 0, null); - } - - public void setCircleSize(float circleSize, boolean animated, final Runnable endRunnable, - int startDelay, Interpolator interpolator) { - boolean isAnimating = mCircleAnimator != null; - boolean animationPending = isAnimating && !mCircleAnimator.isRunning(); - boolean animatingOut = isAnimating && mCircleAnimationEndValue == 0; - if (animated || animationPending || animatingOut) { - if (isAnimating) { - if (circleSize == mCircleAnimationEndValue) { - return; - } - mCircleAnimator.cancel(); - } - mCircleAnimator = ValueAnimator.ofFloat(mCircleSize, circleSize); - mCircleAnimator.addUpdateListener(mCircleUpdateListener); - mCircleAnimator.addListener(mClearAnimatorListener); - mCircleAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (endRunnable != null) { - endRunnable.run(); - } - } - }); - Interpolator desiredInterpolator = interpolator != null ? interpolator - : circleSize == 0 ? mDisappearInterpolator : mAppearInterpolator; - mCircleAnimator.setInterpolator(desiredInterpolator); - mCircleAnimator.setDuration(300); - mCircleAnimator.setStartDelay(startDelay); - mCircleAnimator.start(); - mCircleAnimationEndValue = circleSize; - } else { - if (isAnimating) { - float diff = circleSize - mCircleAnimationEndValue; - PropertyValuesHolder[] values = mCircleAnimator.getValues(); - values[0].setFloatValues(diff, circleSize); - mCircleAnimator.setCurrentPlayTime(mCircleAnimator.getCurrentPlayTime()); - mCircleAnimationEndValue = circleSize; - } else { - applyCircleSize(circleSize); - updateElevation(); - } - } - } - - private void applyCircleSize(float circleSize) { - mCircleSize = circleSize; - updateLayout(); - } - - private void updateElevation() { - float t = (mStaticOffset - mOffset) / (float) mStaticOffset; - t = 1.0f - Math.max(t, 0.0f); - float offset = t * mMaxElevation; - setElevation(offset); - } - - /** - * Sets the offset to the edge of the screen. By default this not not animated. - * - * @param offset The offset to apply. - */ - public void setOffset(float offset) { - setOffset(offset, false, 0, null, null); - } - - /** - * Sets the offset to the edge of the screen. - * - * @param offset The offset to apply. - * @param animate Whether an animation should be performed. - * @param startDelay The desired start delay if animated. - * @param interpolator The desired interpolator if animated. If null, - * a default interpolator will be taken designed for appearing or - * disappearing. - * @param endRunnable The end runnable which should be executed when the animation is finished. - */ - private void setOffset(float offset, boolean animate, int startDelay, - Interpolator interpolator, final Runnable endRunnable) { - if (!animate) { - mOffset = offset; - updateLayout(); - if (endRunnable != null) { - endRunnable.run(); - } - } else { - if (mOffsetAnimator != null) { - mOffsetAnimator.removeAllListeners(); - mOffsetAnimator.cancel(); - } - mOffsetAnimator = ValueAnimator.ofFloat(mOffset, offset); - mOffsetAnimator.addUpdateListener(mOffsetUpdateListener); - mOffsetAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mOffsetAnimator = null; - if (endRunnable != null) { - endRunnable.run(); - } - } - }); - Interpolator desiredInterpolator = interpolator != null ? - interpolator : offset == 0 ? mDisappearInterpolator : mAppearInterpolator; - mOffsetAnimator.setInterpolator(desiredInterpolator); - mOffsetAnimator.setStartDelay(startDelay); - mOffsetAnimator.setDuration(300); - mOffsetAnimator.start(); - mOffsetAnimatingIn = offset != 0; - } - } - - private void updateLayout() { - updateCircleRect(); - updateLogo(); - invalidateOutline(); - invalidate(); - updateClipping(); - } - - private void updateClipping() { - boolean clip = mCircleSize < mCircleMinSize || !mRipples.isEmpty(); - if (clip != mClipToOutline) { - setClipToOutline(clip); - mClipToOutline = clip; - } - } - - private void updateLogo() { - boolean exitAnimationRunning = mFadeOutAnimator != null; - Rect rect = exitAnimationRunning ? mCircleRect : mStaticRect; - float translationX = (rect.left + rect.right) / 2.0f - mLogo.getWidth() / 2.0f; - float translationY = (rect.top + rect.bottom) / 2.0f - mLogo.getHeight() / 2.0f; - float t = (mStaticOffset - mOffset) / (float) mStaticOffset; - if (!exitAnimationRunning) { - if (mHorizontal) { - translationX += t * mStaticOffset * 0.3f; - } else { - translationY += t * mStaticOffset * 0.3f; - } - float alpha = 1.0f-t; - alpha = Math.max((alpha - 0.5f) * 2.0f, 0); - mLogo.setAlpha(alpha); - } else { - translationY += (mOffset - mStaticOffset) / 2; - } - mLogo.setTranslationX(translationX); - mLogo.setTranslationY(translationY); - } - - private void updateCircleRect() { - updateCircleRect(mCircleRect, mOffset, false); - } - - private void updateCircleRect(Rect rect, float offset, boolean useStaticSize) { - int left, top; - float circleSize = useStaticSize ? mCircleMinSize : mCircleSize; - if (mHorizontal) { - left = (int) (getWidth() - circleSize / 2 - mBaseMargin - offset); - top = (int) ((getHeight() - circleSize) / 2); - } else { - left = (int) (getWidth() - circleSize) / 2; - top = (int) (getHeight() - circleSize / 2 - mBaseMargin - offset); - } - rect.set(left, top, (int) (left + circleSize), (int) (top + circleSize)); - } - - public void setHorizontal(boolean horizontal) { - mHorizontal = horizontal; - updateCircleRect(mStaticRect, mStaticOffset, true); - updateLayout(); - } - - public void setDragDistance(float distance) { - if (!mAnimatingOut && (!mCircleHidden || mDraggedFarEnough)) { - float circleSize = mCircleMinSize + rubberband(distance); - setCircleSize(circleSize); - } - - } - - private float rubberband(float diff) { - return (float) Math.pow(Math.abs(diff), 0.6f); - } - - public void startAbortAnimation(Runnable endRunnable) { - if (mAnimatingOut) { - if (endRunnable != null) { - endRunnable.run(); - } - return; - } - setCircleSize(0, true, null, 0, null); - setOffset(0, true, 0, null, endRunnable); - mCircleHidden = true; - } - - public void startEnterAnimation() { - if (mAnimatingOut) { - return; - } - applyCircleSize(0); - setOffset(0); - setCircleSize(mCircleMinSize, true, null, 50, null); - setOffset(mStaticOffset, true, 50, null, null); - mCircleHidden = false; - } - - - public void startExitAnimation(final Runnable endRunnable) { - if (!mHorizontal) { - float offset = getHeight() / 2.0f; - setOffset(offset - mBaseMargin, true, 50, mFastOutSlowInInterpolator, null); - float xMax = getWidth() / 2; - float yMax = getHeight() / 2; - float maxRadius = (float) Math.ceil(Math.hypot(xMax, yMax) * 2); - setCircleSize(maxRadius, true, null, 50, mFastOutSlowInInterpolator); - performExitFadeOutAnimation(50, 300, endRunnable); - } else { - - // when in landscape, we don't wan't the animation as it interferes with the general - // rotation animation to the homescreen. - endRunnable.run(); - } - } - - private void performExitFadeOutAnimation(int startDelay, int duration, - final Runnable endRunnable) { - mFadeOutAnimator = ValueAnimator.ofFloat(mBackgroundPaint.getAlpha() / 255.0f, 0.0f); - - // Linear since we are animating multiple values - mFadeOutAnimator.setInterpolator(new LinearInterpolator()); - mFadeOutAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - float animatedFraction = animation.getAnimatedFraction(); - float logoValue = animatedFraction > 0.5f ? 1.0f : animatedFraction / 0.5f; - logoValue = PhoneStatusBar.ALPHA_OUT.getInterpolation(1.0f - logoValue); - float backgroundValue = animatedFraction < 0.2f ? 0.0f : - PhoneStatusBar.ALPHA_OUT.getInterpolation((animatedFraction - 0.2f) / 0.8f); - backgroundValue = 1.0f - backgroundValue; - mBackgroundPaint.setAlpha((int) (backgroundValue * 255)); - mOutlineAlpha = backgroundValue; - mLogo.setAlpha(logoValue); - invalidateOutline(); - invalidate(); - } - }); - mFadeOutAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (endRunnable != null) { - endRunnable.run(); - } - mLogo.setAlpha(1.0f); - mBackgroundPaint.setAlpha(255); - mOutlineAlpha = 1.0f; - mFadeOutAnimator = null; - } - }); - mFadeOutAnimator.setStartDelay(startDelay); - mFadeOutAnimator.setDuration(duration); - mFadeOutAnimator.start(); - } - - public void setDraggedFarEnough(boolean farEnough) { - if (farEnough != mDraggedFarEnough) { - if (farEnough) { - if (mCircleHidden) { - startEnterAnimation(); - } - if (mOffsetAnimator == null) { - addRipple(); - } else { - postDelayed(new Runnable() { - @Override - public void run() { - addRipple(); - } - }, 100); - } - } else { - startAbortAnimation(null); - } - mDraggedFarEnough = farEnough; - } - - } - - private void addRipple() { - if (mRipples.size() > 1) { - // we only want 2 ripples at the time - return; - } - float xInterpolation, yInterpolation; - if (mHorizontal) { - xInterpolation = 0.75f; - yInterpolation = 0.5f; - } else { - xInterpolation = 0.5f; - yInterpolation = 0.75f; - } - float circleCenterX = mStaticRect.left * (1.0f - xInterpolation) - + mStaticRect.right * xInterpolation; - float circleCenterY = mStaticRect.top * (1.0f - yInterpolation) - + mStaticRect.bottom * yInterpolation; - float radius = Math.max(mCircleSize, mCircleMinSize * 1.25f) * 0.75f; - Ripple ripple = new Ripple(circleCenterX, circleCenterY, radius); - ripple.start(); - } - - public void reset() { - mDraggedFarEnough = false; - mAnimatingOut = false; - mCircleHidden = true; - mClipToOutline = false; - if (mFadeOutAnimator != null) { - mFadeOutAnimator.cancel(); - } - mBackgroundPaint.setAlpha(255); - mOutlineAlpha = 1.0f; - } - - /** - * Check if an animation is currently running - * - * @param enterAnimation Is the animating queried the enter animation. - */ - public boolean isAnimationRunning(boolean enterAnimation) { - return mOffsetAnimator != null && (enterAnimation == mOffsetAnimatingIn); - } - - public void performOnAnimationFinished(final Runnable runnable) { - if (mOffsetAnimator != null) { - mOffsetAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (runnable != null) { - runnable.run(); - } - } - }); - } else { - if (runnable != null) { - runnable.run(); - } - } - } - - public void setAnimatingOut(boolean animatingOut) { - mAnimatingOut = animatingOut; - } - - /** - * @return Whether the circle is currently launching to the search activity or aborting the - * interaction - */ - public boolean isAnimatingOut() { - return mAnimatingOut; - } - - @Override - public boolean hasOverlappingRendering() { - // not really true but it's ok during an animation, as it's never permanent - return false; - } - - private class Ripple { - float x; - float y; - float radius; - float endRadius; - float alpha; - - Ripple(float x, float y, float endRadius) { - this.x = x; - this.y = y; - this.endRadius = endRadius; - } - - void start() { - ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 1.0f); - - // Linear since we are animating multiple values - animator.setInterpolator(new LinearInterpolator()); - animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - alpha = 1.0f - animation.getAnimatedFraction(); - alpha = mDisappearInterpolator.getInterpolation(alpha); - radius = mAppearInterpolator.getInterpolation(animation.getAnimatedFraction()); - radius *= endRadius; - invalidate(); - } - }); - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mRipples.remove(Ripple.this); - updateClipping(); - } - - public void onAnimationStart(Animator animation) { - mRipples.add(Ripple.this); - updateClipping(); - } - }); - animator.setDuration(400); - animator.start(); - } - - public void draw(Canvas canvas) { - mRipplePaint.setAlpha((int) (alpha * 255)); - canvas.drawCircle(x, y, radius, mRipplePaint); - } - } - -} diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java deleted file mode 100644 index 445b499..0000000 --- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui; - -import android.app.ActivityOptions; -import android.app.SearchManager; -import android.content.ActivityNotFoundException; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.media.AudioAttributes; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.UserHandle; -import android.os.Vibrator; -import android.provider.Settings; -import android.util.AttributeSet; -import android.util.Log; -import android.view.MotionEvent; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.ImageView; - -import com.android.systemui.statusbar.BaseStatusBar; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.StatusBarPanel; -import com.android.systemui.statusbar.phone.PhoneStatusBar; - -public class SearchPanelView extends FrameLayout implements StatusBarPanel { - - private static final String TAG = "SearchPanelView"; - private static final String ASSIST_ICON_METADATA_NAME = - "com.android.systemui.action_assist_icon"; - - private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) - .build(); - - private final Context mContext; - private BaseStatusBar mBar; - - private SearchPanelCircleView mCircle; - private ImageView mLogo; - private View mScrim; - - private int mThreshold; - private boolean mHorizontal; - - private boolean mLaunching; - private boolean mDragging; - private boolean mDraggedFarEnough; - private float mStartTouch; - private float mStartDrag; - private boolean mLaunchPending; - - public SearchPanelView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public SearchPanelView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mContext = context; - mThreshold = context.getResources().getDimensionPixelSize(R.dimen.search_panel_threshold); - } - - private void startAssistActivity() { - if (!mBar.isDeviceProvisioned()) return; - - // Close Recent Apps if needed - mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL); - - final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, true, UserHandle.USER_CURRENT); - if (intent == null) return; - - try { - final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, - R.anim.search_launch_enter, R.anim.search_launch_exit); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - AsyncTask.execute(new Runnable() { - @Override - public void run() { - mContext.startActivityAsUser(intent, opts.toBundle(), - new UserHandle(UserHandle.USER_CURRENT)); - } - }); - } catch (ActivityNotFoundException e) { - Log.w(TAG, "Activity not found for " + intent.getAction()); - } - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mCircle = (SearchPanelCircleView) findViewById(R.id.search_panel_circle); - mLogo = (ImageView) findViewById(R.id.search_logo); - mScrim = findViewById(R.id.search_panel_scrim); - } - - private void maybeSwapSearchIcon() { - Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, false, UserHandle.USER_CURRENT); - if (intent != null) { - ComponentName component = intent.getComponent(); - replaceDrawable(mLogo, component, ASSIST_ICON_METADATA_NAME); - } else { - mLogo.setImageDrawable(null); - } - } - - public void replaceDrawable(ImageView v, ComponentName component, String name) { - if (component != null) { - try { - PackageManager packageManager = mContext.getPackageManager(); - // Look for the search icon specified in the activity meta-data - Bundle metaData = packageManager.getActivityInfo( - component, PackageManager.GET_META_DATA).metaData; - if (metaData != null) { - int iconResId = metaData.getInt(name); - if (iconResId != 0) { - Resources res = packageManager.getResourcesForActivity(component); - v.setImageDrawable(res.getDrawable(iconResId)); - return; - } - } - } catch (PackageManager.NameNotFoundException e) { - Log.w(TAG, "Failed to swap drawable; " - + component.flattenToShortString() + " not found", e); - } catch (Resources.NotFoundException nfe) { - Log.w(TAG, "Failed to swap drawable from " - + component.flattenToShortString(), nfe); - } - } - v.setImageDrawable(null); - } - - @Override - public boolean isInContentArea(int x, int y) { - return true; - } - - private void vibrate() { - Context context = getContext(); - if (Settings.System.getIntForUser(context.getContentResolver(), - Settings.System.HAPTIC_FEEDBACK_ENABLED, 1, UserHandle.USER_CURRENT) != 0) { - Resources res = context.getResources(); - Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - vibrator.vibrate(res.getInteger(R.integer.config_search_panel_view_vibration_duration), - VIBRATION_ATTRIBUTES); - } - } - - public void show(final boolean show, boolean animate) { - if (show) { - maybeSwapSearchIcon(); - if (getVisibility() != View.VISIBLE) { - setVisibility(View.VISIBLE); - vibrate(); - if (animate) { - startEnterAnimation(); - } else { - mScrim.setAlpha(1f); - } - } - setFocusable(true); - setFocusableInTouchMode(true); - requestFocus(); - } else { - if (animate) { - startAbortAnimation(); - } else { - setVisibility(View.INVISIBLE); - } - } - } - - private void startEnterAnimation() { - mCircle.startEnterAnimation(); - mScrim.setAlpha(0f); - mScrim.animate() - .alpha(1f) - .setDuration(300) - .setStartDelay(50) - .setInterpolator(PhoneStatusBar.ALPHA_IN) - .start(); - - } - - private void startAbortAnimation() { - mCircle.startAbortAnimation(new Runnable() { - @Override - public void run() { - mCircle.setAnimatingOut(false); - setVisibility(View.INVISIBLE); - } - }); - mCircle.setAnimatingOut(true); - mScrim.animate() - .alpha(0f) - .setDuration(300) - .setStartDelay(0) - .setInterpolator(PhoneStatusBar.ALPHA_OUT); - } - - public void hide(boolean animate) { - if (mBar != null) { - // This will indirectly cause show(false, ...) to get called - mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE); - } else { - if (animate) { - startAbortAnimation(); - } else { - setVisibility(View.INVISIBLE); - } - } - } - - @Override - public boolean dispatchHoverEvent(MotionEvent event) { - // Ignore hover events outside of this panel bounds since such events - // generate spurious accessibility events with the panel content when - // tapping outside of it, thus confusing the user. - final int x = (int) event.getX(); - final int y = (int) event.getY(); - if (x >= 0 && x < getWidth() && y >= 0 && y < getHeight()) { - return super.dispatchHoverEvent(event); - } - return true; - } - - /** - * Whether the panel is showing, or, if it's animating, whether it will be - * when the animation is done. - */ - public boolean isShowing() { - return getVisibility() == View.VISIBLE && !mCircle.isAnimatingOut(); - } - - public void setBar(BaseStatusBar bar) { - mBar = bar; - } - - public boolean isAssistantAvailable() { - return ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) - .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null; - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - if (mLaunching || mLaunchPending) { - return false; - } - int action = event.getActionMasked(); - switch (action) { - case MotionEvent.ACTION_DOWN: - mStartTouch = mHorizontal ? event.getX() : event.getY(); - mDragging = false; - mDraggedFarEnough = false; - mCircle.reset(); - break; - case MotionEvent.ACTION_MOVE: - float currentTouch = mHorizontal ? event.getX() : event.getY(); - if (getVisibility() == View.VISIBLE && !mDragging && - (!mCircle.isAnimationRunning(true /* enterAnimation */) - || Math.abs(mStartTouch - currentTouch) > mThreshold)) { - mStartDrag = currentTouch; - mDragging = true; - } - if (mDragging) { - float offset = Math.max(mStartDrag - currentTouch, 0.0f); - mCircle.setDragDistance(offset); - mDraggedFarEnough = Math.abs(mStartTouch - currentTouch) > mThreshold; - mCircle.setDraggedFarEnough(mDraggedFarEnough); - } - break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - if (mDraggedFarEnough) { - if (mCircle.isAnimationRunning(true /* enterAnimation */)) { - mLaunchPending = true; - mCircle.setAnimatingOut(true); - mCircle.performOnAnimationFinished(new Runnable() { - @Override - public void run() { - startExitAnimation(); - } - }); - } else { - startExitAnimation(); - } - } else { - startAbortAnimation(); - } - break; - } - return true; - } - - private void startExitAnimation() { - mLaunchPending = false; - if (mLaunching || getVisibility() != View.VISIBLE) { - return; - } - mLaunching = true; - startAssistActivity(); - vibrate(); - mCircle.setAnimatingOut(true); - mCircle.startExitAnimation(new Runnable() { - @Override - public void run() { - mLaunching = false; - mCircle.setAnimatingOut(false); - setVisibility(View.INVISIBLE); - } - }); - mScrim.animate() - .alpha(0f) - .setDuration(300) - .setStartDelay(0) - .setInterpolator(PhoneStatusBar.ALPHA_OUT); - } - - public void setHorizontal(boolean horizontal) { - mHorizontal = horizontal; - mCircle.setHorizontal(horizontal); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistGestureManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistGestureManager.java new file mode 100644 index 0000000..36be355 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistGestureManager.java @@ -0,0 +1,292 @@ +package com.android.systemui.assist; + +import android.app.ActivityManager; +import android.app.ActivityOptions; +import android.app.SearchManager; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.PixelFormat; +import android.media.AudioAttributes; +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.UserHandle; +import android.os.Vibrator; +import android.provider.Settings; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.ImageView; + +import com.android.internal.app.IVoiceInteractionManagerService; +import com.android.internal.app.IVoiceInteractionSessionShowCallback; +import com.android.systemui.R; +import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.phone.PhoneStatusBar; + +/** + * Class to manage everything around the assist gesture. + */ +public class AssistGestureManager { + + private static final String TAG = "AssistGestureManager"; + private static final String ASSIST_ICON_METADATA_NAME = + "com.android.systemui.action_assist_icon"; + + private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) + .build(); + + private static final long TIMEOUT_SERVICE = 2500; + private static final long TIMEOUT_ACTIVITY = 1000; + + private final Context mContext; + private final WindowManager mWindowManager; + private AssistOrbContainer mView; + private final PhoneStatusBar mBar; + private final IVoiceInteractionManagerService mVoiceInteractionManagerService; + + private IVoiceInteractionSessionShowCallback mShowCallback = + new IVoiceInteractionSessionShowCallback.Stub() { + + @Override + public void onFailed() throws RemoteException { + mView.post(mHideRunnable); + } + + @Override + public void onShown() throws RemoteException { + mView.post(mHideRunnable); + } + }; + + private Runnable mHideRunnable = new Runnable() { + @Override + public void run() { + mView.removeCallbacks(this); + mView.show(false /* show */, true /* animate */); + } + }; + + public AssistGestureManager(PhoneStatusBar bar, Context context) { + mContext = context; + mBar = bar; + mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + mVoiceInteractionManagerService = IVoiceInteractionManagerService.Stub.asInterface( + ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE)); + } + + public void onConfigurationChanged() { + boolean visible = false; + if (mView != null) { + visible = mView.isShowing(); + mWindowManager.removeView(mView); + } + + mView = (AssistOrbContainer) LayoutInflater.from(mContext).inflate( + R.layout.assist_orb, null); + mView.setVisibility(View.GONE); + mView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + WindowManager.LayoutParams lp = getLayoutParams(); + mWindowManager.addView(mView, lp); + mBar.getNavigationBarView().setDelegateView(mView); + if (visible) { + mView.show(true /* show */, false /* animate */); + } + } + + public void onGestureInvoked(boolean vibrate) { + boolean isVoiceInteractorActive = getVoiceInteractorSupportsAssistGesture(); + if (!isVoiceInteractorActive && !isAssistantIntentAvailable()) { + return; + } + if (vibrate) { + vibrate(); + } + if (!isVoiceInteractorActive || !isVoiceSessionRunning()) { + showOrb(); + mView.postDelayed(mHideRunnable, isVoiceInteractorActive + ? TIMEOUT_SERVICE + : TIMEOUT_ACTIVITY); + } + startAssist(); + } + + private WindowManager.LayoutParams getLayoutParams() { + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + mContext.getResources().getDimensionPixelSize(R.dimen.assist_orb_scrim_height), + WindowManager.LayoutParams.TYPE_VOICE_INTERACTION_STARTING, + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT); + if (ActivityManager.isHighEndGfx()) { + lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; + } + lp.gravity = Gravity.BOTTOM | Gravity.START; + lp.setTitle("AssistPreviewPanel"); + lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED + | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; + return lp; + } + + private void showOrb() { + maybeSwapSearchIcon(); + mView.show(true /* show */, true /* animate */); + } + + private void startAssist() { + if (getVoiceInteractorSupportsAssistGesture()) { + startVoiceInteractor(); + } else { + startAssistActivity(); + } + } + + private void startAssistActivity() { + if (!mBar.isDeviceProvisioned()) { + return; + } + + // Close Recent Apps if needed + mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL | + CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL); + + final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, true, UserHandle.USER_CURRENT); + if (intent == null) { + return; + } + + try { + final ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext, + R.anim.search_launch_enter, R.anim.search_launch_exit); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + AsyncTask.execute(new Runnable() { + @Override + public void run() { + mContext.startActivityAsUser(intent, opts.toBundle(), + new UserHandle(UserHandle.USER_CURRENT)); + } + }); + } catch (ActivityNotFoundException e) { + Log.w(TAG, "Activity not found for " + intent.getAction()); + } + } + + private void startVoiceInteractor() { + try { + mVoiceInteractionManagerService.showSessionForActiveService(mShowCallback); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call showSessionForActiveService", e); + } + } + + private boolean getVoiceInteractorSupportsAssistGesture() { + try { + return mVoiceInteractionManagerService.activeServiceSupportsAssistGesture(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call activeServiceSupportsAssistGesture", e); + return false; + } + } + + private ComponentName getVoiceInteractorComponentName() { + try { + return mVoiceInteractionManagerService.getActiveServiceComponentName(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call getActiveServiceComponentName", e); + return null; + } + } + + private boolean isVoiceSessionRunning() { + try { + return mVoiceInteractionManagerService.isSessionRunning(); + } catch (RemoteException e) { + Log.w(TAG, "Failed to call isSessionRunning", e); + return false; + } + } + + public void destroy() { + mWindowManager.removeViewImmediate(mView); + } + + private void maybeSwapSearchIcon() { + Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, false, UserHandle.USER_CURRENT); + ComponentName component = null; + boolean isService = false; + if (getVoiceInteractorSupportsAssistGesture()) { + component = getVoiceInteractorComponentName(); + isService = true; + } else if (intent != null) { + component = intent.getComponent(); + } + if (component != null) { + replaceDrawable(mView.getOrb().getLogo(), component, ASSIST_ICON_METADATA_NAME, + isService); + } else { + mView.getOrb().getLogo().setImageDrawable(null); + } + } + + public void replaceDrawable(ImageView v, ComponentName component, String name, + boolean isService) { + if (component != null) { + try { + PackageManager packageManager = mContext.getPackageManager(); + // Look for the search icon specified in the activity meta-data + Bundle metaData = isService + ? packageManager.getServiceInfo( + component, PackageManager.GET_META_DATA).metaData + : packageManager.getActivityInfo( + component, PackageManager.GET_META_DATA).metaData; + if (metaData != null) { + int iconResId = metaData.getInt(name); + if (iconResId != 0) { + Resources res = packageManager.getResourcesForApplication( + component.getPackageName()); + v.setImageDrawable(res.getDrawable(iconResId)); + return; + } + } + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Failed to swap drawable; " + + component.flattenToShortString() + " not found", e); + } catch (Resources.NotFoundException nfe) { + Log.w(TAG, "Failed to swap drawable from " + + component.flattenToShortString(), nfe); + } + } + v.setImageDrawable(null); + } + + private void vibrate() { + if (Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_ENABLED, 1, UserHandle.USER_CURRENT) != 0) { + Resources res = mContext.getResources(); + Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); + vibrator.vibrate(res.getInteger(R.integer.config_search_panel_view_vibration_duration), + VIBRATION_ATTRIBUTES); + } + } + + public boolean isAssistantIntentAvailable() { + return ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) + .getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistOrbContainer.java b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbContainer.java new file mode 100644 index 0000000..67017db --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbContainer.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.assist; + +import android.annotation.Nullable; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; +import android.widget.FrameLayout; + +import com.android.systemui.R; + +public class AssistOrbContainer extends FrameLayout { + + private static final long EXIT_START_DELAY = 150; + + private final Interpolator mLinearOutSlowInInterpolator; + private final Interpolator mFastOutLinearInInterpolator; + + private View mScrim; + private View mNavbarScrim; + private AssistOrbView mOrb; + + private boolean mAnimatingOut; + + public AssistOrbContainer(Context context) { + this(context, null); + } + + public AssistOrbContainer(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public AssistOrbContainer(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, + android.R.interpolator.linear_out_slow_in); + mFastOutLinearInInterpolator = AnimationUtils.loadInterpolator(context, + android.R.interpolator.fast_out_slow_in); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mScrim = findViewById(R.id.assist_orb_scrim); + mNavbarScrim = findViewById(R.id.assist_orb_navbar_scrim); + mOrb = (AssistOrbView) findViewById(R.id.assist_orb); + } + + public void show(final boolean show, boolean animate) { + if (show) { + if (getVisibility() != View.VISIBLE) { + setVisibility(View.VISIBLE); + if (animate) { + startEnterAnimation(); + } else { + reset(); + } + } + } else { + if (animate) { + startExitAnimation(new Runnable() { + @Override + public void run() { + mAnimatingOut = false; + setVisibility(View.GONE); + } + }); + } else { + setVisibility(View.GONE); + } + } + } + + private void reset() { + mAnimatingOut = false; + mOrb.reset(); + mScrim.setAlpha(1f); + mNavbarScrim.setAlpha(1f); + } + + private void startEnterAnimation() { + if (mAnimatingOut) { + return; + } + mOrb.startEnterAnimation(); + mScrim.setAlpha(0f); + mNavbarScrim.setAlpha(0f); + post(new Runnable() { + @Override + public void run() { + mScrim.animate() + .alpha(1f) + .setDuration(300) + .setStartDelay(0) + .setInterpolator(mLinearOutSlowInInterpolator); + mNavbarScrim.animate() + .alpha(1f) + .setDuration(300) + .setStartDelay(0) + .setInterpolator(mLinearOutSlowInInterpolator); + } + }); + } + + private void startExitAnimation(final Runnable endRunnable) { + if (mAnimatingOut) { + if (endRunnable != null) { + endRunnable.run(); + } + return; + } + mAnimatingOut = true; + mOrb.startExitAnimation(EXIT_START_DELAY); + mScrim.animate() + .alpha(0f) + .setDuration(250) + .setStartDelay(EXIT_START_DELAY) + .setInterpolator(mFastOutLinearInInterpolator); + mNavbarScrim.animate() + .alpha(0f) + .setDuration(250) + .setStartDelay(EXIT_START_DELAY) + .setInterpolator(mFastOutLinearInInterpolator) + .withEndAction(endRunnable); + } + + /** + * Whether the panel is showing, or, if it's animating, whether it will be + * when the animation is done. + */ + public boolean isShowing() { + return getVisibility() == View.VISIBLE && !mAnimatingOut; + } + + public AssistOrbView getOrb() { + return mOrb; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java new file mode 100644 index 0000000..a3372a8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistOrbView.java @@ -0,0 +1,285 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.assist; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Outline; +import android.graphics.Paint; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewOutlineProvider; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; +import android.view.animation.OvershootInterpolator; +import android.widget.FrameLayout; +import android.widget.ImageView; + +import com.android.systemui.R; + +public class AssistOrbView extends FrameLayout { + + private final int mCircleMinSize; + private final int mBaseMargin; + private final int mStaticOffset; + private final Paint mBackgroundPaint = new Paint(); + private final Rect mCircleRect = new Rect(); + private final Rect mStaticRect = new Rect(); + private final Interpolator mAppearInterpolator; + private final Interpolator mDisappearInterpolator; + private final Interpolator mOvershootInterpolator = new OvershootInterpolator(); + + private boolean mClipToOutline; + private final int mMaxElevation; + private float mOutlineAlpha; + private float mOffset; + private float mCircleSize; + private ImageView mLogo; + private float mCircleAnimationEndValue; + + private ValueAnimator mOffsetAnimator; + private ValueAnimator mCircleAnimator; + + private ValueAnimator.AnimatorUpdateListener mCircleUpdateListener + = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + applyCircleSize((float) animation.getAnimatedValue()); + updateElevation(); + } + }; + private AnimatorListenerAdapter mClearAnimatorListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mCircleAnimator = null; + } + }; + private ValueAnimator.AnimatorUpdateListener mOffsetUpdateListener + = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + mOffset = (float) animation.getAnimatedValue(); + updateLayout(); + } + }; + + + public AssistOrbView(Context context) { + this(context, null); + } + + public AssistOrbView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public AssistOrbView(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public AssistOrbView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + if (mCircleSize > 0.0f) { + outline.setOval(mCircleRect); + } else { + outline.setEmpty(); + } + outline.setAlpha(mOutlineAlpha); + } + }); + setWillNotDraw(false); + mCircleMinSize = context.getResources().getDimensionPixelSize( + R.dimen.assist_orb_size); + mBaseMargin = context.getResources().getDimensionPixelSize( + R.dimen.assist_orb_base_margin); + mStaticOffset = context.getResources().getDimensionPixelSize( + R.dimen.assist_orb_travel_distance); + mMaxElevation = context.getResources().getDimensionPixelSize( + R.dimen.assist_orb_elevation); + mAppearInterpolator = AnimationUtils.loadInterpolator(mContext, + android.R.interpolator.linear_out_slow_in); + mDisappearInterpolator = AnimationUtils.loadInterpolator(mContext, + android.R.interpolator.fast_out_linear_in); + mBackgroundPaint.setAntiAlias(true); + mBackgroundPaint.setColor(getResources().getColor(R.color.assist_orb_color)); + } + + public ImageView getLogo() { + return mLogo; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + drawBackground(canvas); + } + + private void drawBackground(Canvas canvas) { + canvas.drawCircle(mCircleRect.centerX(), mCircleRect.centerY(), mCircleSize / 2, + mBackgroundPaint); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mLogo = (ImageView) findViewById(R.id.search_logo); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + mLogo.layout(0, 0, mLogo.getMeasuredWidth(), mLogo.getMeasuredHeight()); + if (changed) { + updateCircleRect(mStaticRect, mStaticOffset, true); + } + } + + public void animateCircleSize(float circleSize, long duration, + long startDelay, Interpolator interpolator) { + if (circleSize == mCircleAnimationEndValue) { + return; + } + if (mCircleAnimator != null) { + mCircleAnimator.cancel(); + } + mCircleAnimator = ValueAnimator.ofFloat(mCircleSize, circleSize); + mCircleAnimator.addUpdateListener(mCircleUpdateListener); + mCircleAnimator.addListener(mClearAnimatorListener); + mCircleAnimator.setInterpolator(interpolator); + mCircleAnimator.setDuration(duration); + mCircleAnimator.setStartDelay(startDelay); + mCircleAnimator.start(); + mCircleAnimationEndValue = circleSize; + } + + private void applyCircleSize(float circleSize) { + mCircleSize = circleSize; + updateLayout(); + } + + private void updateElevation() { + float t = (mStaticOffset - mOffset) / (float) mStaticOffset; + t = 1.0f - Math.max(t, 0.0f); + float offset = t * mMaxElevation; + setElevation(offset); + } + + /** + * Animates the offset to the edge of the screen. + * + * @param offset The offset to apply. + * @param startDelay The desired start delay if animated. + * + * @param interpolator The desired interpolator if animated. If null, + * a default interpolator will be taken designed for appearing or + * disappearing. + */ + private void animateOffset(float offset, long duration, long startDelay, + Interpolator interpolator) { + if (mOffsetAnimator != null) { + mOffsetAnimator.removeAllListeners(); + mOffsetAnimator.cancel(); + } + mOffsetAnimator = ValueAnimator.ofFloat(mOffset, offset); + mOffsetAnimator.addUpdateListener(mOffsetUpdateListener); + mOffsetAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mOffsetAnimator = null; + } + }); + mOffsetAnimator.setInterpolator(interpolator); + mOffsetAnimator.setStartDelay(startDelay); + mOffsetAnimator.setDuration(duration); + mOffsetAnimator.start(); + } + + private void updateLayout() { + updateCircleRect(); + updateLogo(); + invalidateOutline(); + invalidate(); + updateClipping(); + } + + private void updateClipping() { + boolean clip = mCircleSize < mCircleMinSize; + if (clip != mClipToOutline) { + setClipToOutline(clip); + mClipToOutline = clip; + } + } + + private void updateLogo() { + float translationX = (mCircleRect.left + mCircleRect.right) / 2.0f - mLogo.getWidth() / 2.0f; + float translationY = (mCircleRect.top + mCircleRect.bottom) / 2.0f + - mLogo.getHeight() / 2.0f - mCircleMinSize / 7f; + float t = (mStaticOffset - mOffset) / (float) mStaticOffset; + translationY += t * mStaticOffset * 0.1f; + float alpha = 1.0f-t; + alpha = Math.max((alpha - 0.5f) * 2.0f, 0); + mLogo.setImageAlpha((int) (alpha * 255)); + mLogo.setTranslationX(translationX); + mLogo.setTranslationY(translationY); + } + + private void updateCircleRect() { + updateCircleRect(mCircleRect, mOffset, false); + } + + private void updateCircleRect(Rect rect, float offset, boolean useStaticSize) { + int left, top; + float circleSize = useStaticSize ? mCircleMinSize : mCircleSize; + left = (int) (getWidth() - circleSize) / 2; + top = (int) (getHeight() - circleSize / 2 - mBaseMargin - offset); + rect.set(left, top, (int) (left + circleSize), (int) (top + circleSize)); + } + + public void startExitAnimation(long delay) { + animateCircleSize(0, 200, delay, mDisappearInterpolator); + animateOffset(0, 200, delay, mDisappearInterpolator); + } + + public void startEnterAnimation() { + applyCircleSize(0); + post(new Runnable() { + @Override + public void run() { + animateCircleSize(mCircleMinSize, 300, 0 /* delay */, mOvershootInterpolator); + animateOffset(mStaticOffset, 400, 0 /* delay */, mAppearInterpolator); + } + }); + } + + public void reset() { + mClipToOutline = false; + mBackgroundPaint.setAlpha(255); + mOutlineAlpha = 1.0f; + } + + @Override + public boolean hasOverlappingRendering() { + // not really true but it's ok during an animation, as it's never permanent + return false; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index dd28734..b828e78 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -171,6 +171,11 @@ public class KeyguardViewMediator extends SystemUI { */ private static final String KEYGUARD_ANALYTICS_SETTING = "keyguard_analytics"; + /** + * How much faster we collapse the lockscreen when authenticating with fingerprint. + */ + private static final float FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR = 1.3f; + /** The stream type that the lock sounds are tied to. */ private int mUiSoundsStreamType; @@ -441,7 +446,8 @@ public class KeyguardViewMediator extends SystemUI { if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mViewMediatorCallback.keyguardDone(true); } else { - mStatusBarKeyguardViewManager.animateCollapsePanels(); + mStatusBarKeyguardViewManager.animateCollapsePanels( + FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR); } }; @@ -505,6 +511,11 @@ public class KeyguardViewMediator extends SystemUI { public boolean isInputRestricted() { return KeyguardViewMediator.this.isInputRestricted(); } + + @Override + public boolean isScreenOn() { + return mScreenOn; + } }; public void userActivity() { @@ -748,6 +759,11 @@ public class KeyguardViewMediator extends SystemUI { synchronized (this) { if (DEBUG) Log.d(TAG, "setKeyguardEnabled(" + enabled + ")"); + if (isSecure()) { + Log.d(TAG, "current mode is SecurityMode, ignore hide keyguard"); + return; + } + mExternallyEnabled = enabled; if (!enabled && mShowing) { @@ -862,6 +878,12 @@ public class KeyguardViewMediator extends SystemUI { */ private void handleSetOccluded(boolean isOccluded) { synchronized (KeyguardViewMediator.this) { + if (mHiding && isOccluded) { + // We're in the process of going away but WindowManager wants to show a + // SHOW_WHEN_LOCKED activity instead. + startKeyguardExitAnimation(0, 0); + } + if (mOccluded != isOccluded) { mOccluded = isOccluded; mStatusBarKeyguardViewManager.setOccluded(isOccluded); @@ -1371,9 +1393,14 @@ public class KeyguardViewMediator extends SystemUI { updateActivityLockScreenState(); adjustStatusBarLocked(); sendUserPresentBroadcast(); + maybeStopListeningForFingerprint(); } } + private void maybeStopListeningForFingerprint() { + mUpdateMonitor.stopListeningForFingerprint(); + } + private void adjustStatusBarLocked() { if (mStatusBarManager == null) { mStatusBarManager = (StatusBarManager) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index 1790a4e..5a84db5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -18,6 +18,7 @@ package com.android.systemui.qs; import android.content.Context; import android.content.Intent; +import android.graphics.drawable.Animatable; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.os.Handler; @@ -325,7 +326,7 @@ public abstract class QSTile<TState extends State> implements Listenable { public static class ResourceIcon extends Icon { private static final SparseArray<Icon> ICONS = new SparseArray<Icon>(); - private final int mResId; + protected final int mResId; private ResourceIcon(int resId) { mResId = resId; @@ -342,7 +343,11 @@ public abstract class QSTile<TState extends State> implements Listenable { @Override public Drawable getDrawable(Context context) { - return context.getDrawable(mResId); + Drawable d = context.getDrawable(mResId); + if (d instanceof Animatable) { + ((Animatable) d).start(); + } + return d; } @Override @@ -370,7 +375,7 @@ public abstract class QSTile<TState extends State> implements Listenable { @Override public Drawable getDrawable(Context context) { // workaround: get a clean state for every new AVD - final AnimatedVectorDrawable d = (AnimatedVectorDrawable) super.getDrawable(context) + final AnimatedVectorDrawable d = (AnimatedVectorDrawable) context.getDrawable(mResId) .getConstantState().newDrawable(); d.start(); if (mAllowAnimation) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java index ec83ca7..af9d3a5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java @@ -38,6 +38,7 @@ import android.widget.TextView; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; +import com.android.systemui.qs.QSTile.AnimationIcon; import com.android.systemui.qs.QSTile.State; import java.util.Objects; @@ -315,8 +316,9 @@ public class QSTileView extends ViewGroup { iv.setImageDrawable(d); iv.setTag(R.id.qs_icon_tag, state.icon); if (d instanceof Animatable) { - if (!iv.isShown()) { - ((Animatable) d).stop(); // skip directly to end state + Animatable a = (Animatable) d; + if (state.icon instanceof AnimationIcon && !iv.isShown()) { + a.stop(); // skip directly to end state } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java index e60aa53..f36019b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java +++ b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.Listenable; @@ -32,14 +33,15 @@ public class UsageTracker implements Listenable { private final Context mContext; private final long mTimeToShowTile; - private final String mPrefKey; + @Prefs.Key private final String mPrefKey; private final String mResetAction; private boolean mRegistered; - public UsageTracker(Context context, Class<?> tile, int timeoutResource) { + public UsageTracker(Context context, @Prefs.Key String prefKey, Class<?> tile, + int timeoutResource) { mContext = context; - mPrefKey = tile.getSimpleName() + "LastUsed"; + mPrefKey = prefKey; mTimeToShowTile = MILLIS_PER_DAY * mContext.getResources().getInteger(timeoutResource); mResetAction = "com.android.systemui.qs." + tile.getSimpleName() + ".usage_reset"; } @@ -56,16 +58,16 @@ public class UsageTracker implements Listenable { } public boolean isRecentlyUsed() { - long lastUsed = getSharedPrefs().getLong(mPrefKey, 0); + long lastUsed = Prefs.getLong(mContext, mPrefKey, 0L /* defaultValue */); return (System.currentTimeMillis() - lastUsed) < mTimeToShowTile; } public void trackUsage() { - getSharedPrefs().edit().putLong(mPrefKey, System.currentTimeMillis()).commit(); + Prefs.putLong(mContext, mPrefKey, System.currentTimeMillis()); } public void reset() { - getSharedPrefs().edit().remove(mPrefKey).commit(); + Prefs.remove(mContext, mPrefKey); } public void showResetConfirmation(String title, final Runnable onConfirmed) { @@ -87,10 +89,6 @@ public class UsageTracker implements Listenable { d.show(); } - private SharedPreferences getSharedPrefs() { - return mContext.getSharedPreferences(mContext.getPackageName(), 0); - } - private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index 2dd02a5..2bc31fc 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -72,7 +72,7 @@ public class AirplaneModeTile extends QSTile<QSTile.BooleanState> { final boolean airplaneMode = value != 0; state.value = airplaneMode; state.visible = true; - state.label = mContext.getString(R.string.quick_settings_airplane_mode_label); + state.label = mContext.getString(R.string.airplane_mode); if (airplaneMode) { state.icon = mEnable; state.contentDescription = mContext.getString( diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java index 5963a45..4a33f55 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java @@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles; import android.provider.Settings.Secure; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.qs.SecureSetting; @@ -50,7 +51,8 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> { } } }; - mUsageTracker = new UsageTracker(host.getContext(), ColorInversionTile.class, + mUsageTracker = new UsageTracker(host.getContext(), + Prefs.Key.COLOR_INVERSION_TILE_LAST_USED, ColorInversionTile.class, R.integer.days_to_show_color_inversion_tile); if (mSetting.getValue() != 0 && !mUsageTracker.isRecentlyUsed()) { mUsageTracker.trackUsage(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index 79600f5..6ce63d6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.provider.Settings; import android.provider.Settings.Global; import android.view.LayoutInflater; @@ -28,6 +29,7 @@ import android.view.View; import android.view.View.OnAttachStateChangeListener; import android.view.ViewGroup; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.ZenModeController; @@ -39,30 +41,35 @@ public class DndTile extends QSTile<QSTile.BooleanState> { private static final String ACTION_SET_VISIBLE = "com.android.systemui.dndtile.SET_VISIBLE"; private static final String EXTRA_VISIBLE = "visible"; - private static final String PREF_KEY_VISIBLE = "DndTileVisible"; private final ZenModeController mController; private final DndDetailAdapter mDetailAdapter; private boolean mListening; - private boolean mVisible; private boolean mShowingDetail; public DndTile(Host host) { super(host); mController = host.getZenModeController(); mDetailAdapter = new DndDetailAdapter(); - mVisible = getSharedPrefs(mContext).getBoolean(PREF_KEY_VISIBLE, false); mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_SET_VISIBLE)); } public static void setVisible(Context context, boolean visible) { - context.sendBroadcast(new Intent(DndTile.ACTION_SET_VISIBLE) - .putExtra(DndTile.EXTRA_VISIBLE, visible)); + Prefs.putBoolean(context, Prefs.Key.DND_TILE_VISIBLE, visible); } public static boolean isVisible(Context context) { - return getSharedPrefs(context).getBoolean(PREF_KEY_VISIBLE, false); + return Prefs.getBoolean(context, Prefs.Key.DND_TILE_VISIBLE, false /* defaultValue */); + } + + public static void setCombinedIcon(Context context, boolean combined) { + Prefs.putBoolean(context, Prefs.Key.DND_TILE_COMBINED_ICON, combined); + } + + public static boolean isCombinedIcon(Context context) { + return Prefs.getBoolean(context, Prefs.Key.DND_TILE_COMBINED_ICON, + false /* defaultValue */); } @Override @@ -78,9 +85,9 @@ public class DndTile extends QSTile<QSTile.BooleanState> { @Override public void handleClick() { if (mState.value) { - mController.setZen(Global.ZEN_MODE_OFF); + mController.setZen(Global.ZEN_MODE_OFF, null, TAG); } else { - mController.setZen(Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); + mController.setZen(Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, TAG); showDetail(true); } } @@ -89,7 +96,7 @@ public class DndTile extends QSTile<QSTile.BooleanState> { protected void handleUpdateState(BooleanState state, Object arg) { final int zen = arg instanceof Integer ? (Integer) arg : mController.getZen(); state.value = zen != Global.ZEN_MODE_OFF; - state.visible = mVisible; + state.visible = isVisible(mContext); switch (zen) { case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: state.icon = ResourceIcon.get(R.drawable.ic_qs_dnd_on); @@ -103,6 +110,12 @@ public class DndTile extends QSTile<QSTile.BooleanState> { state.contentDescription = mContext.getString( R.string.accessibility_quick_settings_dnd_none_on); break; + case Global.ZEN_MODE_ALARMS: + state.icon = ResourceIcon.get(R.drawable.ic_qs_dnd_on); + state.label = mContext.getString(R.string.quick_settings_dnd_alarms_label); + state.contentDescription = mContext.getString( + R.string.accessibility_quick_settings_dnd_alarms_on); + break; default: state.icon = ResourceIcon.get(R.drawable.ic_qs_dnd_off); state.label = mContext.getString(R.string.quick_settings_dnd_label); @@ -130,26 +143,36 @@ public class DndTile extends QSTile<QSTile.BooleanState> { mListening = listening; if (mListening) { mController.addCallback(mZenCallback); + Prefs.registerListener(mContext, mPrefListener); } else { mController.removeCallback(mZenCallback); + Prefs.unregisterListener(mContext, mPrefListener); } } + private final OnSharedPreferenceChangeListener mPrefListener + = new OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, + @Prefs.Key String key) { + if (Prefs.Key.DND_TILE_COMBINED_ICON.equals(key) || + Prefs.Key.DND_TILE_VISIBLE.equals(key)) { + refreshState(); + } + } + }; + private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() { public void onZenChanged(int zen) { refreshState(zen); } }; - private static SharedPreferences getSharedPrefs(Context context) { - return context.getSharedPreferences(context.getPackageName(), 0); - } - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - mVisible = intent.getBooleanExtra(EXTRA_VISIBLE, false); - getSharedPrefs(mContext).edit().putBoolean(PREF_KEY_VISIBLE, mVisible).commit(); + final boolean visible = intent.getBooleanExtra(EXTRA_VISIBLE, false); + setVisible(mContext, visible); refreshState(); } }; @@ -174,7 +197,7 @@ public class DndTile extends QSTile<QSTile.BooleanState> { @Override public void setToggleState(boolean state) { if (!state) { - mController.setZen(Global.ZEN_MODE_OFF); + mController.setZen(Global.ZEN_MODE_OFF, null, TAG); showDetail(false); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index fcc517f..6063f80 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.qs.UsageTracker; import com.android.systemui.qs.QSTile; @@ -105,7 +106,8 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { } private static UsageTracker newUsageTracker(Context context) { - return new UsageTracker(context, HotspotTile.class, R.integer.days_to_show_hotspot_tile); + return new UsageTracker(context, Prefs.Key.HOTSPOT_TILE_LAST_USED, HotspotTile.class, + R.integer.days_to_show_hotspot_tile); } private final class Callback implements HotspotController.Callback { diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java index 192acc6..c7f8919 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java @@ -59,8 +59,6 @@ public class Constants { public static class Values { public static class App { public static int AppWidgetHostId = 1024; - public static String Key_SearchAppWidgetId = "searchAppWidgetId"; - public static String Key_DebugModeEnabled = "debugModeEnabled"; public static String DebugModeVersion = "A"; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index f014f09..1001feb 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -19,14 +19,12 @@ package com.android.systemui.recents; import android.app.Activity; import android.app.ActivityOptions; import android.app.SearchManager; -import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProviderInfo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.SharedPreferences; import android.os.Bundle; import android.os.SystemClock; import android.os.UserHandle; @@ -36,6 +34,7 @@ import android.view.View; import android.view.ViewStub; import android.widget.Toast; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.recents.misc.DebugTrigger; import com.android.systemui.recents.misc.ReferenceCountedTrigger; @@ -49,8 +48,6 @@ import com.android.systemui.recents.views.DebugOverlayView; import com.android.systemui.recents.views.RecentsView; import com.android.systemui.recents.views.SystemBarScrimViews; import com.android.systemui.recents.views.ViewAnimation; -import com.android.systemui.statusbar.phone.PhoneStatusBar; -import com.android.systemui.SystemUIApplication; import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; @@ -78,9 +75,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView RecentsResizeTaskDialog mResizeTaskDebugDialog; // Search AppWidget - RecentsAppWidgetHost mAppWidgetHost; AppWidgetProviderInfo mSearchAppWidgetInfo; - AppWidgetHostView mSearchAppWidgetHostView; + RecentsAppWidgetHost mAppWidgetHost; + RecentsAppWidgetHostView mSearchAppWidgetHostView; // Runnables to finish the Recents activity FinishRecentsRunnable mFinishLaunchHomeRunnable; @@ -245,7 +242,7 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView if (mEmptyView != null) { mEmptyView.setVisibility(View.GONE); } - if (mRecentsView.hasSearchBar()) { + if (mRecentsView.hasValidSearchBar()) { mRecentsView.setSearchBarVisibility(View.VISIBLE); } else { addSearchBarAppWidgetView(); @@ -295,8 +292,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView if (Constants.DebugFlags.App.EnableSearchLayout) { int appWidgetId = mConfig.searchBarAppWidgetId; if (appWidgetId >= 0) { - mSearchAppWidgetHostView = mAppWidgetHost.createView(this, appWidgetId, - mSearchAppWidgetInfo); + mSearchAppWidgetHostView = (RecentsAppWidgetHostView) mAppWidgetHost.createView( + this, appWidgetId, mSearchAppWidgetInfo); Bundle opts = new Bundle(); opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX); @@ -345,6 +342,12 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } } + /** Dismisses Recents directly to Home without transition animation. */ + void dismissRecentsToHomeWithoutTransitionAnimation() { + finish(); + overridePendingTransition(0, 0); + } + /** Dismisses Recents directly to Home if we currently aren't transitioning. */ boolean dismissRecentsToHome(boolean animated) { SystemServicesProxy ssp = RecentsTaskLoader.getInstance().getSystemServicesProxy(); @@ -563,10 +566,9 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView /** Called when debug mode is triggered */ public void onDebugModeTriggered() { if (mConfig.developerOptionsEnabled) { - SharedPreferences settings = getSharedPreferences(getPackageName(), 0); - if (settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false)) { + if (Prefs.getBoolean(this, Prefs.Key.DEBUG_MODE_ENABLED, false /* boolean */)) { // Disable the debug mode - settings.edit().remove(Constants.Values.App.Key_DebugModeEnabled).apply(); + Prefs.remove(this, Prefs.Key.DEBUG_MODE_ENABLED); mConfig.debugModeEnabled = false; inflateDebugOverlay(); if (mDebugOverlay != null) { @@ -574,7 +576,7 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } } else { // Enable the debug mode - settings.edit().putBoolean(Constants.Values.App.Key_DebugModeEnabled, true).apply(); + Prefs.putBoolean(this, Prefs.Key.DEBUG_MODE_ENABLED, true); mConfig.debugModeEnabled = true; inflateDebugOverlay(); if (mDebugOverlay != null) { diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java index 5bae37a..02a7b94 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java @@ -17,6 +17,7 @@ package com.android.systemui.recents; import android.appwidget.AppWidgetHost; +import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import com.android.systemui.recents.misc.SystemServicesProxy; @@ -61,6 +62,12 @@ public class RecentsAppWidgetHost extends AppWidgetHost { } @Override + protected AppWidgetHostView onCreateView(Context context, int appWidgetId, + AppWidgetProviderInfo appWidget) { + return new RecentsAppWidgetHostView(context); + } + + @Override protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidgetInfo) { if (mCb == null) return; diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHostView.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHostView.java new file mode 100644 index 0000000..1ed755a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHostView.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.recents; + +import android.appwidget.AppWidgetHostView; +import android.content.Context; +import android.widget.RemoteViews; + +public class RecentsAppWidgetHostView extends AppWidgetHostView { + + private Context mContext; + private int mPreviousOrientation; + + public RecentsAppWidgetHostView(Context context) { + super(context); + mContext = context; + } + + @Override + public void updateAppWidget(RemoteViews remoteViews) { + // Store the orientation in which the widget was inflated + updateLastInflationOrientation(); + super.updateAppWidget(remoteViews); + } + + /** + * Updates the last orientation that this widget was inflated. + */ + private void updateLastInflationOrientation() { + mPreviousOrientation = mContext.getResources().getConfiguration().orientation; + } + + /** + * @return whether the search widget was updated while Recents was in a different orientation + * in the background. + */ + public boolean isReinflateRequired() { + // Re-inflate is required if the orientation has changed since last inflated. + int orientation = mContext.getResources().getConfiguration().orientation; + if (mPreviousOrientation != orientation) { + return true; + } + return false; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java index abeb2b0..244fada 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java @@ -18,7 +18,6 @@ package com.android.systemui.recents; import android.app.ActivityManager; import android.content.Context; -import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Rect; @@ -26,6 +25,8 @@ import android.provider.Settings; import android.util.DisplayMetrics; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; + +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.recents.misc.Console; import com.android.systemui.recents.misc.SystemServicesProxy; @@ -177,12 +178,12 @@ public class RecentsConfiguration { /** Updates the state, given the specified context */ void update(Context context) { - SharedPreferences settings = context.getSharedPreferences(context.getPackageName(), 0); Resources res = context.getResources(); DisplayMetrics dm = res.getDisplayMetrics(); // Debug mode - debugModeEnabled = settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false); + debugModeEnabled = Prefs.getBoolean(context, Prefs.Key.DEBUG_MODE_ENABLED, + false /* defaultValue */); if (debugModeEnabled) { Console.Enabled = true; } @@ -206,7 +207,8 @@ public class RecentsConfiguration { // Search Bar searchBarSpaceHeightPx = res.getDimensionPixelSize(R.dimen.recents_search_bar_space_height); - searchBarAppWidgetId = settings.getInt(Constants.Values.App.Key_SearchAppWidgetId, -1); + searchBarAppWidgetId = Prefs.getInt(context, Prefs.Key.SEARCH_APP_WIDGET_ID, + -1 /* defaultValue */); // Task stack taskStackScrollDuration = @@ -280,9 +282,7 @@ public class RecentsConfiguration { /** Updates the search bar app widget */ public void updateSearchBarAppWidgetId(Context context, int appWidgetId) { searchBarAppWidgetId = appWidgetId; - SharedPreferences settings = context.getSharedPreferences(context.getPackageName(), 0); - settings.edit().putInt(Constants.Values.App.Key_SearchAppWidgetId, - appWidgetId).apply(); + Prefs.putInt(context, Prefs.Key.SEARCH_APP_WIDGET_ID, appWidgetId); } /** Updates the states that need to be re-read whenever we re-initialize. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsResizeTaskDialog.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsResizeTaskDialog.java index 4cd577d..b701e0b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsResizeTaskDialog.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsResizeTaskDialog.java @@ -209,6 +209,10 @@ public class RecentsResizeTaskDialog extends DialogFragment { } } + // Get rid of the dialog. + dismiss(); + mRecentsActivity.dismissRecentsToHomeWithoutTransitionAnimation(); + // Resize all tasks beginning from the "oldest" one. for (int i = additionalTasks; i >= 0; --i) { if (mTasks[i] != null) { @@ -216,12 +220,8 @@ public class RecentsResizeTaskDialog extends DialogFragment { } } - // Get rid of the dialog. - dismiss(); - mRecentsActivity.dismissRecentsToHomeRaw(false); - - // Show tasks - beginning with the oldest so that the focus ends on the selected one. - // TODO: Remove this once issue b/19893373 is resolved. + // Show tasks as they might not be currently visible - beginning with the oldest so that + // the focus ends on the selected one. for (int i = additionalTasks; i >= 0; --i) { if (mTasks[i] != null) { mRecentsView.launchTask(mTasks[i]); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index abed7a5..1377975 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -34,6 +34,7 @@ import android.view.WindowInsets; import android.widget.FrameLayout; import com.android.systemui.R; import com.android.systemui.recents.Constants; +import com.android.systemui.recents.RecentsAppWidgetHostView; import com.android.systemui.recents.RecentsConfiguration; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.model.RecentsPackageMonitor; @@ -69,7 +70,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV ArrayList<TaskStack> mStacks; List<TaskStackView> mTaskStackViews = new ArrayList<>(); - View mSearchBar; + RecentsAppWidgetHostView mSearchBar; RecentsViewCallbacks mCb; public RecentsView(Context context) { @@ -278,7 +279,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } /** Adds the search bar */ - public void setSearchBar(View searchBar) { + public void setSearchBar(RecentsAppWidgetHostView searchBar) { // Create the search bar (and hide it if we have no recent tasks) if (Constants.DebugFlags.App.EnableSearchLayout) { // Remove the previous search bar if one exists @@ -294,8 +295,8 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } /** Returns whether there is currently a search bar */ - public boolean hasSearchBar() { - return mSearchBar != null; + public boolean hasValidSearchBar() { + return mSearchBar != null && !mSearchBar.isReinflateRequired(); } /** Sets the visibility of the search bar */ diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 9d349ab..105bf0f 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -122,7 +122,7 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi // Prepare all the output metadata mImageTime = System.currentTimeMillis(); - String imageDate = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date(mImageTime)); + String imageDate = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date(mImageTime)); mImageFileName = String.format(SCREENSHOT_FILE_NAME_TEMPLATE, imageDate); mScreenshotDir = new File(Environment.getExternalStoragePublicDirectory( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 55bdcac..de4874f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -71,7 +71,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; import android.view.ViewParent; import android.view.WindowManager; import android.view.WindowManagerGlobal; @@ -79,9 +78,9 @@ import android.view.accessibility.AccessibilityManager; import android.view.animation.AnimationUtils; import android.widget.DateTimeView; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.RemoteViews; import android.widget.TextView; +import android.widget.Toast; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.StatusBarIcon; @@ -90,7 +89,6 @@ import com.android.internal.util.NotificationColorUtil; import com.android.internal.widget.LockPatternUtils; import com.android.systemui.R; import com.android.systemui.RecentsComponent; -import com.android.systemui.SearchPanelView; import com.android.systemui.SwipeHelper; import com.android.systemui.SystemUI; import com.android.systemui.recents.Recents; @@ -98,7 +96,7 @@ import com.android.systemui.statusbar.NotificationData.Entry; import com.android.systemui.statusbar.phone.NavigationBarView; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; -import com.android.systemui.statusbar.policy.HeadsUpNotificationView; +import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.PreviewInflater; import com.android.systemui.statusbar.policy.RemoteInputView; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; @@ -132,10 +130,6 @@ public abstract class BaseStatusBar extends SystemUI implements protected static final int MSG_CANCEL_PRELOAD_RECENT_APPS = 1023; protected static final int MSG_SHOW_NEXT_AFFILIATED_TASK = 1024; protected static final int MSG_SHOW_PREV_AFFILIATED_TASK = 1025; - protected static final int MSG_CLOSE_SEARCH_PANEL = 1027; - protected static final int MSG_SHOW_HEADS_UP = 1028; - protected static final int MSG_HIDE_HEADS_UP = 1029; - protected static final int MSG_ESCALATE_HEADS_UP = 1030; protected static final boolean ENABLE_HEADS_UP = true; // scores above this threshold should be displayed in heads up mode. @@ -161,11 +155,7 @@ public abstract class BaseStatusBar extends SystemUI implements protected NotificationGroupManager mGroupManager = new NotificationGroupManager(); // for heads up notifications - protected HeadsUpNotificationView mHeadsUpNotificationView; - protected int mHeadsUpNotificationDecay; - - // Search panel - protected SearchPanelView mSearchPanelView; + protected HeadsUpManager mHeadsUpManager; protected int mCurrentUserId = 0; final protected SparseArray<UserInfo> mCurrentProfiles = new SparseArray<UserInfo>(); @@ -385,6 +375,23 @@ public abstract class BaseStatusBar extends SystemUI implements userSwitched(mCurrentUserId); } else if (Intent.ACTION_USER_ADDED.equals(action)) { updateCurrentProfilesCache(); + } else if (Intent.ACTION_USER_PRESENT.equals(action)) { + List<ActivityManager.RecentTaskInfo> recentTask = null; + try { + recentTask = ActivityManagerNative.getDefault().getRecentTasks(1, + ActivityManager.RECENT_WITH_EXCLUDED + | ActivityManager.RECENT_INCLUDE_PROFILES, + mCurrentUserId); + } catch (RemoteException e) { + // Abandon hope activity manager not running. + } + if (recentTask != null && recentTask.size() > 0) { + UserInfo user = mUserManager.getUserInfo(recentTask.get(0).userId); + if (user != null && user.isManagedProfile()) { + Toast.makeText(mContext, R.string.managed_profile_foreground_toast, + Toast.LENGTH_SHORT).show(); + } + } } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED.equals( action)) { mUsersAllowingPrivateNotifications.clear(); @@ -435,9 +442,8 @@ public abstract class BaseStatusBar extends SystemUI implements @Override public void run() { processForRemoteInput(sbn.getNotification()); - Notification n = sbn.getNotification(); - boolean isUpdate = mNotificationData.get(sbn.getKey()) != null - || isHeadsUp(sbn.getKey()); + String key = sbn.getKey(); + boolean isUpdate = mNotificationData.get(key) != null; // In case we don't allow child notifications, we ignore children of // notifications that have a summary, since we're not going to show them @@ -451,7 +457,7 @@ public abstract class BaseStatusBar extends SystemUI implements // Remove existing notification to avoid stale data. if (isUpdate) { - removeNotification(sbn.getKey(), rankingMap); + removeNotification(key, rankingMap); } else { mNotificationData.updateRanking(rankingMap); } @@ -619,6 +625,7 @@ public abstract class BaseStatusBar extends SystemUI implements IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_USER_ADDED); + filter.addAction(Intent.ACTION_USER_PRESENT); filter.addAction(BANNER_ACTION_CANCEL); filter.addAction(BANNER_ACTION_SETUP); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); @@ -680,15 +687,7 @@ public abstract class BaseStatusBar extends SystemUI implements setHeadsUpUser(newUserId); } - private void setHeadsUpUser(int newUserId) { - if (mHeadsUpNotificationView != null) { - mHeadsUpNotificationView.setUser(newUserId); - } - } - - public boolean isHeadsUp(String key) { - return mHeadsUpNotificationView != null && mHeadsUpNotificationView.isShowing(key); - } + protected abstract void setHeadsUpUser(int newUserId); @Override // NotificationData.Environment public boolean isNotificationForCurrentProfiles(StatusBarNotification n) { @@ -746,8 +745,7 @@ public abstract class BaseStatusBar extends SystemUI implements protected View updateNotificationVetoButton(View row, StatusBarNotification n) { View vetoButton = row.findViewById(R.id.veto); - if (n.isClearable() || (mHeadsUpNotificationView.getEntry() != null - && mHeadsUpNotificationView.getEntry().row == row)) { + if (n.isClearable()) { final String _pkg = n.getPackageName(); final String _tag = n.getTag(); final int _id = n.getId(); @@ -990,9 +988,6 @@ public abstract class BaseStatusBar extends SystemUI implements } } - public void onHeadsUpDismissed() { - } - @Override public void showRecentApps(boolean triggeredFromAltTab) { int msg = MSG_SHOW_RECENT_APPS; @@ -1043,50 +1038,6 @@ public abstract class BaseStatusBar extends SystemUI implements mHandler.sendEmptyMessage(msg); } - @Override - public void showSearchPanel() { - if (mSearchPanelView != null && mSearchPanelView.isAssistantAvailable()) { - mSearchPanelView.show(true, true); - } - } - - @Override - public void hideSearchPanel() { - int msg = MSG_CLOSE_SEARCH_PANEL; - mHandler.removeMessages(msg); - mHandler.sendEmptyMessage(msg); - } - - protected abstract WindowManager.LayoutParams getSearchLayoutParams( - LayoutParams layoutParams); - - protected void updateSearchPanel() { - // Search Panel - boolean visible = false; - if (mSearchPanelView != null) { - visible = mSearchPanelView.isShowing(); - mWindowManager.removeView(mSearchPanelView); - } - - // Provide SearchPanel with a temporary parent to allow layout params to work. - LinearLayout tmpRoot = new LinearLayout(mContext); - mSearchPanelView = (SearchPanelView) LayoutInflater.from(mContext).inflate( - R.layout.status_bar_search_panel, tmpRoot, false); - mSearchPanelView.setOnTouchListener( - new TouchOutsideListener(MSG_CLOSE_SEARCH_PANEL, mSearchPanelView)); - mSearchPanelView.setVisibility(View.GONE); - boolean vertical = mNavigationBarView != null && mNavigationBarView.isVertical(); - mSearchPanelView.setHorizontal(vertical); - - WindowManager.LayoutParams lp = getSearchLayoutParams(mSearchPanelView.getLayoutParams()); - - mWindowManager.addView(mSearchPanelView, lp); - mSearchPanelView.setBar(this); - if (visible) { - mSearchPanelView.show(true, false); - } - } - protected H createHandler() { return new H(); } @@ -1173,13 +1124,10 @@ public abstract class BaseStatusBar extends SystemUI implements // Do nothing } - public abstract void scheduleHeadsUpDecay(long delay); - - public abstract void scheduleHeadsUpOpen(); - - public abstract void scheduleHeadsUpClose(); - - public abstract void scheduleHeadsUpEscalation(); + /** + * if the interrupting notification had a fullscreen intent, fire it now. + */ + public abstract void escalateHeadsUp(); /** * Save the current "public" (locked and secure) state of the lockscreen. @@ -1263,50 +1211,14 @@ public abstract class BaseStatusBar extends SystemUI implements case MSG_SHOW_PREV_AFFILIATED_TASK: showRecentsPreviousAffiliatedTask(); break; - case MSG_CLOSE_SEARCH_PANEL: - if (DEBUG) Log.d(TAG, "closing search panel"); - if (mSearchPanelView != null && mSearchPanelView.isShowing()) { - mSearchPanelView.show(false, true); - } - break; } } } - public class TouchOutsideListener implements View.OnTouchListener { - private int mMsg; - private StatusBarPanel mPanel; - - public TouchOutsideListener(int msg, StatusBarPanel panel) { - mMsg = msg; - mPanel = panel; - } - - public boolean onTouch(View v, MotionEvent ev) { - final int action = ev.getAction(); - if (action == MotionEvent.ACTION_OUTSIDE - || (action == MotionEvent.ACTION_DOWN - && !mPanel.isInContentArea((int)ev.getX(), (int)ev.getY()))) { - mHandler.removeMessages(mMsg); - mHandler.sendEmptyMessage(mMsg); - return true; - } - return false; - } - } - protected void workAroundBadLayerDrawableOpacity(View v) { } - protected boolean inflateViews(NotificationData.Entry entry, ViewGroup parent) { - return inflateViews(entry, parent, false); - } - - protected boolean inflateViewsForHeadsUp(NotificationData.Entry entry, ViewGroup parent) { - return inflateViews(entry, parent, true); - } - - private boolean inflateViews(NotificationData.Entry entry, ViewGroup parent, boolean isHeadsUp) { + protected boolean inflateViews(Entry entry, ViewGroup parent) { PackageManager pmUser = getPackageManagerForUser( entry.notification.getUser().getIdentifier()); @@ -1314,12 +1226,7 @@ public abstract class BaseStatusBar extends SystemUI implements final StatusBarNotification sbn = entry.notification; RemoteViews contentView = sbn.getNotification().contentView; RemoteViews bigContentView = sbn.getNotification().bigContentView; - - if (isHeadsUp) { - maxHeight = - mContext.getResources().getDimensionPixelSize(R.dimen.notification_mid_height); - bigContentView = sbn.getNotification().headsUpContentView; - } + RemoteViews headsUpContentView = sbn.getNotification().headsUpContentView; if (contentView == null) { return false; @@ -1344,7 +1251,6 @@ public abstract class BaseStatusBar extends SystemUI implements hasUserChangedExpansion = row.hasUserChangedExpansion(); userExpanded = row.isUserExpanded(); userLocked = row.isUserLocked(); - entry.row.setHeadsUp(isHeadsUp); entry.reset(); if (hasUserChangedExpansion) { row.setUserExpanded(userExpanded); @@ -1367,10 +1273,8 @@ public abstract class BaseStatusBar extends SystemUI implements // NB: the large icon is now handled entirely by the template // bind the click event to the content area - NotificationContentView expanded = - (NotificationContentView) row.findViewById(R.id.expanded); - NotificationContentView expandedPublic = - (NotificationContentView) row.findViewById(R.id.expandedPublic); + NotificationContentView contentContainer = row.getPrivateLayout(); + NotificationContentView contentContainerPublic = row.getPublicLayout(); row.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); if (ENABLE_REMOTE_INPUT) { @@ -1388,11 +1292,16 @@ public abstract class BaseStatusBar extends SystemUI implements // set up the adaptive layout View contentViewLocal = null; View bigContentViewLocal = null; + View headsUpContentViewLocal = null; try { - contentViewLocal = contentView.apply(mContext, expanded, + contentViewLocal = contentView.apply(mContext, contentContainer, mOnClickHandler); if (bigContentView != null) { - bigContentViewLocal = bigContentView.apply(mContext, expanded, + bigContentViewLocal = bigContentView.apply(mContext, contentContainer, + mOnClickHandler); + } + if (headsUpContentView != null) { + headsUpContentViewLocal = headsUpContentView.apply(mContext, contentContainer, mOnClickHandler); } } @@ -1404,23 +1313,27 @@ public abstract class BaseStatusBar extends SystemUI implements if (contentViewLocal != null) { contentViewLocal.setIsRootNamespace(true); - expanded.setContractedChild(contentViewLocal); + contentContainer.setContractedChild(contentViewLocal); } if (bigContentViewLocal != null) { bigContentViewLocal.setIsRootNamespace(true); - expanded.setExpandedChild(bigContentViewLocal); + contentContainer.setExpandedChild(bigContentViewLocal); + } + if (headsUpContentViewLocal != null) { + headsUpContentViewLocal.setIsRootNamespace(true); + contentContainer.setHeadsUpChild(headsUpContentViewLocal); } // now the public version View publicViewLocal = null; if (publicNotification != null) { try { - publicViewLocal = publicNotification.contentView.apply(mContext, expandedPublic, + publicViewLocal = publicNotification.contentView.apply(mContext, contentContainerPublic, mOnClickHandler); if (publicViewLocal != null) { publicViewLocal.setIsRootNamespace(true); - expandedPublic.setContractedChild(publicViewLocal); + contentContainerPublic.setContractedChild(publicViewLocal); } } catch (RuntimeException e) { @@ -1442,9 +1355,9 @@ public abstract class BaseStatusBar extends SystemUI implements // Add a basic notification template publicViewLocal = LayoutInflater.from(mContext).inflate( R.layout.notification_public_default, - expandedPublic, false); + contentContainerPublic, false); publicViewLocal.setIsRootNamespace(true); - expandedPublic.setContractedChild(publicViewLocal); + contentContainerPublic.setContractedChild(publicViewLocal); final TextView title = (TextView) publicViewLocal.findViewById(R.id.title); try { @@ -1580,13 +1493,8 @@ public abstract class BaseStatusBar extends SystemUI implements stripped.contentView = null; stripped.extras.putBoolean("android.rebuild.bigView", true); stripped.bigContentView = null; - - // Don't create the HUN input view for now because input doesn't work there yet. - // TODO: Enable once HUNs can take remote input correctly. - if (false) { - stripped.extras.putBoolean("android.rebuild.hudView", true); - stripped.headsUpContentView = null; - } + stripped.extras.putBoolean("android.rebuild.hudView", true); + stripped.headsUpContentView = null; Notification rebuilt = Notification.Builder.rebuild(mContext, stripped); @@ -1618,16 +1526,23 @@ public abstract class BaseStatusBar extends SystemUI implements } // See if we have somewhere to put that remote input - ViewGroup actionContainer = null; - if (remoteInput != null && entry.expandedBig != null) { - View actionContainerCandidate = entry.expandedBig - .findViewById(com.android.internal.R.id.actions); - if (actionContainerCandidate instanceof ViewGroup) { - actionContainer = (ViewGroup) actionContainerCandidate; + if (remoteInput != null) { + if (entry.expandedBig != null) { + inflateRemoteInput(entry.expandedBig, remoteInput, actions); + } + View headsUpChild = entry.row.getPrivateLayout().getHeadsUpChild(); + if (headsUpChild != null) { + inflateRemoteInput(headsUpChild, remoteInput, actions); } } - if (actionContainer != null) { + } + + private void inflateRemoteInput(View view, RemoteInput remoteInput, + Notification.Action[] actions) { + View actionContainerCandidate = view.findViewById(com.android.internal.R.id.actions); + if (actionContainerCandidate instanceof ViewGroup) { + ViewGroup actionContainer = (ViewGroup) actionContainerCandidate; actionContainer.removeAllViews(); actionContainer.addView( RemoteInputView.inflate(mContext, actionContainer, actions[0], remoteInput)); @@ -1657,12 +1572,12 @@ public abstract class BaseStatusBar extends SystemUI implements mCurrentUserId); dismissKeyguardThenExecute(new OnDismissAction() { public boolean onDismiss() { - if (mNotificationKey.equals(mHeadsUpNotificationView.getKey())) { + if (mHeadsUpManager != null && mHeadsUpManager.isHeadsUp(mNotificationKey)) { // Release the HUN notification to the shade. // // In most cases, when FLAG_AUTO_CANCEL is set, the notification will // become canceled shortly by NoMan, but we can't assume that. - mHeadsUpNotificationView.releaseImmediately(); + mHeadsUpManager.releaseImmediately(mNotificationKey); } new Thread() { @Override @@ -1707,7 +1622,7 @@ public abstract class BaseStatusBar extends SystemUI implements // close the shade if it was open animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, - true /* force */); + true /* force */, true /* delayed */); visibilityChanged(false); return mIntent != null && mIntent.isActivity(); @@ -1719,6 +1634,9 @@ public abstract class BaseStatusBar extends SystemUI implements public void animateCollapsePanels(int flags, boolean force) { } + public void animateCollapsePanels(int flags, boolean force, boolean delayed) { + } + public void overrideActivityPendingAppTransition(boolean keyguardShowing) { if (keyguardShowing) { try { @@ -1935,7 +1853,7 @@ public abstract class BaseStatusBar extends SystemUI implements protected abstract void setAreThereNotifications(); protected abstract void updateNotifications(); - protected abstract boolean shouldDisableNavbarGestures(); + public abstract boolean shouldDisableNavbarGestures(); public abstract void addNotification(StatusBarNotification notification, RankingMap ranking, Entry oldEntry); @@ -1946,90 +1864,28 @@ public abstract class BaseStatusBar extends SystemUI implements if (DEBUG) Log.d(TAG, "updateNotification(" + notification + ")"); final String key = notification.getKey(); - boolean wasHeadsUp = isHeadsUp(key); - Entry oldEntry; - if (wasHeadsUp) { - oldEntry = mHeadsUpNotificationView.getEntry(); - } else { - oldEntry = mNotificationData.get(key); - } - if (oldEntry == null) { + Entry entry = mNotificationData.get(key); + if (entry == null) { return; } - final StatusBarNotification oldNotification = oldEntry.notification; - - // XXX: modify when we do something more intelligent with the two content views - final RemoteViews oldContentView = oldNotification.getNotification().contentView; Notification n = notification.getNotification(); - final RemoteViews contentView = n.contentView; - final RemoteViews oldBigContentView = oldNotification.getNotification().bigContentView; - final RemoteViews bigContentView = n.bigContentView; - final RemoteViews oldHeadsUpContentView = oldNotification.getNotification().headsUpContentView; - final RemoteViews headsUpContentView = n.headsUpContentView; - final Notification oldPublicNotification = oldNotification.getNotification().publicVersion; - final RemoteViews oldPublicContentView = oldPublicNotification != null - ? oldPublicNotification.contentView : null; - final Notification publicNotification = n.publicVersion; - final RemoteViews publicContentView = publicNotification != null - ? publicNotification.contentView : null; - if (DEBUG) { - Log.d(TAG, "old notification: when=" + oldNotification.getNotification().when - + " ongoing=" + oldNotification.isOngoing() - + " expanded=" + oldEntry.expanded - + " contentView=" + oldContentView - + " bigContentView=" + oldBigContentView - + " publicView=" + oldPublicContentView - + " rowParent=" + oldEntry.row.getParent()); - Log.d(TAG, "new notification: when=" + n.when - + " ongoing=" + oldNotification.isOngoing() - + " contentView=" + contentView - + " bigContentView=" + bigContentView - + " publicView=" + publicContentView); - } - - // Can we just reapply the RemoteViews in place? - - // 1U is never null - boolean contentsUnchanged = oldEntry.expanded != null - && contentView.getPackage() != null - && oldContentView.getPackage() != null - && oldContentView.getPackage().equals(contentView.getPackage()) - && oldContentView.getLayoutId() == contentView.getLayoutId(); - // large view may be null - boolean bigContentsUnchanged = - (oldEntry.getBigContentView() == null && bigContentView == null) - || ((oldEntry.getBigContentView() != null && bigContentView != null) - && bigContentView.getPackage() != null - && oldBigContentView.getPackage() != null - && oldBigContentView.getPackage().equals(bigContentView.getPackage()) - && oldBigContentView.getLayoutId() == bigContentView.getLayoutId()); - boolean headsUpContentsUnchanged = - (oldHeadsUpContentView == null && headsUpContentView == null) - || ((oldHeadsUpContentView != null && headsUpContentView != null) - && headsUpContentView.getPackage() != null - && oldHeadsUpContentView.getPackage() != null - && oldHeadsUpContentView.getPackage().equals(headsUpContentView.getPackage()) - && oldHeadsUpContentView.getLayoutId() == headsUpContentView.getLayoutId()); - boolean publicUnchanged = - (oldPublicContentView == null && publicContentView == null) - || ((oldPublicContentView != null && publicContentView != null) - && publicContentView.getPackage() != null - && oldPublicContentView.getPackage() != null - && oldPublicContentView.getPackage().equals(publicContentView.getPackage()) - && oldPublicContentView.getLayoutId() == publicContentView.getLayoutId()); - + logUpdate(entry, n); + } + boolean applyInPlace = shouldApplyInPlace(entry, n); final boolean shouldInterrupt = shouldInterrupt(notification); - final boolean alertAgain = shouldInterrupt && alertAgain(oldEntry, n); + final boolean alertAgain = alertAgain(entry, n); + + entry.notification = notification; + mGroupManager.onEntryUpdated(entry, entry.notification); + boolean updateSuccessful = false; - if (contentsUnchanged && bigContentsUnchanged && headsUpContentsUnchanged - && publicUnchanged) { + if (applyInPlace) { + // We can just reapply the notifications in place if (DEBUG) Log.d(TAG, "reusing notification for key: " + key); - oldEntry.notification = notification; - mGroupManager.onEntryUpdated(oldEntry, oldNotification); try { - if (oldEntry.icon != null) { + if (entry.icon != null) { // Update the icon final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), notification.getUser(), @@ -2037,88 +1893,39 @@ public abstract class BaseStatusBar extends SystemUI implements n.iconLevel, n.number, n.tickerText); - oldEntry.icon.setNotification(n); - if (!oldEntry.icon.set(ic)) { + entry.icon.setNotification(n); + if (!entry.icon.set(ic)) { handleNotificationError(notification, "Couldn't update icon: " + ic); return; } } - - if (wasHeadsUp) { - // Release may hang on to the views for a bit, so we should always update them. - updateHeadsUpViews(oldEntry, notification); - mHeadsUpNotificationView.updateNotification(oldEntry, alertAgain); - if (!shouldInterrupt) { - // we updated the notification above, so release to build a new shade entry - mHeadsUpNotificationView.release(); - return; - } - } else { - if (shouldInterrupt && alertAgain) { - mStackScroller.setRemoveAnimationEnabled(false); - removeNotificationViews(key, ranking); - mStackScroller.setRemoveAnimationEnabled(true); - addNotification(notification, ranking, oldEntry); //this will pop the headsup - } else { - updateNotificationViews(oldEntry, notification); - } - } - mNotificationData.updateRanking(ranking); - updateNotifications(); + updateNotificationViews(entry, notification); updateSuccessful = true; } catch (RuntimeException e) { // It failed to add cleanly. Log, and remove the view from the panel. - Log.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e); + Log.w(TAG, "Couldn't reapply views for package " + n.contentView.getPackage(), e); } } if (!updateSuccessful) { if (DEBUG) Log.d(TAG, "not reusing notification for key: " + key); - if (wasHeadsUp) { - if (DEBUG) Log.d(TAG, "rebuilding heads up for key: " + key); - ViewGroup holder = mHeadsUpNotificationView.getHolder(); - if (inflateViewsForHeadsUp(oldEntry, holder)) { - mHeadsUpNotificationView.updateNotification(oldEntry, alertAgain); - } else { - Log.w(TAG, "Couldn't create new updated headsup for package " - + contentView.getPackage()); - } - if (!shouldInterrupt) { - if (DEBUG) Log.d(TAG, "releasing heads up for key: " + key); - oldEntry.notification = notification; - mGroupManager.onEntryUpdated(oldEntry, oldNotification); - mHeadsUpNotificationView.release(); - return; - } - } else { - if (shouldInterrupt && alertAgain) { - if (DEBUG) Log.d(TAG, "reposting to invoke heads up for key: " + key); - mStackScroller.setRemoveAnimationEnabled(false); - removeNotificationViews(key, ranking); - mStackScroller.setRemoveAnimationEnabled(true); - addNotification(notification, ranking, oldEntry); //this will pop the headsup - } else { - if (DEBUG) Log.d(TAG, "rebuilding update in place for key: " + key); - oldEntry.notification = notification; - mGroupManager.onEntryUpdated(oldEntry, oldNotification); - final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), - notification.getUser(), - n.icon, - n.iconLevel, - n.number, - n.tickerText); - oldEntry.icon.setNotification(n); - oldEntry.icon.set(ic); - inflateViews(oldEntry, mStackScroller, wasHeadsUp); - mNotificationData.updateRanking(ranking); - updateNotifications(); - } - } + final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), + notification.getUser(), + n.icon, + n.iconLevel, + n.number, + n.tickerText); + entry.icon.setNotification(n); + entry.icon.set(ic); + inflateViews(entry, mStackScroller); } + updateHeadsUp(key, entry, shouldInterrupt, alertAgain); + mNotificationData.updateRanking(ranking); + updateNotifications(); // Update the veto button accordingly (and as a result, whether this row is // swipe-dismissable) - updateNotificationVetoButton(oldEntry.row, notification); + updateNotificationVetoButton(entry.row, notification); // Is this for you? boolean isForCurrentUser = isNotificationForCurrentProfiles(notification); @@ -2128,22 +1935,79 @@ public abstract class BaseStatusBar extends SystemUI implements setAreThereNotifications(); } - private void updateNotificationViews(NotificationData.Entry entry, - StatusBarNotification notification) { - updateNotificationViews(entry, notification, false); + protected abstract void updateHeadsUp(String key, Entry entry, boolean shouldInterrupt, + boolean alertAgain); + + private void logUpdate(Entry oldEntry, Notification n) { + StatusBarNotification oldNotification = oldEntry.notification; + Log.d(TAG, "old notification: when=" + oldNotification.getNotification().when + + " ongoing=" + oldNotification.isOngoing() + + " expanded=" + oldEntry.expanded + + " contentView=" + oldNotification.getNotification().contentView + + " bigContentView=" + oldNotification.getNotification().bigContentView + + " publicView=" + oldNotification.getNotification().publicVersion + + " rowParent=" + oldEntry.row.getParent()); + Log.d(TAG, "new notification: when=" + n.when + + " ongoing=" + oldNotification.isOngoing() + + " contentView=" + n.contentView + + " bigContentView=" + n.bigContentView + + " publicView=" + n.publicVersion); } - private void updateHeadsUpViews(NotificationData.Entry entry, - StatusBarNotification notification) { - updateNotificationViews(entry, notification, true); + /** + * @return whether we can just reapply the RemoteViews in place when it is updated + */ + private boolean shouldApplyInPlace(Entry entry, Notification n) { + StatusBarNotification oldNotification = entry.notification; + // XXX: modify when we do something more intelligent with the two content views + final RemoteViews oldContentView = oldNotification.getNotification().contentView; + final RemoteViews contentView = n.contentView; + final RemoteViews oldBigContentView = oldNotification.getNotification().bigContentView; + final RemoteViews bigContentView = n.bigContentView; + final RemoteViews oldHeadsUpContentView + = oldNotification.getNotification().headsUpContentView; + final RemoteViews headsUpContentView = n.headsUpContentView; + final Notification oldPublicNotification = oldNotification.getNotification().publicVersion; + final RemoteViews oldPublicContentView = oldPublicNotification != null + ? oldPublicNotification.contentView : null; + final Notification publicNotification = n.publicVersion; + final RemoteViews publicContentView = publicNotification != null + ? publicNotification.contentView : null; + boolean contentsUnchanged = entry.expanded != null + && contentView.getPackage() != null + && oldContentView.getPackage() != null + && oldContentView.getPackage().equals(contentView.getPackage()) + && oldContentView.getLayoutId() == contentView.getLayoutId(); + // large view may be null + boolean bigContentsUnchanged = + (entry.getBigContentView() == null && bigContentView == null) + || ((entry.getBigContentView() != null && bigContentView != null) + && bigContentView.getPackage() != null + && oldBigContentView.getPackage() != null + && oldBigContentView.getPackage().equals(bigContentView.getPackage()) + && oldBigContentView.getLayoutId() == bigContentView.getLayoutId()); + boolean headsUpContentsUnchanged = + (oldHeadsUpContentView == null && headsUpContentView == null) + || ((oldHeadsUpContentView != null && headsUpContentView != null) + && headsUpContentView.getPackage() != null + && oldHeadsUpContentView.getPackage() != null + && oldHeadsUpContentView.getPackage().equals(headsUpContentView.getPackage()) + && oldHeadsUpContentView.getLayoutId() == headsUpContentView.getLayoutId()); + boolean publicUnchanged = + (oldPublicContentView == null && publicContentView == null) + || ((oldPublicContentView != null && publicContentView != null) + && publicContentView.getPackage() != null + && oldPublicContentView.getPackage() != null + && oldPublicContentView.getPackage().equals(publicContentView.getPackage()) + && oldPublicContentView.getLayoutId() == publicContentView.getLayoutId()); + return contentsUnchanged && bigContentsUnchanged && headsUpContentsUnchanged + && publicUnchanged; } - private void updateNotificationViews(NotificationData.Entry entry, - StatusBarNotification notification, boolean isHeadsUp) { + private void updateNotificationViews(Entry entry, StatusBarNotification notification) { final RemoteViews contentView = notification.getNotification().contentView; - final RemoteViews bigContentView = isHeadsUp - ? notification.getNotification().headsUpContentView - : notification.getNotification().bigContentView; + final RemoteViews bigContentView = notification.getNotification().bigContentView; + final RemoteViews headsUpContentView = notification.getNotification().headsUpContentView; final Notification publicVersion = notification.getNotification().publicVersion; final RemoteViews publicContentView = publicVersion != null ? publicVersion.contentView : null; @@ -2154,6 +2018,10 @@ public abstract class BaseStatusBar extends SystemUI implements bigContentView.reapply(mContext, entry.getBigContentView(), mOnClickHandler); } + View headsUpChild = entry.row.getPrivateLayout().getHeadsUpChild(); + if (headsUpContentView != null && headsUpChild != null) { + headsUpContentView.reapply(mContext, headsUpChild, mOnClickHandler); + } if (publicContentView != null && entry.getPublicContentView() != null) { publicContentView.reapply(mContext, entry.getPublicContentView(), mOnClickHandler); } @@ -2172,10 +2040,8 @@ public abstract class BaseStatusBar extends SystemUI implements applyRemoteInput(entry); } - protected void notifyHeadsUpScreenOn(boolean screenOn) { - if (!screenOn) { - scheduleHeadsUpEscalation(); - } + protected void notifyHeadsUpScreenOff() { + escalateHeadsUp(); } private boolean alertAgain(Entry oldEntry, Notification newNotification) { @@ -2191,7 +2057,7 @@ public abstract class BaseStatusBar extends SystemUI implements return false; } - if (mHeadsUpNotificationView.isSnoozed(sbn.getPackageName())) { + if (isSnoozedPackage(sbn)) { return false; } @@ -2225,6 +2091,8 @@ public abstract class BaseStatusBar extends SystemUI implements return interrupt; } + protected abstract boolean isSnoozedPackage(StatusBarNotification sbn); + public void setInteracting(int barWindow, boolean interacting) { // hook for subclasses } @@ -2241,9 +2109,6 @@ public abstract class BaseStatusBar extends SystemUI implements } public void destroy() { - if (mSearchPanelView != null) { - mWindowManager.removeViewImmediate(mSearchPanelView); - } mContext.unregisterReceiver(mBroadcastReceiver); try { mNotificationListener.unregisterAsSystemService(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 8f88e73..7aa9a90 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -96,8 +96,6 @@ public class CommandQueue extends IStatusBar.Stub { public void toggleRecentApps(); public void preloadRecentApps(); public void cancelPreloadRecentApps(); - public void showSearchPanel(); - public void hideSearchPanel(); public void setWindowState(int window, int state); public void buzzBeepBlinked(); public void notificationLightOff(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java index 7ae6764..9e2207e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java @@ -22,11 +22,12 @@ import android.graphics.RectF; import android.view.MotionEvent; import android.view.View; import com.android.systemui.R; +import com.android.systemui.statusbar.phone.PhoneStatusBar; public class DelegateViewHelper { private View mDelegateView; private View mSourceView; - private BaseStatusBar mBar; + private PhoneStatusBar mBar; private int[] mTempPoint = new int[2]; private float[] mDownPoint = new float[2]; private float mTriggerThreshhold; @@ -45,7 +46,7 @@ public class DelegateViewHelper { mDelegateView = view; } - public void setBar(BaseStatusBar phoneStatusBar) { + public void setBar(PhoneStatusBar phoneStatusBar) { mBar = phoneStatusBar; } @@ -79,7 +80,7 @@ public class DelegateViewHelper { float y = k < historySize ? event.getHistoricalY(k) : event.getY(); final float distance = mSwapXY ? (mDownPoint[0] - x) : (mDownPoint[1] - y); if (distance > mTriggerThreshhold) { - mBar.showSearchPanel(); + mBar.invokeAssistGesture(false /* vibrate */); mPanelShowing = true; break; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 06a174e..cb8217e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -62,7 +62,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { private boolean mShowingPublic; private boolean mSensitive; private boolean mShowingPublicInitialized; - private boolean mShowingPublicForIntrinsicHeight; + private boolean mHideSensitiveForIntrinsicHeight; /** * Is this notification expanded by the system. The expansion state can be overridden by the @@ -78,13 +78,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { private NotificationContentView mPublicLayout; private NotificationContentView mPrivateLayout; private int mMaxExpandHeight; + private int mHeadsUpHeight; private View mVetoButton; private boolean mClearable; private ExpansionLogger mLogger; private String mLoggingKey; private boolean mWasReset; - private NotificationGuts mGuts; + private NotificationGuts mGuts; private StatusBarNotification mStatusBarNotification; private boolean mIsHeadsUp; private View mExpandButton; @@ -108,6 +109,15 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { !mChildrenExpanded); } }; + private boolean mInShade; + + public NotificationContentView getPrivateLayout() { + return mPrivateLayout; + } + + public NotificationContentView getPublicLayout() { + return mPublicLayout; + } public void setIconAnimationRunning(boolean running) { setIconAnimationRunning(running, mPublicLayout); @@ -118,8 +128,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { if (layout != null) { View contractedChild = layout.getContractedChild(); View expandedChild = layout.getExpandedChild(); + View headsUpChild = layout.getHeadsUpChild(); setIconAnimationRunningForChild(running, contractedChild); setIconAnimationRunningForChild(running, expandedChild); + setIconAnimationRunningForChild(running, headsUpChild); } } @@ -164,8 +176,17 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { return mStatusBarNotification; } + public boolean isHeadsUp() { + return mIsHeadsUp; + } + public void setHeadsUp(boolean isHeadsUp) { + int intrinsicBefore = getIntrinsicHeight(); mIsHeadsUp = isHeadsUp; + mPrivateLayout.setHeadsUp(isHeadsUp); + if (intrinsicBefore != getIntrinsicHeight()) { + notifyHeightChanged(false /* needsAnimation */); + } } public void setGroupManager(NotificationGroupManager groupManager) { @@ -263,6 +284,18 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { return realActualHeight; } + public void setInShade(boolean inShade) { + mInShade = inShade; + } + + public boolean isInShade() { + return mInShade; + } + + public int getHeadsUpHeight() { + return mHeadsUpHeight; + } + public interface ExpansionLogger { public void logNotificationExpansion(String key, boolean userAction, boolean expanded); } @@ -299,6 +332,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { resetActualHeight(); } mMaxExpandHeight = 0; + mHeadsUpHeight = 0; mWasReset = true; onHeightReset(); requestLayout(); @@ -536,7 +570,15 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } boolean inExpansionState = isExpanded(); int maxContentHeight; - if ((!inExpansionState && !mChildrenExpanded) || mShowingPublicForIntrinsicHeight) { + if (mSensitive && mHideSensitiveForIntrinsicHeight) { + return mRowMinHeight; + } else if (mIsHeadsUp) { + if (inExpansionState) { + maxContentHeight = Math.max(mMaxExpandHeight, mHeadsUpHeight); + } else { + maxContentHeight = Math.max(mRowMinHeight, mHeadsUpHeight); + } + } else if ((!inExpansionState && !mChildrenExpanded)) { maxContentHeight = mRowMinHeight; } else if (mChildrenExpanded) { maxContentHeight = mChildrenContainer.getIntrinsicHeight(); @@ -583,7 +625,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); boolean updateExpandHeight = mMaxExpandHeight == 0 && !mWasReset; - updateMaxExpandHeight(); + updateMaxHeights(); if (updateExpandHeight) { applyExpansionToLayout(); } @@ -599,9 +641,18 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { return super.isChildInvisible(child) || isInvisibleChildContainer; } - private void updateMaxExpandHeight() { + private void updateMaxHeights() { int intrinsicBefore = getIntrinsicHeight(); - mMaxExpandHeight = mPrivateLayout.getMaxHeight(); + View expandedChild = mPrivateLayout.getExpandedChild(); + if (expandedChild == null) { + expandedChild = mPrivateLayout.getContractedChild(); + } + mMaxExpandHeight = expandedChild.getHeight(); + View headsUpChild = mPrivateLayout.getHeadsUpChild(); + if (headsUpChild == null) { + headsUpChild = mPrivateLayout.getContractedChild(); + } + mHeadsUpHeight = headsUpChild.getHeight(); if (intrinsicBefore != getIntrinsicHeight()) { notifyHeightChanged(false /* needsAnimation */); } @@ -612,7 +663,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } public void setHideSensitiveForIntrinsicHeight(boolean hideSensitive) { - mShowingPublicForIntrinsicHeight = mSensitive && hideSensitive; + mHideSensitiveForIntrinsicHeight = hideSensitive; } public void setHideSensitive(boolean hideSensitive, boolean animated, long delay, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index 7ae0d6d..e632cc8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -118,6 +118,7 @@ public abstract class ExpandableView extends FrameLayout { setContentHeight(initialHeight); } } + updateClipping(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java index e2464c2..583184f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java @@ -34,6 +34,7 @@ import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.widget.ImageView; import com.android.systemui.R; +import com.android.systemui.statusbar.phone.KeyguardAffordanceHelper; /** * An ImageView which does not have overlapping renderings commands and therefore does not need a @@ -75,6 +76,7 @@ public class KeyguardAffordanceView extends ImageView { private float mCircleStartRadius; private float mMaxCircleSize; private Animator mPreviewClipper; + private float mRestingAlpha = KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT; private AnimatorListenerAdapter mClipEndListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { @@ -394,6 +396,17 @@ public class KeyguardAffordanceView extends ImageView { } } + public void setRestingAlpha(float alpha) { + mRestingAlpha = alpha; + + // TODO: Handle the case an animation is playing. + setImageAlpha(alpha, false); + } + + public float getRestingAlpha() { + return mRestingAlpha; + } + public void setImageAlpha(float alpha, boolean animate) { setImageAlpha(alpha, animate, -1, null, null); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 58067c3..07a055c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -26,6 +26,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.graphics.Color; import android.os.BatteryManager; import android.os.BatteryStats; import android.os.Handler; @@ -53,6 +54,7 @@ public class KeyguardIndicationController { private String mRestingIndication; private String mTransientIndication; + private int mTransientTextColor; private boolean mVisible; private boolean mPowerPluggedIn; @@ -105,7 +107,15 @@ public class KeyguardIndicationController { * Shows {@param transientIndication} until it is hidden by {@link #hideTransientIndication}. */ public void showTransientIndication(String transientIndication) { + showTransientIndication(transientIndication, Color.WHITE); + } + + /** + * Shows {@param transientIndication} until it is hidden by {@link #hideTransientIndication}. + */ + public void showTransientIndication(String transientIndication, int textColor) { mTransientIndication = transientIndication; + mTransientTextColor = textColor; mHandler.removeMessages(MSG_HIDE_TRANSIENT); updateIndication(); } @@ -124,7 +134,15 @@ public class KeyguardIndicationController { private void updateIndication() { if (mVisible) { mTextView.switchIndication(computeIndication()); + mTextView.setTextColor(computeColor()); + } + } + + private int computeColor() { + if (!TextUtils.isEmpty(mTransientIndication)) { + return mTransientTextColor; } + return Color.WHITE; } private String computeIndication() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index 745e75d..964d75f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java @@ -23,10 +23,12 @@ import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; +import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; + import com.android.systemui.R; /** @@ -37,23 +39,28 @@ import com.android.systemui.R; public class NotificationContentView extends FrameLayout { private static final long ANIMATION_DURATION_LENGTH = 170; + private static final int CONTRACTED = 1; + private static final int EXPANDED = 2; + private static final int HEADSUP = 3; private final Rect mClipBounds = new Rect(); private View mContractedChild; private View mExpandedChild; + private View mHeadsUpChild; private NotificationViewWrapper mContractedWrapper; - private int mSmallHeight; + private final int mSmallHeight; + private final int mHeadsUpHeight; private int mClipTopAmount; + private int mContentHeight; private final Interpolator mLinearInterpolator = new LinearInterpolator(); + private int mVisibleView = CONTRACTED; - private boolean mContractedVisible = true; private boolean mDark; - private final Paint mFadePaint = new Paint(); private boolean mAnimate; private ViewTreeObserver.OnPreDrawListener mEnableAnimationPredrawListener @@ -65,14 +72,62 @@ public class NotificationContentView extends FrameLayout { return true; } }; + private boolean mIsHeadsUp; public NotificationContentView(Context context, AttributeSet attrs) { super(context, attrs); mFadePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD)); + mSmallHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height); + mHeadsUpHeight = getResources().getDimensionPixelSize(R.dimen.notification_mid_height); reset(true); } @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + boolean hasFixedHeight = heightMode == MeasureSpec.EXACTLY; + boolean isHeightLimited = heightMode == MeasureSpec.AT_MOST; + int maxSize = Integer.MAX_VALUE; + if (hasFixedHeight || isHeightLimited) { + maxSize = MeasureSpec.getSize(heightMeasureSpec); + } + int maxChildHeight = 0; + if (mContractedChild != null) { + int size = Math.min(maxSize, mSmallHeight); + mContractedChild.measure(widthMeasureSpec, + MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST)); + maxChildHeight = Math.max(maxChildHeight, mContractedChild.getMeasuredHeight()); + } + if (mExpandedChild != null) { + int size = maxSize; + ViewGroup.LayoutParams layoutParams = mExpandedChild.getLayoutParams(); + if (layoutParams.height >= 0) { + // An actual height is set + size = Math.min(maxSize, layoutParams.height); + } + int spec = size == Integer.MAX_VALUE ? + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED) : + MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST); + mExpandedChild.measure(widthMeasureSpec, spec); + maxChildHeight = Math.max(maxChildHeight, mExpandedChild.getMeasuredHeight()); + } + if (mHeadsUpChild != null) { + int size = Math.min(maxSize, mHeadsUpHeight); + ViewGroup.LayoutParams layoutParams = mHeadsUpChild.getLayoutParams(); + if (layoutParams.height >= 0) { + // An actual height is set + size = Math.min(maxSize, layoutParams.height); + } + mHeadsUpChild.measure(widthMeasureSpec, + MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST)); + maxChildHeight = Math.max(maxChildHeight, mHeadsUpChild.getMeasuredHeight()); + } + int ownHeight = Math.min(maxChildHeight, maxSize); + int width = MeasureSpec.getSize(widthMeasureSpec); + setMeasuredDimension(width, ownHeight); + } + + @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); updateClipping(); @@ -91,11 +146,14 @@ public class NotificationContentView extends FrameLayout { if (mExpandedChild != null) { mExpandedChild.animate().cancel(); } + if (mHeadsUpChild != null) { + mHeadsUpChild.animate().cancel(); + } removeAllViews(); mContractedChild = null; mExpandedChild = null; - mSmallHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height); - mContractedVisible = true; + mHeadsUpChild = null; + mVisibleView = CONTRACTED; if (resetActualHeight) { mContentHeight = mSmallHeight; } @@ -109,12 +167,15 @@ public class NotificationContentView extends FrameLayout { return mExpandedChild; } + public View getHeadsUpChild() { + return mHeadsUpChild; + } + public void setContractedChild(View child) { if (mContractedChild != null) { mContractedChild.animate().cancel(); removeView(mContractedChild); } - sanitizeContractedLayoutParams(child); addView(child); mContractedChild = child; mContractedWrapper = NotificationViewWrapper.wrap(getContext(), child); @@ -132,6 +193,16 @@ public class NotificationContentView extends FrameLayout { selectLayout(false /* animate */, true /* force */); } + public void setHeadsUpChild(View child) { + if (mHeadsUpChild != null) { + mHeadsUpChild.animate().cancel(); + removeView(mHeadsUpChild); + } + addView(child); + mHeadsUpChild = child; + selectLayout(false /* animate */, true /* force */); + } + @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); @@ -166,9 +237,12 @@ public class NotificationContentView extends FrameLayout { } public int getMaxHeight() { - - // The maximum height is just the laid out height. - return getHeight(); + if (mIsHeadsUp && mHeadsUpChild != null) { + return mHeadsUpChild.getHeight(); + } else if (mExpandedChild != null) { + return mExpandedChild.getHeight(); + } + return mSmallHeight; } public int getMinHeight() { @@ -185,62 +259,91 @@ public class NotificationContentView extends FrameLayout { setClipBounds(mClipBounds); } - private void sanitizeContractedLayoutParams(View contractedChild) { - LayoutParams lp = (LayoutParams) contractedChild.getLayoutParams(); - lp.height = mSmallHeight; - contractedChild.setLayoutParams(lp); - } - private void selectLayout(boolean animate, boolean force) { if (mContractedChild == null) { return; } - boolean showContractedChild = showContractedChild(); - if (showContractedChild != mContractedVisible || force) { + int visibleView = calculateVisibleView(); + if (visibleView != mVisibleView || force) { if (animate && mExpandedChild != null) { - runSwitchAnimation(showContractedChild); - } else if (mExpandedChild != null) { - mContractedChild.setVisibility(showContractedChild ? View.VISIBLE : View.INVISIBLE); - mContractedChild.setAlpha(showContractedChild ? 1f : 0f); - mExpandedChild.setVisibility(showContractedChild ? View.INVISIBLE : View.VISIBLE); - mExpandedChild.setAlpha(showContractedChild ? 0f : 1f); + runSwitchAnimation(visibleView); + } else { + updateViewVisibilities(visibleView); } + mVisibleView = visibleView; } - mContractedVisible = showContractedChild; } - private void runSwitchAnimation(final boolean showContractedChild) { - mContractedChild.setVisibility(View.VISIBLE); - mExpandedChild.setVisibility(View.VISIBLE); - mContractedChild.setLayerType(LAYER_TYPE_HARDWARE, mFadePaint); - mExpandedChild.setLayerType(LAYER_TYPE_HARDWARE, mFadePaint); + private void updateViewVisibilities(int visibleView) { + boolean contractedVisible = visibleView == CONTRACTED; + mContractedChild.setVisibility(contractedVisible ? View.VISIBLE : View.INVISIBLE); + mContractedChild.setAlpha(contractedVisible ? 1f : 0f); + mContractedChild.setLayerType(LAYER_TYPE_NONE, null); + if (mExpandedChild != null) { + boolean expandedVisible = visibleView == EXPANDED; + mExpandedChild.setVisibility(expandedVisible ? View.VISIBLE : View.INVISIBLE); + mExpandedChild.setAlpha(expandedVisible ? 1f : 0f); + mExpandedChild.setLayerType(LAYER_TYPE_NONE, null); + } + if (mHeadsUpChild != null) { + boolean headsUpVisible = visibleView == HEADSUP; + mHeadsUpChild.setVisibility(headsUpVisible ? View.VISIBLE : View.INVISIBLE); + mHeadsUpChild.setAlpha(headsUpVisible ? 1f : 0f); + mHeadsUpChild.setLayerType(LAYER_TYPE_NONE, null); + } + setLayerType(LAYER_TYPE_NONE, null); + } + + private void runSwitchAnimation(int visibleView) { + View shownView = getViewFromFlag(visibleView); + View hiddenView = getViewFromFlag(mVisibleView); + shownView.setVisibility(View.VISIBLE); + hiddenView.setVisibility(View.VISIBLE); + shownView.setLayerType(LAYER_TYPE_HARDWARE, mFadePaint); + hiddenView.setLayerType(LAYER_TYPE_HARDWARE, mFadePaint); setLayerType(LAYER_TYPE_HARDWARE, null); - mContractedChild.animate() - .alpha(showContractedChild ? 1f : 0f) + hiddenView.animate() + .alpha(0f) .setDuration(ANIMATION_DURATION_LENGTH) - .setInterpolator(mLinearInterpolator); - mExpandedChild.animate() - .alpha(showContractedChild ? 0f : 1f) + .setInterpolator(mLinearInterpolator) + .withEndAction(null); // In case we have multiple changes in one frame. + shownView.animate() + .alpha(1f) .setDuration(ANIMATION_DURATION_LENGTH) .setInterpolator(mLinearInterpolator) .withEndAction(new Runnable() { @Override public void run() { - mContractedChild.setLayerType(LAYER_TYPE_NONE, null); - mExpandedChild.setLayerType(LAYER_TYPE_NONE, null); - setLayerType(LAYER_TYPE_NONE, null); - mContractedChild.setVisibility(showContractedChild - ? View.VISIBLE - : View.INVISIBLE); - mExpandedChild.setVisibility(showContractedChild - ? View.INVISIBLE - : View.VISIBLE); + updateViewVisibilities(mVisibleView); } }); } - private boolean showContractedChild() { - return mContentHeight <= mSmallHeight || mExpandedChild == null; + private View getViewFromFlag(int visibleView) { + switch (visibleView) { + case EXPANDED: + return mExpandedChild; + case HEADSUP: + return mHeadsUpChild; + } + return mContractedChild; + } + + private int calculateVisibleView() { + boolean noExpandedChild = mExpandedChild == null; + if (mIsHeadsUp && mHeadsUpChild != null) { + if (mContentHeight <= mHeadsUpChild.getHeight() || noExpandedChild) { + return HEADSUP; + } else { + return EXPANDED; + } + } else { + if (mContentHeight <= mSmallHeight || noExpandedChild) { + return CONTRACTED; + } else { + return EXPANDED; + } + } } public void notifyContentUpdated() { @@ -261,6 +364,11 @@ public class NotificationContentView extends FrameLayout { mContractedWrapper.setDark(dark, fade, delay); } + public void setHeadsUp(boolean headsUp) { + mIsHeadsUp = headsUp; + selectLayout(false /* animate */, true /* force */); + } + @Override public boolean hasOverlappingRendering() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index 912f414..429889d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -25,6 +25,7 @@ import android.util.ArrayMap; import android.view.View; import com.android.systemui.statusbar.phone.NotificationGroupManager; +import com.android.systemui.statusbar.policy.HeadsUpManager; import java.io.PrintWriter; import java.util.ArrayList; @@ -37,6 +38,7 @@ import java.util.Comparator; public class NotificationData { private final Environment mEnvironment; + private HeadsUpManager mHeadsUpManager; public static final class Entry { public String key; @@ -98,43 +100,47 @@ public class NotificationData { private RankingMap mRankingMap; private final Ranking mTmpRanking = new Ranking(); + public void setHeadsUpManager(HeadsUpManager headsUpManager) { + mHeadsUpManager = headsUpManager; + } + private final Comparator<Entry> mRankingComparator = new Comparator<Entry>() { private final Ranking mRankingA = new Ranking(); private final Ranking mRankingB = new Ranking(); @Override public int compare(Entry a, Entry b) { - // Upsort current media notification. String mediaNotification = mEnvironment.getCurrentMediaNotificationKey(); boolean aMedia = a.key.equals(mediaNotification); boolean bMedia = b.key.equals(mediaNotification); - if (aMedia != bMedia) { - return aMedia ? -1 : 1; - } final StatusBarNotification na = a.notification; final StatusBarNotification nb = b.notification; - // Upsort PRIORITY_MAX system notifications boolean aSystemMax = na.getNotification().priority >= Notification.PRIORITY_MAX && isSystemNotification(na); boolean bSystemMax = nb.getNotification().priority >= Notification.PRIORITY_MAX && isSystemNotification(nb); - if (aSystemMax != bSystemMax) { - return aSystemMax ? -1 : 1; - } + int d = nb.getScore() - na.getScore(); - // RankingMap as received from NoMan. - if (mRankingMap != null) { + boolean isHeadsUp = a.row.isHeadsUp(); + if (isHeadsUp != b.row.isHeadsUp()) { + return isHeadsUp ? -1 : 1; + } else if (isHeadsUp) { + // Provide consistent ranking with headsUpManager + return mHeadsUpManager.compare(a, b); + } else if (aMedia != bMedia) { + // Upsort current media notification. + return aMedia ? -1 : 1; + } else if (aSystemMax != bSystemMax) { + // Upsort PRIORITY_MAX system notifications + return aSystemMax ? -1 : 1; + } else if (mRankingMap != null) { + // RankingMap as received from NoMan mRankingMap.getRanking(a.key, mRankingA); mRankingMap.getRanking(b.key, mRankingB); return mRankingA.getRank() - mRankingB.getRank(); - } - - int d = nb.getScore() - na.getScore(); - if (a.interruption != b.interruption) { - return a.interruption ? -1 : 1; - } else if (d != 0) { + } if (d != 0) { return d; } else { return (int) (nb.getNotification().when - na.getNotification().when); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 7286907..b2bb021 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -20,6 +20,8 @@ import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.PorterDuff; +import android.graphics.drawable.Animatable; +import android.graphics.drawable.Drawable; import android.telephony.SubscriptionInfo; import android.util.AttributeSet; import android.util.Log; @@ -59,9 +61,10 @@ public class SignalClusterView private String mWifiDescription; private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>(); private int mIconTint = Color.WHITE; + private float mDarkIntensity; ViewGroup mWifiGroup; - ImageView mVpn, mWifi, mAirplane, mNoSims; + ImageView mVpn, mWifi, mAirplane, mNoSims, mWifiDark, mNoSimsDark; View mWifiAirplaneSpacer; View mWifiSignalSpacer; LinearLayout mMobileSignalGroup; @@ -115,8 +118,10 @@ public class SignalClusterView mVpn = (ImageView) findViewById(R.id.vpn); mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo); mWifi = (ImageView) findViewById(R.id.wifi_signal); + mWifiDark = (ImageView) findViewById(R.id.wifi_signal_dark); mAirplane = (ImageView) findViewById(R.id.airplane); mNoSims = (ImageView) findViewById(R.id.no_sims); + mNoSimsDark = (ImageView) findViewById(R.id.no_sims_dark); mWifiAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer); mWifiSignalSpacer = findViewById(R.id.wifi_signal_spacer); mMobileSignalGroup = (LinearLayout) findViewById(R.id.mobile_signal_group); @@ -162,12 +167,13 @@ public class SignalClusterView } @Override - public void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon, - String contentDescription, String typeContentDescription, boolean isTypeIconWide, - int subId) { + public void setMobileDataIndicators(boolean visible, int strengthIcon, int darkStrengthIcon, + int typeIcon, String contentDescription, String typeContentDescription, + boolean isTypeIconWide, int subId) { PhoneState state = getOrInflateState(subId); state.mMobileVisible = visible; state.mMobileStrengthId = strengthIcon; + state.mMobileDarkStrengthId = darkStrengthIcon; state.mMobileTypeId = typeIcon; state.mMobileDescription = contentDescription; state.mMobileTypeDescription = typeContentDescription; @@ -273,6 +279,7 @@ public class SignalClusterView if (DEBUG) Log.d(TAG, String.format("vpn: %s", mVpnVisible ? "VISIBLE" : "GONE")); if (mWifiVisible) { mWifi.setImageResource(mWifiStrengthId); + mWifiDark.setImageResource(mWifiStrengthId); mWifiGroup.setContentDescription(mWifiDescription); mWifiGroup.setVisibility(View.VISIBLE); } else { @@ -317,15 +324,17 @@ public class SignalClusterView } mNoSims.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE); + mNoSimsDark.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE); boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode || anyMobileVisible || mVpnVisible; setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0); } - public void setIconTint(int tint) { - boolean changed = tint != mIconTint; + public void setIconTint(int tint, float darkIntensity) { + boolean changed = tint != mIconTint || darkIntensity != mDarkIntensity; mIconTint = tint; + mDarkIntensity = darkIntensity; if (changed && isAttachedToWindow()) { applyIconTint(); } @@ -333,14 +342,19 @@ public class SignalClusterView private void applyIconTint() { setTint(mVpn, mIconTint); - setTint(mWifi, mIconTint); - setTint(mNoSims, mIconTint); setTint(mAirplane, mIconTint); + applyDarkIntensity(mDarkIntensity, mNoSims, mNoSimsDark); + applyDarkIntensity(mDarkIntensity, mWifi, mWifiDark); for (int i = 0; i < mPhoneStates.size(); i++) { - mPhoneStates.get(i).setIconTint(mIconTint); + mPhoneStates.get(i).setIconTint(mIconTint, mDarkIntensity); } } + private void applyDarkIntensity(float darkIntensity, View lightIcon, View darkIcon) { + lightIcon.setAlpha(1 - darkIntensity); + darkIcon.setAlpha(darkIntensity); + } + private void setTint(ImageView v, int tint) { v.setImageTintMode(PorterDuff.Mode.SRC_ATOP); v.setImageTintList(ColorStateList.valueOf(tint)); @@ -349,12 +363,12 @@ public class SignalClusterView private class PhoneState { private final int mSubId; private boolean mMobileVisible = false; - private int mMobileStrengthId = 0, mMobileTypeId = 0; + private int mMobileStrengthId = 0, mMobileDarkStrengthId = 0, mMobileTypeId = 0; private boolean mIsMobileTypeIconWide; private String mMobileDescription, mMobileTypeDescription; private ViewGroup mMobileGroup; - private ImageView mMobile, mMobileType; + private ImageView mMobile, mMobileDark, mMobileType; public PhoneState(int subId, Context context) { ViewGroup root = (ViewGroup) LayoutInflater.from(context) @@ -366,12 +380,30 @@ public class SignalClusterView public void setViews(ViewGroup root) { mMobileGroup = root; mMobile = (ImageView) root.findViewById(R.id.mobile_signal); + mMobileDark = (ImageView) root.findViewById(R.id.mobile_signal_dark); mMobileType = (ImageView) root.findViewById(R.id.mobile_type); } public boolean apply(boolean isSecondaryIcon) { if (mMobileVisible && !mIsAirplaneMode) { mMobile.setImageResource(mMobileStrengthId); + Drawable mobileDrawable = mMobile.getDrawable(); + if (mobileDrawable instanceof Animatable) { + Animatable ad = (Animatable) mobileDrawable; + if (!ad.isRunning()) { + ad.start(); + } + } + + mMobileDark.setImageResource(mMobileStrengthId); + Drawable mobileDarkDrawable = mMobileDark.getDrawable(); + if (mobileDarkDrawable instanceof Animatable) { + Animatable ad = (Animatable) mobileDarkDrawable; + if (!ad.isRunning()) { + ad.start(); + } + } + mMobileType.setImageResource(mMobileTypeId); mMobileGroup.setContentDescription(mMobileTypeDescription + " " + mMobileDescription); @@ -385,9 +417,12 @@ public class SignalClusterView 0, 0, 0); mMobile.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0, 0, 0, 0); + mMobileDark.setPaddingRelative(mIsMobileTypeIconWide ? mWideTypeIconStartPadding : 0, + 0, 0, 0); - if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d typ=%d", - (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId)); + if (DEBUG) Log.d(TAG, String.format("mobile: %s sig=%d dark=%d typ=%d", + (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, + mMobileDarkStrengthId, mMobileTypeId)); mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE); @@ -401,8 +436,8 @@ public class SignalClusterView } } - public void setIconTint(int tint) { - setTint(mMobile, tint); + public void setIconTint(int tint, float darkIntensity) { + applyDarkIntensity(darkIntensity, mMobile, mMobileDark); setTint(mMobileType, tint); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java new file mode 100644 index 0000000..3997807 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpTouchHelper.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import android.content.Context; +import android.view.MotionEvent; +import android.view.ViewConfiguration; + +import com.android.systemui.Gefingerpoken; +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.ExpandableView; +import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; + +/** + * A Helper class to handle touches on the heads-up views + */ +public class HeadsUpTouchHelper implements Gefingerpoken { + + private HeadsUpManager mHeadsUpManager; + private NotificationStackScrollLayout mStackScroller; + private int mTrackingPointer; + private float mTouchSlop; + private float mInitialTouchX; + private float mInitialTouchY; + private boolean mMotionOnHeadsUpView; + private boolean mTrackingHeadsUp; + private boolean mCollapseSnoozes; + private NotificationPanelView mPanel; + private ExpandableNotificationRow mPickedChild; + + public boolean isTrackingHeadsUp() { + return mTrackingHeadsUp; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + if (!mMotionOnHeadsUpView && event.getActionMasked() != MotionEvent.ACTION_DOWN) { + return false; + } + int pointerIndex = event.findPointerIndex(mTrackingPointer); + if (pointerIndex < 0) { + pointerIndex = 0; + mTrackingPointer = event.getPointerId(pointerIndex); + } + final float x = event.getX(pointerIndex); + final float y = event.getY(pointerIndex); + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + mInitialTouchY = y; + mInitialTouchX = x; + setTrackingHeadsUp(false); + ExpandableView child = mStackScroller.getChildAtPosition(x, y); + mMotionOnHeadsUpView = false; + if (child instanceof ExpandableNotificationRow) { + mPickedChild = (ExpandableNotificationRow) child; + mMotionOnHeadsUpView = mPickedChild.isHeadsUp() && !mPickedChild.isInShade(); + } + break; + case MotionEvent.ACTION_POINTER_UP: + final int upPointer = event.getPointerId(event.getActionIndex()); + if (mTrackingPointer == upPointer) { + // gesture is ongoing, find a new pointer to track + final int newIndex = event.getPointerId(0) != upPointer ? 0 : 1; + mTrackingPointer = event.getPointerId(newIndex); + mInitialTouchX = event.getX(newIndex); + mInitialTouchY = event.getY(newIndex); + } + break; + + case MotionEvent.ACTION_MOVE: + final float h = y - mInitialTouchY; + if (Math.abs(h) > mTouchSlop && Math.abs(h) > Math.abs(x - mInitialTouchX)) { + setTrackingHeadsUp(true); + mCollapseSnoozes = h < 0; + mInitialTouchX = x; + mInitialTouchY = y; + int expandedHeight = mPickedChild.getActualHeight(); + mPanel.startExpandMotion(x, y, true /* startTracking */, expandedHeight); + return true; + } + break; + + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + if (mPickedChild != null && mMotionOnHeadsUpView) { + if (mHeadsUpManager.shouldSwallowClick( + mPickedChild.getStatusBarNotification().getKey())) { + endMotion(); + return true; + } + } + endMotion(); + break; + } + return false; + } + + private void setTrackingHeadsUp(boolean tracking) { + mTrackingHeadsUp = tracking; + mHeadsUpManager.setTrackingHeadsUp(tracking); + mPanel.setTrackingHeadsUp(tracking); + } + + public void notifyFling(boolean collapse) { + if (collapse && mCollapseSnoozes) { + mHeadsUpManager.snooze(); + } + mCollapseSnoozes = false; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!mTrackingHeadsUp) { + return false; + } + switch (event.getActionMasked()) { + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + endMotion(); + setTrackingHeadsUp(false); + break; + } + return true; + } + + private void endMotion() { + mTrackingPointer = -1; + mPickedChild = null; + mMotionOnHeadsUpView = false; + } + + public ExpandableView getPickedChild() { + return mPickedChild; + } + + public void bind(HeadsUpManager headsUpManager, NotificationStackScrollLayout stackScroller, + NotificationPanelView notificationPanelView) { + mHeadsUpManager = headsUpManager; + mStackScroller = stackScroller; + mPanel = notificationPanelView; + Context context = stackScroller.getContext(); + final ViewConfiguration configuration = ViewConfiguration.get(context); + mTouchSlop = configuration.getScaledTouchSlop(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java index 3b8fccc..9d892f6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java @@ -69,7 +69,7 @@ public class KeyguardAffordanceHelper { @Override public void onAnimationEnd(Animator animation) { mSwipeAnimator = null; - setSwipingInProgress(false); + mSwipingInProgress = false; } }; private Runnable mAnimationEndRunnable = new Runnable() { @@ -83,9 +83,9 @@ public class KeyguardAffordanceHelper { mContext = context; mCallback = callback; initIcons(); - updateIcon(mLeftIcon, 0.0f, SWIPE_RESTING_ALPHA_AMOUNT, false, false); - updateIcon(mCenterIcon, 0.0f, SWIPE_RESTING_ALPHA_AMOUNT, false, false); - updateIcon(mRightIcon, 0.0f, SWIPE_RESTING_ALPHA_AMOUNT, false, false); + updateIcon(mLeftIcon, 0.0f, mLeftIcon.getRestingAlpha(), false, false); + updateIcon(mCenterIcon, 0.0f, mCenterIcon.getRestingAlpha(), false, false); + updateIcon(mRightIcon, 0.0f, mRightIcon.getRestingAlpha(), false, false); initDimens(); } @@ -117,14 +117,17 @@ public class KeyguardAffordanceHelper { } public boolean onTouchEvent(MotionEvent event) { - if (mMotionCancelled && event.getActionMasked() != MotionEvent.ACTION_DOWN) { + int action = event.getActionMasked(); + if (mMotionCancelled && action != MotionEvent.ACTION_DOWN + && action != MotionEvent.ACTION_UP + && action != MotionEvent.ACTION_CANCEL) { return false; } final float y = event.getY(); final float x = event.getX(); boolean isUp = false; - switch (event.getActionMasked()) { + switch (action) { case MotionEvent.ACTION_DOWN: if (mSwipingInProgress) { cancelAnimation(); @@ -152,7 +155,8 @@ public class KeyguardAffordanceHelper { mInitialTouchY = y; mInitialTouchX = x; mTranslationOnDown = mTranslation; - setSwipingInProgress(true); + mSwipingInProgress = true; + mCallback.onSwipingStarted(w < -mTouchSlop); } if (mSwipingInProgress) { setTranslation(mTranslationOnDown + x - mInitialTouchX, false, false); @@ -179,13 +183,6 @@ public class KeyguardAffordanceHelper { } } - private void setSwipingInProgress(boolean inProgress) { - mSwipingInProgress = inProgress; - if (inProgress) { - mCallback.onSwipingStarted(); - } - } - private boolean rightSwipePossible() { return mRightIcon.getVisibility() == View.VISIBLE; } @@ -323,6 +320,9 @@ public class KeyguardAffordanceHelper { } animator.start(); mSwipeAnimator = animator; + if (snapBack) { + mCallback.onSwipingAborted(); + } } private void startFinishingCircleAnimation(float velocity, Runnable mAnimationEndRunnable) { @@ -344,22 +344,23 @@ public class KeyguardAffordanceHelper { float alpha = absTranslation / getMinTranslationAmount(); // We interpolate the alpha of the other icons to 0 - float fadeOutAlpha = SWIPE_RESTING_ALPHA_AMOUNT * (1.0f - alpha); - fadeOutAlpha = Math.max(0.0f, fadeOutAlpha); - - // We interpolate the alpha of the targetView to 1 - alpha = fadeOutAlpha + alpha; + float fadeOutAlpha = 1.0f - alpha; + fadeOutAlpha = Math.min(1.0f, Math.max(0.0f, fadeOutAlpha)); boolean animateIcons = isReset && animateReset; float radius = getRadiusFromTranslation(absTranslation); boolean slowAnimation = isReset && isBelowFalsingThreshold(); if (!isReset) { - updateIcon(targetView, radius, alpha, false, false); + updateIcon(targetView, radius, alpha + fadeOutAlpha * targetView.getRestingAlpha(), + false, false); } else { - updateIcon(targetView, 0.0f, fadeOutAlpha, animateIcons, slowAnimation); + updateIcon(targetView, 0.0f, fadeOutAlpha * targetView.getRestingAlpha(), + animateIcons, slowAnimation); } - updateIcon(otherView, 0.0f, fadeOutAlpha, animateIcons, slowAnimation); - updateIcon(mCenterIcon, 0.0f, fadeOutAlpha, animateIcons, slowAnimation); + updateIcon(otherView, 0.0f, fadeOutAlpha * otherView.getRestingAlpha(), + animateIcons, slowAnimation); + updateIcon(mCenterIcon, 0.0f, fadeOutAlpha * mCenterIcon.getRestingAlpha(), + animateIcons, slowAnimation); mTranslation = translation; } @@ -369,15 +370,14 @@ public class KeyguardAffordanceHelper { float alpha = newRadius / mMinBackgroundRadius; // We interpolate the alpha of the other icons to 0 - float fadeOutAlpha = SWIPE_RESTING_ALPHA_AMOUNT * (1.0f - alpha); + float fadeOutAlpha = 1.0f - alpha; fadeOutAlpha = Math.max(0.0f, fadeOutAlpha); // We interpolate the alpha of the targetView to 1 - alpha = fadeOutAlpha + alpha; KeyguardAffordanceView otherView = targetView == mRightIcon ? mLeftIcon : mRightIcon; - updateIconAlpha(targetView, alpha, false); - updateIconAlpha(otherView, fadeOutAlpha, false); - updateIconAlpha(mCenterIcon, fadeOutAlpha, false); + updateIconAlpha(targetView, alpha + fadeOutAlpha * targetView.getRestingAlpha(), false); + updateIconAlpha(otherView, fadeOutAlpha * otherView.getRestingAlpha(), false); + updateIconAlpha(mCenterIcon, fadeOutAlpha * mCenterIcon.getRestingAlpha(), false); } private float getTranslationFromRadius(float circleSize) { @@ -404,14 +404,14 @@ public class KeyguardAffordanceHelper { } private void updateIconAlpha(KeyguardAffordanceView view, float alpha, boolean animate) { - float scale = getScale(alpha); + float scale = getScale(alpha, view); alpha = Math.min(1.0f, alpha); view.setImageAlpha(alpha, animate); view.setImageScale(scale, animate); } - private float getScale(float alpha) { - float scale = alpha / SWIPE_RESTING_ALPHA_AMOUNT * 0.2f + + private float getScale(float alpha, KeyguardAffordanceView icon) { + float scale = alpha / icon.getRestingAlpha() * 0.2f + KeyguardAffordanceView.MIN_ICON_SCALE_AMOUNT; return Math.min(scale, KeyguardAffordanceView.MAX_ICON_SCALE_AMOUNT); } @@ -451,7 +451,11 @@ public class KeyguardAffordanceHelper { mSwipeAnimator.cancel(); } setTranslation(0.0f, true, animate); - setSwipingInProgress(false); + mMotionCancelled = true; + if (mSwipingInProgress) { + mCallback.onSwipingAborted(); + } + mSwipingInProgress = false; } public interface Callback { @@ -470,7 +474,9 @@ public class KeyguardAffordanceHelper { float getPageWidth(); - void onSwipingStarted(); + void onSwipingStarted(boolean isRightwardMotion); + + void onSwipingAborted(); KeyguardAffordanceView getLeftIcon(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index a247c8e..094cd1f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -25,13 +25,17 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; +import android.hardware.fingerprint.FingerprintManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; +import android.os.Vibrator; import android.provider.MediaStore; +import android.provider.Settings; import android.telecom.TelecomManager; import android.util.AttributeSet; import android.util.Log; @@ -78,6 +82,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private static final Intent PHONE_INTENT = new Intent(Intent.ACTION_DIAL); private static final int DOZE_ANIMATION_STAGGER_DELAY = 48; private static final int DOZE_ANIMATION_ELEMENT_DURATION = 250; + private static final long TRANSIENT_FP_ERROR_TIMEOUT = 1300; + private static final long[] FP_ERROR_VIBRATE_PATTERN = new long[] {0, 30, 100, 30}; + private static final long[] FP_SUCCESS_VIBRATE_PATTERN = new long[] {0, 30}; private KeyguardAffordanceView mCameraImageView; private KeyguardAffordanceView mPhoneImageView; @@ -100,6 +107,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private final TrustDrawable mTrustDrawable; private final Interpolator mLinearOutSlowInInterpolator; private int mLastUnlockIconRes = 0; + private boolean mPrewarmSent; + private boolean mTransientFpError; public KeyguardBottomAreaView(Context context) { this(context, null); @@ -335,12 +344,47 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL mLockPatternUtils.requireCredentialEntry(mLockPatternUtils.getCurrentUser()); } - public void launchCamera() { + public void prewarmCamera() { + Intent intent = getCameraIntent(); + String targetPackage = PreviewInflater.getTargetPackage(mContext, intent, + mLockPatternUtils.getCurrentUser()); + if (targetPackage != null) { + Intent prewarm = new Intent(MediaStore.ACTION_STILL_IMAGE_CAMERA_PREWARM); + prewarm.setPackage(targetPackage); + mPrewarmSent = true; + mContext.sendBroadcast(prewarm); + } + } + + public void maybeCooldownCamera() { + if (!mPrewarmSent) { + return; + } + mPrewarmSent = false; Intent intent = getCameraIntent(); + String targetPackage = PreviewInflater.getTargetPackage(mContext, intent, + mLockPatternUtils.getCurrentUser()); + if (targetPackage != null) { + Intent prewarm = new Intent(MediaStore.ACTION_STILL_IMAGE_CAMERA_COOLDOWN); + prewarm.setPackage(targetPackage); + mContext.sendBroadcast(prewarm); + } + } + + public void launchCamera() { + + // Reset prewarm state. + mPrewarmSent = false; + final Intent intent = getCameraIntent(); boolean wouldLaunchResolverActivity = PreviewInflater.wouldLaunchResolverActivity( mContext, intent, mLockPatternUtils.getCurrentUser()); if (intent == SECURE_CAMERA_INTENT && !wouldLaunchResolverActivity) { - mContext.startActivityAsUser(intent, UserHandle.CURRENT); + AsyncTask.execute(new Runnable() { + @Override + public void run() { + mContext.startActivityAsUser(intent, UserHandle.CURRENT); + } + }); } else { // We need to delay starting the activity because ResolverActivity finishes itself if @@ -395,28 +439,41 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL return; } // TODO: Real icon for facelock. - int iconRes = mUnlockMethodCache.isFaceUnlockRunning() - ? com.android.internal.R.drawable.ic_account_circle + boolean isFingerprintIcon = + KeyguardUpdateMonitor.getInstance(mContext).isFingerprintDetectionRunning(); + boolean anyFingerprintIcon = isFingerprintIcon || mTransientFpError; + int iconRes = mTransientFpError ? R.drawable.ic_fingerprint_error + : isFingerprintIcon ? R.drawable.ic_fingerprint + : mUnlockMethodCache.isFaceUnlockRunning() + ? com.android.internal.R.drawable.ic_account_circle : mUnlockMethodCache.isCurrentlyInsecure() ? R.drawable.ic_lock_open_24dp : R.drawable.ic_lock_24dp; + if (mLastUnlockIconRes != iconRes) { Drawable icon = mContext.getDrawable(iconRes); int iconHeight = getResources().getDimensionPixelSize( R.dimen.keyguard_affordance_icon_height); int iconWidth = getResources().getDimensionPixelSize( R.dimen.keyguard_affordance_icon_width); - if (icon.getIntrinsicHeight() != iconHeight || icon.getIntrinsicWidth() != iconWidth) { + if (!anyFingerprintIcon && (icon.getIntrinsicHeight() != iconHeight + || icon.getIntrinsicWidth() != iconWidth)) { icon = new IntrinsicSizeDrawable(icon, iconWidth, iconHeight); } mLockIcon.setImageDrawable(icon); + mLockIcon.setPaddingRelative(0, 0, 0, anyFingerprintIcon + ? getResources().getDimensionPixelSize( + R.dimen.fingerprint_icon_additional_padding) + : 0); + mLockIcon.setRestingAlpha( + anyFingerprintIcon ? 1f : KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT); } - boolean trustManaged = mUnlockMethodCache.isTrustManaged(); + + // Hide trust circle when fingerprint is running. + boolean trustManaged = mUnlockMethodCache.isTrustManaged() && !anyFingerprintIcon; mTrustDrawable.setTrustManaged(trustManaged); updateLockIconClickability(); } - - public KeyguardAffordanceView getPhoneView() { return mPhoneImageView; } @@ -494,6 +551,14 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL .setDuration(DOZE_ANIMATION_ELEMENT_DURATION); } + private void vibrateFingerprintError() { + mContext.getSystemService(Vibrator.class).vibrate(FP_ERROR_VIBRATE_PATTERN, -1); + } + + private void vibrateFingerprintSuccess() { + mContext.getSystemService(Vibrator.class).vibrate(FP_SUCCESS_VIBRATE_PATTERN, -1); + } + private final BroadcastReceiver mDevicePolicyReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { post(new Runnable() { @@ -505,6 +570,15 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL } }; + private final Runnable mTransientFpErrorClearRunnable = new Runnable() { + @Override + public void run() { + mTransientFpError = false; + mIndicationController.hideTransientIndication(); + updateLockIcon(); + } + }; + private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -526,6 +600,34 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL public void onKeyguardVisibilityChanged(boolean showing) { updateLockIcon(); } + + @Override + public void onFingerprintAuthenticated(int userId) { + vibrateFingerprintSuccess(); + } + + @Override + public void onFingerprintRunningStateChanged(boolean running) { + updateLockIcon(); + } + + @Override + public void onFingerprintHelp(int msgId, String helpString) { + vibrateFingerprintError(); + mTransientFpError = true; + mIndicationController.showTransientIndication(helpString, + getResources().getColor(R.color.system_warning_color, null)); + removeCallbacks(mTransientFpErrorClearRunnable); + postDelayed(mTransientFpErrorClearRunnable, TRANSIENT_FP_ERROR_TIMEOUT); + updateLockIcon(); + } + + @Override + public void onFingerprintError(int msgId, String errString) { + // TODO: Go to bouncer if this is "too many attempts" (lockout) error. + Log.i(TAG, "FP Error: " + errString); + updateLockIcon(); + } }; public void setKeyguardIndicationController( @@ -533,7 +635,6 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL mIndicationController = keyguardIndicationController; } - /** * A wrapper around another Drawable that overrides the intrinsic size. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 12ff399..c62ad66 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -50,6 +50,8 @@ import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.DelegateViewHelper; import com.android.systemui.statusbar.policy.DeadZone; +import com.android.systemui.statusbar.policy.KeyButtonView; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; @@ -195,7 +197,7 @@ public class NavigationBarView extends LinearLayout { mDelegateHelper.setDelegateView(view); } - public void setBar(BaseStatusBar phoneStatusBar) { + public void setBar(PhoneStatusBar phoneStatusBar) { mTaskSwitchHelper.setBar(phoneStatusBar); mDelegateHelper.setBar(phoneStatusBar); } @@ -261,8 +263,8 @@ public class NavigationBarView extends LinearLayout { return mCurrentView.findViewById(R.id.back); } - public View getHomeButton() { - return mCurrentView.findViewById(R.id.home); + public KeyButtonView getHomeButton() { + return (KeyButtonView) mCurrentView.findViewById(R.id.home); } public View getImeSwitchButton() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 195da46..96e9543 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -32,6 +32,7 @@ import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewTreeObserver; +import android.view.WindowInsets; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; @@ -39,16 +40,19 @@ import android.widget.FrameLayout; import android.widget.TextView; import com.android.keyguard.KeyguardStatusView; -import com.android.systemui.EventLogTags; import com.android.systemui.EventLogConstants; +import com.android.systemui.EventLogTags; import com.android.systemui.R; import com.android.systemui.qs.QSContainer; import com.android.systemui.qs.QSPanel; +import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.ExpandableView; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.GestureRecorder; import com.android.systemui.statusbar.KeyguardAffordanceView; +import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.stack.StackStateAnimator; @@ -56,7 +60,8 @@ import com.android.systemui.statusbar.stack.StackStateAnimator; public class NotificationPanelView extends PanelView implements ExpandableView.OnHeightChangedListener, ObservableScrollView.Listener, View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener, - KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener { + KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener, + HeadsUpManager.OnHeadsUpChangedListener { private static final boolean DEBUG = false; @@ -81,7 +86,7 @@ public class NotificationPanelView extends PanelView implements private TextView mClockView; private View mReserveNotificationSpace; private View mQsNavbarScrim; - private View mNotificationContainerParent; + private NotificationsQuickSettingsContainer mNotificationContainerParent; private NotificationStackScrollLayout mNotificationStackScroller; private int mNotificationTopPadding; private boolean mAnimateNextTopPaddingChange; @@ -177,6 +182,17 @@ public class NotificationPanelView extends PanelView implements private float mKeyguardStatusBarAnimateAlpha = 1f; private int mOldLayoutDirection; + private HeadsUpTouchHelper mHeadsUpTouchHelper = new HeadsUpTouchHelper(); + private boolean mPinnedHeadsUpExist; + private boolean mExpansionIsFromHeadsUp; + private int mBottomBarHeight; + private boolean mExpandingFromHeadsUp; + private Runnable mHeadsUpExistenceChangedRunnable = new Runnable() { + @Override + public void run() { + notifyBarPanelExpansionChanged(); + } + }; public NotificationPanelView(Context context, AttributeSet attrs) { super(context, attrs); @@ -201,7 +217,8 @@ public class NotificationPanelView extends PanelView implements mScrollView.setListener(this); mScrollView.setFocusable(false); mReserveNotificationSpace = findViewById(R.id.reserve_notification_space); - mNotificationContainerParent = findViewById(R.id.notification_container_parent); + mNotificationContainerParent = (NotificationsQuickSettingsContainer) + findViewById(R.id.notification_container_parent); mNotificationStackScroller = (NotificationStackScrollLayout) findViewById(R.id.notification_stack_scroller); mNotificationStackScroller.setOnHeightChangedListener(this); @@ -317,6 +334,7 @@ public class NotificationPanelView extends PanelView implements if (mQsSizeChangeAnimator == null) { mQsContainer.setHeightOverride(mQsContainer.getDesiredHeight()); } + updateMaxHeadsUpTranslation(); } @Override @@ -493,22 +511,40 @@ public class NotificationPanelView extends PanelView implements } @Override + protected void flingToHeight(float vel, boolean expand, float target, + float collapseSpeedUpFactor) { + mHeadsUpTouchHelper.notifyFling(!expand); + super.flingToHeight(vel, expand, target, collapseSpeedUpFactor); + } + + @Override public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { event.getText().add(getKeyguardOrLockScreenString()); mLastAnnouncementWasQuickSettings = false; return true; } - return super.dispatchPopulateAccessibilityEventInternal(event); } @Override - public boolean onInterceptTouchEvent(MotionEvent event) { + public boolean + onInterceptTouchEvent(MotionEvent event) { if (mBlockTouches) { return false; } initDownStates(event); + if (mHeadsUpTouchHelper.onInterceptTouchEvent(event)) { + mExpansionIsFromHeadsUp = true; + return true; + } + if (!isShadeCollapsed() && onQsIntercept(event)) { + return true; + } + return super.onInterceptTouchEvent(event); + } + + private boolean onQsIntercept(MotionEvent event) { int pointerIndex = event.findPointerIndex(mTrackingPointer); if (pointerIndex < 0) { pointerIndex = 0; @@ -583,7 +619,7 @@ public class NotificationPanelView extends PanelView implements mIntercepting = false; break; } - return super.onInterceptTouchEvent(event); + return false; } @Override @@ -652,6 +688,15 @@ public class NotificationPanelView extends PanelView implements if (mOnlyAffordanceInThisMotion) { return true; } + mHeadsUpTouchHelper.onTouchEvent(event); + if (!mHeadsUpTouchHelper.isTrackingHeadsUp() && handleQSTouch(event)) { + return true; + } + super.onTouchEvent(event); + return true; + } + + private boolean handleQSTouch(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN && getExpandedFraction() == 1f && mStatusBar.getBarState() != StatusBarState.KEYGUARD && !mQsExpanded && mQsExpansionEnabled) { @@ -664,7 +709,7 @@ public class NotificationPanelView extends PanelView implements mInitialTouchY = event.getX(); mInitialTouchX = event.getY(); } - if (mExpandedHeight != 0) { + if (!isShadeCollapsed()) { handleQsDown(event); } if (!mQsExpandImmediate && mQsTracking) { @@ -677,7 +722,7 @@ public class NotificationPanelView extends PanelView implements || event.getActionMasked() == MotionEvent.ACTION_UP) { mConflictingQsExpansionGesture = false; } - if (event.getActionMasked() == MotionEvent.ACTION_DOWN && mExpandedHeight == 0 + if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isShadeCollapsed() && mQsExpansionEnabled) { mTwoFingerQsExpandPossible = true; } @@ -691,8 +736,7 @@ public class NotificationPanelView extends PanelView implements // earlier so the state is already up to date when dragging down. setListening(true); } - super.onTouchEvent(event); - return true; + return false; } private boolean isInQsArea(float x, float y) { @@ -834,13 +878,13 @@ public class NotificationPanelView extends PanelView implements setQsExpansion(mQsExpansionHeight); flingSettings(!mQsExpansionEnabled && open ? 0f : velocity, open && mQsExpansionEnabled, new Runnable() { - @Override - public void run() { - mStackScrollerOverscrolling = false; - mQsExpansionFromOverscroll = false; - updateQsState(); - } - }); + @Override + public void run() { + mStackScrollerOverscrolling = false; + mQsExpansionFromOverscroll = false; + updateQsState(); + } + }); } private void onQsExpansionStarted() { @@ -869,6 +913,7 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.setInterceptDelegateEnabled(expanded); mStatusBar.setQsExpanded(expanded); mQsPanel.setExpanded(expanded); + mNotificationContainerParent.setQsExpanded(expanded); } } @@ -1056,7 +1101,7 @@ public class NotificationPanelView extends PanelView implements mKeyguardBottomArea.animate() .alpha(0f) .setStartDelay(mStatusBar.getKeyguardFadingAwayDelay()) - .setDuration(mStatusBar.getKeyguardFadingAwayDuration()/2) + .setDuration(mStatusBar.getKeyguardFadingAwayDuration() / 2) .setInterpolator(PhoneStatusBar.ALPHA_OUT) .withEndAction(mAnimateKeyguardBottomAreaInvisibleEndRunnable) .start(); @@ -1132,8 +1177,8 @@ public class NotificationPanelView extends PanelView implements updateEmptyShadeView(); mQsNavbarScrim.setVisibility(mStatusBarState == StatusBarState.SHADE && mQsExpanded && !mStackScrollerOverscrolling && mQsScrimEnabled - ? View.VISIBLE - : View.INVISIBLE); + ? View.VISIBLE + : View.INVISIBLE); if (mKeyguardUserSwitcher != null && mQsExpanded && !mStackScrollerOverscrolling) { mKeyguardUserSwitcher.hideIfNotSimple(true /* animate */); } @@ -1402,6 +1447,8 @@ public class NotificationPanelView extends PanelView implements updateHeader(); updateUnlockIcon(); updateNotificationTranslucency(); + mHeadsUpManager.setIsExpanded(!isShadeCollapsed()); + mNotificationStackScroller.setShadeExpanded(!isShadeCollapsed()); if (DEBUG) { invalidate(); } @@ -1471,16 +1518,24 @@ public class NotificationPanelView extends PanelView implements } } private void updateNotificationTranslucency() { - float alpha = (getNotificationsTopY() + mNotificationStackScroller.getItemHeight()) - / (mQsMinExpansionHeight + mNotificationStackScroller.getBottomStackPeekSize() - - mNotificationStackScroller.getCollapseSecondCardPadding()); - alpha = Math.max(0, Math.min(alpha, 1)); - alpha = (float) Math.pow(alpha, 0.75); - if (alpha != 1f && mNotificationStackScroller.getLayerType() != LAYER_TYPE_HARDWARE) { - mNotificationStackScroller.setLayerType(LAYER_TYPE_HARDWARE, null); - } else if (alpha == 1f - && mNotificationStackScroller.getLayerType() == LAYER_TYPE_HARDWARE) { - mNotificationStackScroller.setLayerType(LAYER_TYPE_NONE, null); + float alpha; + if (mExpandingFromHeadsUp || mHeadsUpManager.hasPinnedHeadsUp()) { + alpha = 1f; + if (mNotificationStackScroller.getLayerType() == LAYER_TYPE_HARDWARE) { + mNotificationStackScroller.setLayerType(LAYER_TYPE_NONE, null); + } + } else { + alpha = (getNotificationsTopY() + mNotificationStackScroller.getItemHeight()) + / (mQsMinExpansionHeight + mNotificationStackScroller.getBottomStackPeekSize() + - mNotificationStackScroller.getCollapseSecondCardPadding()); + alpha = Math.max(0, Math.min(alpha, 1)); + alpha = (float) Math.pow(alpha, 0.75); + if (alpha != 1f && mNotificationStackScroller.getLayerType() != LAYER_TYPE_HARDWARE) { + mNotificationStackScroller.setLayerType(LAYER_TYPE_HARDWARE, null); + } else if (alpha == 1f + && mNotificationStackScroller.getLayerType() == LAYER_TYPE_HARDWARE) { + mNotificationStackScroller.setLayerType(LAYER_TYPE_NONE, null); + } } mNotificationStackScroller.setAlpha(alpha); } @@ -1505,7 +1560,7 @@ public class NotificationPanelView extends PanelView implements lockIcon.setImageScale(LOCK_ICON_ACTIVE_SCALE, true, 150, mFastOutLinearInterpolator); } else if (!active && mUnlockIconActive && mTracking) { - lockIcon.setImageAlpha(KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT, true, + lockIcon.setImageAlpha(lockIcon.getRestingAlpha(), true /* animate */, 150, mFastOutLinearInterpolator, null); lockIcon.setImageScale(1.0f, true, 150, mFastOutLinearInterpolator); @@ -1544,7 +1599,13 @@ public class NotificationPanelView extends PanelView implements return mExpandedHeight / HEADER_RUBBERBAND_FACTOR - mQsMinExpansionHeight; } } - return Math.min(0, mNotificationStackScroller.getTranslationY()) / HEADER_RUBBERBAND_FACTOR; + float stackTranslation = mNotificationStackScroller.getStackTranslation(); + float translation = stackTranslation / HEADER_RUBBERBAND_FACTOR; + if (mHeadsUpManager.hasPinnedHeadsUp() || mExpansionIsFromHeadsUp) { + translation = mNotificationStackScroller.getTopPadding() + stackTranslation + - mNotificationTopPadding - mQsMinExpansionHeight; + } + return Math.min(0, translation); } /** @@ -1605,15 +1666,19 @@ public class NotificationPanelView extends PanelView implements protected void onExpandingFinished() { super.onExpandingFinished(); mNotificationStackScroller.onExpansionStopped(); + mHeadsUpManager.onExpandingFinished(); mIsExpanding = false; mScrollYOverride = -1; - if (mExpandedHeight == 0f) { + if (isShadeCollapsed()) { setListening(false); } else { setListening(true); } mQsExpandImmediate = false; mTwoFingerQsExpandPossible = false; + mExpansionIsFromHeadsUp = false; + mNotificationStackScroller.setTrackingHeadsUp(mHeadsUpTouchHelper.isTrackingHeadsUp()); + mExpandingFromHeadsUp = mHeadsUpTouchHelper.isTrackingHeadsUp(); } private void setListening(boolean listening) { @@ -1709,6 +1774,17 @@ public class NotificationPanelView extends PanelView implements } @Override + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + mBottomBarHeight = insets.getSystemWindowInsetBottom(); + updateMaxHeadsUpTranslation(); + return insets; + } + + private void updateMaxHeadsUpTranslation() { + mNotificationStackScroller.setHeadsUpBoundaries(getHeight(), mBottomBarHeight); + } + + @Override public void onRtlPropertiesChanged(int layoutDirection) { if (layoutDirection != mOldLayoutDirection) { mAfforanceHelper.onRtlPropertiesChanged(); @@ -1796,8 +1872,8 @@ public class NotificationPanelView extends PanelView implements mFastOutSlowInInterpolator, new Runnable() { @Override public void run() { - icon.setImageAlpha(KeyguardAffordanceHelper.SWIPE_RESTING_ALPHA_AMOUNT, - true, KeyguardAffordanceHelper.HINT_PHASE1_DURATION, + icon.setImageAlpha(icon.getRestingAlpha(), + true /* animate */, KeyguardAffordanceHelper.HINT_PHASE1_DURATION, mFastOutSlowInInterpolator, null); } }); @@ -1809,14 +1885,24 @@ public class NotificationPanelView extends PanelView implements } @Override - public void onSwipingStarted() { - mSecureCameraLaunchManager.onSwipingStarted(); + public void onSwipingStarted(boolean isRightwardMotion) { + boolean start = getLayoutDirection() == LAYOUT_DIRECTION_RTL ? isRightwardMotion + : !isRightwardMotion; + if (!start) { + mSecureCameraLaunchManager.onSwipingStarted(); + mKeyguardBottomArea.prewarmCamera(); + } requestDisallowInterceptTouchEvent(true); mOnlyAffordanceInThisMotion = true; mQsTracking = false; } @Override + public void onSwipingAborted() { + mKeyguardBottomArea.maybeCooldownCamera(); + } + + @Override public KeyguardAffordanceView getLeftIcon() { return getLayoutDirection() == LAYOUT_DIRECTION_RTL ? mKeyguardBottomArea.getCameraView() @@ -2056,4 +2142,49 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.getTopPadding(), p); } } + + @Override + public void OnPinnedHeadsUpExistChanged(final boolean exist, boolean changeImmediatly) { + if (exist != mPinnedHeadsUpExist) { + mPinnedHeadsUpExist = exist; + if (exist) { + mHeadsUpExistenceChangedRunnable.run(); + updateNotificationTranslucency(); + } else { + mNotificationStackScroller.performOnAnimationFinished( + mHeadsUpExistenceChangedRunnable); + } + } + } + + @Override + public void OnHeadsUpPinnedChanged(ExpandableNotificationRow headsUp, boolean isHeadsUp) { + if (isHeadsUp) { + mNotificationStackScroller.generateHeadsUpAnimation(headsUp, true); + } + } + + @Override + public void OnHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) { + mNotificationStackScroller.generateHeadsUpAnimation(entry.row, isHeadsUp); + } + + @Override + protected boolean isShadeCollapsed() { + return mExpandedHeight == 0; + } + + @Override + public void setHeadsUpManager(HeadsUpManager headsUpManager) { + super.setHeadsUpManager(headsUpManager); + mHeadsUpTouchHelper.bind(headsUpManager, mNotificationStackScroller, this); + } + + public void setTrackingHeadsUp(boolean tracking) { + if (tracking) { + // otherwise we update the state when the expansion is finished + mNotificationStackScroller.setTrackingHeadsUp(true); + mExpandingFromHeadsUp = true; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java index a03c297..cbb71c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java @@ -37,6 +37,7 @@ public class NotificationsQuickSettingsContainer extends FrameLayout private View mStackScroller; private View mKeyguardStatusBar; private boolean mInflated; + private boolean mQsExpanded; public NotificationsQuickSettingsContainer(Context context, AttributeSet attrs) { super(context, attrs); @@ -64,26 +65,29 @@ public class NotificationsQuickSettingsContainer extends FrameLayout boolean userSwitcherVisible = mInflated && mUserSwitcher.getVisibility() == View.VISIBLE; boolean statusBarVisible = mKeyguardStatusBar.getVisibility() == View.VISIBLE; + View stackQsTop = mQsExpanded ? mStackScroller : mScrollView; + View stackQsBottom = !mQsExpanded ? mStackScroller : mScrollView; // Invert the order of the scroll view and user switcher such that the notifications receive // touches first but the panel gets drawn above. if (child == mScrollView) { - return super.drawChild(canvas, mStackScroller, drawingTime); - } else if (child == mStackScroller) { - return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? mUserSwitcher + return super.drawChild(canvas, userSwitcherVisible && statusBarVisible ? mUserSwitcher : statusBarVisible ? mKeyguardStatusBar : userSwitcherVisible ? mUserSwitcher - : mScrollView, + : stackQsBottom, drawingTime); + } else if (child == mStackScroller) { + return super.drawChild(canvas, + userSwitcherVisible && statusBarVisible ? mKeyguardStatusBar + : statusBarVisible || userSwitcherVisible ? stackQsBottom + : stackQsTop, drawingTime); } else if (child == mUserSwitcher) { return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? mKeyguardStatusBar - : mScrollView, + userSwitcherVisible && statusBarVisible ? stackQsBottom + : stackQsTop, drawingTime); } else if (child == mKeyguardStatusBar) { return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? mScrollView - : mScrollView, + stackQsTop, drawingTime); }else { return super.drawChild(canvas, child, drawingTime); @@ -97,4 +101,11 @@ public class NotificationsQuickSettingsContainer extends FrameLayout mInflated = true; } } + + public void setQsExpanded(boolean expanded) { + if (mQsExpanded != expanded) { + mQsExpanded = expanded; + invalidate(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index 3efaaff..f3d4c7f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -140,7 +140,7 @@ public class PanelBar extends FrameLayout { mPanelHolder.setSelectedPanel(mTouchingPanel); for (PanelView pv : mPanels) { if (pv != panel) { - pv.collapse(false /* delayed */); + pv.collapse(false /* delayed */, 1.0f /* speedUpFactor */); } } } @@ -157,8 +157,7 @@ public class PanelBar extends FrameLayout { if (DEBUG) LOG("panelExpansionChanged: start state=%d panel=%s", mState, panel.getName()); mPanelExpandedFractionSum = 0f; for (PanelView pv : mPanels) { - boolean visible = pv.getExpandedHeight() > 0; - pv.setVisibility(visible ? View.VISIBLE : View.GONE); + pv.setVisibility(expanded ? View.VISIBLE : View.INVISIBLE); // adjust any other panels that may be partially visible if (expanded) { if (mState == STATE_CLOSED) { @@ -167,7 +166,7 @@ public class PanelBar extends FrameLayout { } fullyClosed = false; final float thisFrac = pv.getExpandedFraction(); - mPanelExpandedFractionSum += (visible ? thisFrac : 0); + mPanelExpandedFractionSum += thisFrac; if (DEBUG) LOG("panelExpansionChanged: -> %s: f=%.1f", pv.getName(), thisFrac); if (panel == pv) { if (thisFrac == 1f) fullyOpenedPanel = panel; @@ -187,16 +186,15 @@ public class PanelBar extends FrameLayout { (fullyOpenedPanel!=null)?" fullyOpened":"", fullyClosed?" fullyClosed":""); } - public void collapseAllPanels(boolean animate) { + public void collapseAllPanels(boolean animate, boolean delayed, float speedUpFactor) { boolean waiting = false; for (PanelView pv : mPanels) { if (animate && !pv.isFullyCollapsed()) { - pv.collapse(true /* delayed */); + pv.collapse(delayed, speedUpFactor); waiting = true; } else { pv.resetViews(); pv.setExpandedFraction(0); // just in case - pv.setVisibility(View.GONE); pv.cancelPeek(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 4bbf690..3a30429 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -38,6 +38,7 @@ import com.android.systemui.R; import com.android.systemui.doze.DozeLog; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.policy.HeadsUpManager; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -45,6 +46,7 @@ import java.io.PrintWriter; public abstract class PanelView extends FrameLayout { public static final boolean DEBUG = PanelBar.DEBUG; public static final String TAG = PanelView.class.getSimpleName(); + protected HeadsUpManager mHeadsUpManager; private final void logf(String fmt, Object... args) { Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args)); @@ -99,6 +101,12 @@ public abstract class PanelView extends FrameLayout { private boolean mPeekPending; private boolean mCollapseAfterPeek; + + /** + * Speed-up factor to be used when {@link #mFlingCollapseRunnable} runs the next time. + */ + private float mNextCollapseSpeedUpFactor = 1.0f; + private boolean mExpanding; private boolean mGestureWaitForTouchSlop; private Runnable mPeekRunnable = new Runnable() { @@ -162,7 +170,7 @@ public abstract class PanelView extends FrameLayout { postOnAnimation(new Runnable() { @Override public void run() { - collapse(false /* delayed */); + collapse(false /* delayed */, 1.0f /* speedUpFactor */); } }); } @@ -232,18 +240,15 @@ public abstract class PanelView extends FrameLayout { final float y = event.getY(pointerIndex); if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { - mGestureWaitForTouchSlop = mExpandedHeight == 0f; + mGestureWaitForTouchSlop = isShadeCollapsed(); } boolean waitForTouchSlop = hasConflictingGestures() || mGestureWaitForTouchSlop; switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: - mInitialTouchY = y; - mInitialTouchX = x; - mInitialOffsetOnTouch = mExpandedHeight; - mTouchSlopExceeded = false; + startExpandMotion(x, y, false /* startTracking */, mExpandedHeight); mJustPeeked = false; - mPanelClosedOnDown = mExpandedHeight == 0.0f; + mPanelClosedOnDown = isShadeCollapsed(); mHasLayoutedSinceDown = false; mUpdateFlingOnLayout = false; mMotionAborted = false; @@ -261,7 +266,7 @@ public abstract class PanelView extends FrameLayout { || mPeekPending || mPeekAnimator != null; onTrackingStarted(); } - if (mExpandedHeight == 0) { + if (isShadeCollapsed()) { schedulePeek(); } break; @@ -274,9 +279,7 @@ public abstract class PanelView extends FrameLayout { final float newY = event.getY(newIndex); final float newX = event.getX(newIndex); mTrackingPointer = event.getPointerId(newIndex); - mInitialOffsetOnTouch = mExpandedHeight; - mInitialTouchY = newY; - mInitialTouchX = newX; + startExpandMotion(newX, newY, true /* startTracking */, mExpandedHeight); } break; case MotionEvent.ACTION_POINTER_DOWN: @@ -297,9 +300,7 @@ public abstract class PanelView extends FrameLayout { mTouchSlopExceeded = true; if (waitForTouchSlop && !mTracking) { if (!mJustPeeked && mInitialOffsetOnTouch != 0f) { - mInitialOffsetOnTouch = mExpandedHeight; - mInitialTouchX = x; - mInitialTouchY = y; + startExpandMotion(x, y, false /* startTracking */, mExpandedHeight); h = 0; } cancelHeightAnimator(); @@ -334,6 +335,17 @@ public abstract class PanelView extends FrameLayout { return !waitForTouchSlop || mTracking; } + protected void startExpandMotion(float newX, float newY, boolean startTracking, + float expandedHeight) { + mInitialOffsetOnTouch = expandedHeight; + mInitialTouchY = newY; + mInitialTouchX = newX; + if (startTracking) { + mTouchSlopExceeded = true; + onTrackingStarted(); + } + } + private void endMotionEvent(MotionEvent event, float x, float y, boolean forceCancel) { mTrackingPointer = -1; if ((mTracking && mTouchSlopExceeded) @@ -442,7 +454,7 @@ public abstract class PanelView extends FrameLayout { mTouchSlopExceeded = false; mJustPeeked = false; mMotionAborted = false; - mPanelClosedOnDown = mExpandedHeight == 0.0f; + mPanelClosedOnDown = isShadeCollapsed(); mHasLayoutedSinceDown = false; mUpdateFlingOnLayout = false; mTouchAboveFalsingThreshold = false; @@ -474,12 +486,7 @@ public abstract class PanelView extends FrameLayout { if (scrolledToBottom || mTouchStartedInEmptyArea) { if (h < -mTouchSlop && h < -Math.abs(x - mInitialTouchX)) { cancelHeightAnimator(); - mInitialOffsetOnTouch = mExpandedHeight; - mInitialTouchY = y; - mInitialTouchX = x; - mTracking = true; - mTouchSlopExceeded = true; - onTrackingStarted(); + startExpandMotion(x, y, true /* startTracking */, mExpandedHeight); return true; } } @@ -562,9 +569,17 @@ public abstract class PanelView extends FrameLayout { } protected void fling(float vel, boolean expand) { + fling(vel, expand, 1.0f /* collapseSpeedUpFactor */); + } + + protected void fling(float vel, boolean expand, float collapseSpeedUpFactor) { cancelPeek(); float target = expand ? getMaxPanelHeight() : 0.0f; + flingToHeight(vel, expand, target, collapseSpeedUpFactor); + } + protected void flingToHeight(float vel, boolean expand, float target, + float collapseSpeedUpFactor) { // Hack to make the expand transition look nice when clear all button is visible - we make // the animation only to the last notification, and then jump to the maximum panel height so // clear all just fades in and the decelerating motion is towards the last notification. @@ -596,7 +611,8 @@ public abstract class PanelView extends FrameLayout { // Make it shorter if we run a canned animation if (vel == 0) { animator.setDuration((long) - (animator.getDuration() * getCannedFlingDurationFactor())); + (animator.getDuration() * getCannedFlingDurationFactor() + / collapseSpeedUpFactor)); } } animator.addListener(new AnimatorListenerAdapter() { @@ -644,7 +660,7 @@ public abstract class PanelView extends FrameLayout { mHasLayoutedSinceDown = true; if (mUpdateFlingOnLayout) { abortAnimations(); - fling(mUpdateFlingVelocity, true); + fling(mUpdateFlingVelocity, true /* expands */); mUpdateFlingOnLayout = false; } } @@ -655,7 +671,7 @@ public abstract class PanelView extends FrameLayout { // If the user isn't actively poking us, let's update the height if ((!mTracking || isTrackingBlocked()) && mHeightAnimator == null - && mExpandedHeight > 0 + && !isShadeCollapsed() && currentMaxPanelHeight != mExpandedHeight && !mPeekPending && mPeekAnimator == null @@ -741,7 +757,7 @@ public abstract class PanelView extends FrameLayout { mBar = panelBar; } - public void collapse(boolean delayed) { + public void collapse(boolean delayed, float speedUpFactor) { if (DEBUG) logf("collapse: " + this); if (mPeekPending || mPeekAnimator != null) { mCollapseAfterPeek = true; @@ -757,9 +773,10 @@ public abstract class PanelView extends FrameLayout { mClosing = true; notifyExpandingStarted(); if (delayed) { + mNextCollapseSpeedUpFactor = speedUpFactor; postDelayed(mFlingCollapseRunnable, 120); } else { - fling(0, false /* expand */); + fling(0, false /* expand */, speedUpFactor); } } } @@ -767,7 +784,7 @@ public abstract class PanelView extends FrameLayout { private final Runnable mFlingCollapseRunnable = new Runnable() { @Override public void run() { - fling(0, false /* expand */); + fling(0, false /* expand */, mNextCollapseSpeedUpFactor); } }; @@ -805,7 +822,7 @@ public abstract class PanelView extends FrameLayout { if (mExpanding) { notifyExpandingFinished(); } - setVisibility(VISIBLE); + notifyBarPanelExpansionChanged(); // Wait for window manager to pickup the change, so we know the maximum height of the panel // then. @@ -941,9 +958,9 @@ public abstract class PanelView extends FrameLayout { return animator; } - private void notifyBarPanelExpansionChanged() { + protected void notifyBarPanelExpansionChanged() { mBar.panelExpansionChanged(this, mExpandedFraction, mExpandedFraction > 0f || mPeekPending - || mPeekAnimator != null); + || mPeekAnimator != null || mInstantExpanding || mHeadsUpManager.hasPinnedHeadsUp()); } /** @@ -971,7 +988,7 @@ public abstract class PanelView extends FrameLayout { protected final Runnable mPostCollapseRunnable = new Runnable() { @Override public void run() { - collapse(false /* delayed */); + collapse(false /* delayed */, 1.0f /* speedUpFactor */); } }; @@ -1014,4 +1031,10 @@ public abstract class PanelView extends FrameLayout { * @return the height of the clear all button, in pixels */ protected abstract int getClearAllHeight(); + + protected abstract boolean isShadeCollapsed(); + + public void setHeadsUpManager(HeadsUpManager headsUpManager) { + mHeadsUpManager = headsUpManager; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 2c389fb..b6dbfce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -17,19 +17,6 @@ package com.android.systemui.statusbar.phone; -import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; -import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; -import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; -import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; -import static android.app.StatusBarManager.windowStateToString; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.NonNull; @@ -49,7 +36,6 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.PixelFormat; import android.graphics.Point; @@ -87,13 +73,11 @@ import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Log; import android.view.Display; -import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; -import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewStub; import android.view.WindowManager; @@ -114,7 +98,9 @@ import com.android.systemui.BatteryMeterView; import com.android.systemui.DemoMode; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; +import com.android.systemui.Prefs; import com.android.systemui.R; +import com.android.systemui.assist.AssistGestureManager; import com.android.systemui.doze.DozeHost; import com.android.systemui.doze.DozeLog; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -136,7 +122,6 @@ import com.android.systemui.statusbar.NotificationOverflowContainer; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.SignalClusterView; import com.android.systemui.statusbar.SpeedBumpView; -import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.UnlockMethodCache.OnUnlockMethodChangedListener; import com.android.systemui.statusbar.policy.AccessibilityController; @@ -146,7 +131,7 @@ import com.android.systemui.statusbar.policy.BluetoothControllerImpl; import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.statusbar.policy.CastControllerImpl; import com.android.systemui.statusbar.policy.FlashlightController; -import com.android.systemui.statusbar.policy.HeadsUpNotificationView; +import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.HotspotControllerImpl; import com.android.systemui.statusbar.policy.KeyButtonView; import com.android.systemui.statusbar.policy.KeyguardMonitor; @@ -171,11 +156,27 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.TreeSet; + +import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; +import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; +import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; +import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; +import static android.app.StatusBarManager.windowStateToString; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING; public class PhoneStatusBar extends BaseStatusBar implements DemoMode, - DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener { + DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener, + HeadsUpManager.OnHeadsUpChangedListener { static final String TAG = "PhoneStatusBar"; public static final boolean DEBUG = BaseStatusBar.DEBUG; public static final boolean SPEW = false; @@ -225,8 +226,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, /** Allow some time inbetween the long press for back and recents. */ private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200; - private int mLightModeIconColor; - PhoneStatusBarPolicy mIconPolicy; // These are no longer handled by the policy, because we need custom strategies for them @@ -323,6 +322,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private int mNavigationIconHints = 0; private HandlerThread mHandlerThread; + private AssistGestureManager mAssistGestureManager; + // ensure quick settings is disabled until the current user makes it through the setup wizard private boolean mUserSetup = false; private ContentObserver mUserSetupObserver = new ContentObserver(new Handler()) { @@ -359,11 +360,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (wasUsing != mUseHeadsUp) { if (!mUseHeadsUp) { Log.d(TAG, "dismissing any existing heads up notification on disable event"); - setHeadsUpVisibility(false); - mHeadsUpNotificationView.releaseImmediately(); - removeHeadsUpView(); - } else { - addHeadsUpView(); + mHeadsUpManager.releaseAllImmediately(); } } } @@ -527,6 +524,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, }; private HashMap<ExpandableNotificationRow, List<ExpandableNotificationRow>> mTmpChildOrderMap = new HashMap<>(); + private HashSet<Entry> mHeadsUpEntriesToRemoveOnSwitch = new HashSet<>(); + private RankingMap mLatestRankingMap; @Override public void start() { @@ -535,7 +534,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, updateDisplaySize(); mScrimSrcModeEnabled = mContext.getResources().getBoolean( R.bool.config_status_bar_scrim_behind_use_src); - mLightModeIconColor = mContext.getColor(R.color.light_mode_icon_color); super.start(); // calls createAndAddWindows() @@ -598,7 +596,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } return mStatusBarWindow.onTouchEvent(event); - }}); + } + }); mStatusBarView = (PhoneStatusBarView) mStatusBarWindow.findViewById(R.id.status_bar); mStatusBarView.setBar(this); @@ -615,12 +614,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mNotificationPanel.setBackground(new FastColorDrawable(context.getColor( R.color.notification_panel_solid_background))); } - if (ENABLE_HEADS_UP) { - mHeadsUpNotificationView = - (HeadsUpNotificationView) View.inflate(context, R.layout.heads_up, null); - mHeadsUpNotificationView.setVisibility(View.GONE); - mHeadsUpNotificationView.setBar(this); - } + + mHeadsUpManager = new HeadsUpManager(context, mNotificationPanel.getViewTreeObserver()); + mHeadsUpManager.setBar(this); + mHeadsUpManager.addListener(this); + mHeadsUpManager.addListener(mNotificationPanel); + mNotificationPanel.setHeadsUpManager(mHeadsUpManager); + mNotificationData.setHeadsUpManager(mHeadsUpManager); + if (MULTIUSER_DEBUG) { mNotificationPanelDebugText = (TextView) mNotificationPanel.findViewById( R.id.header_debug_info); @@ -642,8 +643,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, new NavigationBarView.OnVerticalChangedListener() { @Override public void onVerticalChanged(boolean isVertical) { - if (mSearchPanelView != null) { - mSearchPanelView.setHorizontal(isVertical); + if (mAssistGestureManager != null) { + mAssistGestureManager.onConfigurationChanged(); } mNotificationPanel.setQsScrimEnabled(!isVertical); } @@ -667,6 +668,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mStackScroller.setLongPressListener(getNotificationLongClicker()); mStackScroller.setPhoneStatusBar(this); mStackScroller.setGroupManager(mGroupManager); + mStackScroller.setHeadsUpManager(mHeadsUpManager); mGroupManager.setOnGroupChangeListener(mStackScroller); mKeyguardIconOverflowContainer = @@ -699,7 +701,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, ScrimView scrimBehind = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_behind); ScrimView scrimInFront = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_in_front); - mScrimController = new ScrimController(scrimBehind, scrimInFront, mScrimSrcModeEnabled); + View headsUpScrim = mStatusBarWindow.findViewById(R.id.heads_up_scrim); + mScrimController = new ScrimController(scrimBehind, scrimInFront, headsUpScrim, + mScrimSrcModeEnabled); + mHeadsUpManager.addListener(mScrimController); + mStackScroller.setScrimController(mScrimController); mScrimController.setBackDropView(mBackdrop); mStatusBarView.setScrimController(mScrimController); mDozeScrimController = new DozeScrimController(mScrimController, context); @@ -834,6 +840,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mBroadcastReceiver.onReceive(mContext, new Intent(pm.isScreenOn() ? Intent.ACTION_SCREEN_ON : Intent.ACTION_SCREEN_OFF)); + mAssistGestureManager = new AssistGestureManager(this, context); + // receive broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); @@ -953,60 +961,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return mStatusBarWindow; } - @Override - protected WindowManager.LayoutParams getSearchLayoutParams(LayoutParams layoutParams) { - boolean opaque = false; - WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, - (opaque ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT)); - if (ActivityManager.isHighEndGfx()) { - lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; - } - lp.gravity = Gravity.BOTTOM | Gravity.START; - lp.setTitle("SearchPanel"); - lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; - return lp; - } - - @Override - protected void updateSearchPanel() { - super.updateSearchPanel(); - if (mNavigationBarView != null) { - mNavigationBarView.setDelegateView(mSearchPanelView); - } - } - - @Override - public void showSearchPanel() { - super.showSearchPanel(); - mHandler.removeCallbacks(mShowSearchPanel); - - // we want to freeze the sysui state wherever it is - mSearchPanelView.setSystemUiVisibility(mSystemUiVisibility); - - if (mNavigationBarView != null) { - WindowManager.LayoutParams lp = - (android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams(); - lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; - mWindowManager.updateViewLayout(mNavigationBarView, lp); - } - } - - @Override - public void hideSearchPanel() { - super.hideSearchPanel(); - if (mNavigationBarView != null) { - WindowManager.LayoutParams lp = - (android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams(); - lp.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; - mWindowManager.updateViewLayout(mNavigationBarView, lp); - } + public void invokeAssistGesture(boolean vibrate) { + mHandler.removeCallbacks(mInvokeAssist); + mAssistGestureManager.onGestureInvoked(vibrate); } public int getStatusBarHeight() { @@ -1036,30 +993,33 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, }; private int mShowSearchHoldoff = 0; - private Runnable mShowSearchPanel = new Runnable() { + private Runnable mInvokeAssist = new Runnable() { public void run() { - showSearchPanel(); + invokeAssistGesture(true /* vibrate */); awakenDreams(); + if (mNavigationBarView != null) { + mNavigationBarView.getHomeButton().abortCurrentGesture(); + } } }; View.OnTouchListener mHomeActionListener = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { - switch(event.getAction()) { + switch (event.getAction()) { case MotionEvent.ACTION_DOWN: - if (!shouldDisableNavbarGestures()) { - mHandler.removeCallbacks(mShowSearchPanel); - mHandler.postDelayed(mShowSearchPanel, mShowSearchHoldoff); - } - break; + if (!shouldDisableNavbarGestures()) { + mHandler.removeCallbacks(mInvokeAssist); + mHandler.postDelayed(mInvokeAssist, mShowSearchHoldoff); + } + break; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - mHandler.removeCallbacks(mShowSearchPanel); - awakenDreams(); - break; - } - return false; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mHandler.removeCallbacks(mInvokeAssist); + awakenDreams(); + break; + } + return false; } }; @@ -1083,7 +1043,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mNavigationBarView.getBackButton().setLongClickable(true); mNavigationBarView.getBackButton().setOnLongClickListener(mLongPressBackRecentsListener); mNavigationBarView.getHomeButton().setOnTouchListener(mHomeActionListener); - updateSearchPanel(); + mAssistGestureManager.onConfigurationChanged(); } // For small-screen devices (read: phones) that lack hardware navigation buttons @@ -1130,32 +1090,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return lp; } - private void addHeadsUpView() { - int headsUpHeight = mContext.getResources() - .getDimensionPixelSize(R.dimen.heads_up_window_height); - WindowManager.LayoutParams lp = new WindowManager.LayoutParams( - LayoutParams.MATCH_PARENT, headsUpHeight, - WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, // above the status bar! - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL - | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, - PixelFormat.TRANSLUCENT); - lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; - lp.gravity = Gravity.TOP; - lp.setTitle("Heads Up"); - lp.packageName = mContext.getPackageName(); - lp.windowAnimations = R.style.Animation_StatusBar_HeadsUp; - - mWindowManager.addView(mHeadsUpNotificationView, lp); - } - - private void removeHeadsUpView() { - mWindowManager.removeView(mHeadsUpNotificationView); - } - public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) { mIconController.addSystemIcon(slot, index, viewIndex, icon); } @@ -1177,32 +1111,17 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void addNotification(StatusBarNotification notification, RankingMap ranking, Entry oldEntry) { if (DEBUG) Log.d(TAG, "addNotification key=" + notification.getKey()); - if (mUseHeadsUp && shouldInterrupt(notification)) { - if (DEBUG) Log.d(TAG, "launching notification in heads up mode"); - Entry interruptionCandidate = oldEntry; - if (interruptionCandidate == null) { - final StatusBarIconView iconView = createIcon(notification); - if (iconView == null) { - return; - } - interruptionCandidate = new Entry(notification, iconView); - } - ViewGroup holder = mHeadsUpNotificationView.getHolder(); - if (inflateViewsForHeadsUp(interruptionCandidate, holder)) { - // 1. Populate mHeadsUpNotificationView - mHeadsUpNotificationView.showNotification(interruptionCandidate); - - // do not show the notification in the shade, yet. - return; - } - } Entry shadeEntry = createNotificationViews(notification); if (shadeEntry == null) { return; } + boolean isHeadsUped = mUseHeadsUp && shouldInterrupt(notification); + if (isHeadsUped) { + mHeadsUpManager.showNotification(shadeEntry); + } - if (notification.getNotification().fullScreenIntent != null) { + if (!isHeadsUped && notification.getNotification().fullScreenIntent != null) { // Stop screensaver if the notification has a full-screen intent. // (like an incoming phone call) awakenDreams(); @@ -1221,18 +1140,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, setAreThereNotifications(); } - public void displayNotificationFromHeadsUp(Entry shadeEntry) { - - // The notification comes from the headsup, let's inflate the normal layout again - inflateViews(shadeEntry, mStackScroller); - shadeEntry.setInterruption(); - shadeEntry.row.setHeadsUp(false); - - addNotificationViews(shadeEntry, null); - // Recalculate the position of the sliding windows and the titles. - setAreThereNotifications(); - } - @Override protected void updateNotificationRanking(RankingMap ranking) { mNotificationData.updateRanking(ranking); @@ -1241,10 +1148,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, @Override public void removeNotification(String key, RankingMap ranking) { - if (ENABLE_HEADS_UP) { - mHeadsUpNotificationView.removeNotification(key); + boolean defferRemoval = false; + if (mHeadsUpManager.isHeadsUp(key)) { + defferRemoval = !mHeadsUpManager.removeNotification(key); + } + if (defferRemoval) { + mLatestRankingMap = ranking; + mHeadsUpEntriesToRemoveOnSwitch.add(mHeadsUpManager.getEntry(key)); + return; } - StatusBarNotification old = removeNotificationViews(key, ranking); if (SPEW) Log.d(TAG, "removeNotification key=" + key + " old=" + old); @@ -1916,6 +1828,74 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, logStateToEventlog(); } + @Override + public void OnPinnedHeadsUpExistChanged(boolean exist, boolean changeImmediatly) { + if (exist) { + mStatusBarWindowManager.setHeadsUpShowing(true); + } else { + Runnable endRunnable = new Runnable() { + @Override + public void run() { + if (!mHeadsUpManager.hasPinnedHeadsUp()) { + mStatusBarWindowManager.setHeadsUpShowing(false); + } + } + }; + if (changeImmediatly) { + endRunnable.run(); + } else { + mStackScroller.performOnAnimationFinished(endRunnable); + } + } + } + + @Override + public void OnHeadsUpPinnedChanged(ExpandableNotificationRow headsUp, boolean isHeadsUp) { + } + + @Override + public void OnHeadsUpStateChanged(Entry entry, boolean isHeadsUp) { + if (!isHeadsUp && mHeadsUpEntriesToRemoveOnSwitch.contains(entry)) { + removeNotification(entry.key, mLatestRankingMap); + mHeadsUpEntriesToRemoveOnSwitch.remove(entry); + if (mHeadsUpEntriesToRemoveOnSwitch.isEmpty()) { + mLatestRankingMap = null; + } + } else { + updateNotificationRanking(null); + } + + } + + protected void updateHeadsUp(String key, Entry entry, boolean shouldInterrupt, + boolean alertAgain) { + final boolean wasHeadsUp = isHeadsUp(key); + if (wasHeadsUp) { + mHeadsUpManager.updateNotification(entry, alertAgain); + if (!shouldInterrupt) { + // We don't want this to be interrupting anymore, lets remove it + mHeadsUpManager.removeNotification(key); + } + } else if (shouldInterrupt && alertAgain) { + // This notification was updated to be a heads-up, show it! + mHeadsUpManager.showNotification(entry); + } + } + + protected void setHeadsUpUser(int newUserId) { + if (mHeadsUpManager != null) { + mHeadsUpManager.setUser(newUserId); + } + } + + public boolean isHeadsUp(String key) { + return mHeadsUpManager.isHeadsUp(key); + } + + protected boolean isSnoozedPackage(StatusBarNotification sbn) { + return mHeadsUpManager.isSnoozed(sbn.getPackageName()); + } + /** * All changes to the status bar and notifications funnel through here and are batched. */ @@ -1932,15 +1912,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, case MSG_CLOSE_PANELS: animateCollapsePanels(); break; - case MSG_SHOW_HEADS_UP: - setHeadsUpVisibility(true); - break; - case MSG_ESCALATE_HEADS_UP: - escalateHeadsUp(); - case MSG_HIDE_HEADS_UP: - mHeadsUpNotificationView.releaseImmediately(); - setHeadsUpVisibility(false); - break; case MSG_LAUNCH_TRANSITION_TIMEOUT: onLaunchTransitionTimeout(); break; @@ -1949,44 +1920,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } @Override - public void scheduleHeadsUpDecay(long delay) { - mHandler.removeMessages(MSG_HIDE_HEADS_UP); - if (mHeadsUpNotificationView.isClearable()) { - mHandler.sendEmptyMessageDelayed(MSG_HIDE_HEADS_UP, delay); - } - } - - @Override - public void scheduleHeadsUpOpen() { - mHandler.removeMessages(MSG_HIDE_HEADS_UP); - mHandler.removeMessages(MSG_SHOW_HEADS_UP); - mHandler.sendEmptyMessage(MSG_SHOW_HEADS_UP); - } - - @Override - public void scheduleHeadsUpClose() { - mHandler.removeMessages(MSG_HIDE_HEADS_UP); - if (mHeadsUpNotificationView.getVisibility() != View.GONE) { - mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP); - } - } - - @Override - public void scheduleHeadsUpEscalation() { - mHandler.removeMessages(MSG_HIDE_HEADS_UP); - mHandler.removeMessages(MSG_ESCALATE_HEADS_UP); - mHandler.sendEmptyMessage(MSG_ESCALATE_HEADS_UP); - } - - /** if the interrupting notification had a fullscreen intent, fire it now. */ - private void escalateHeadsUp() { - if (mHeadsUpNotificationView.getEntry() != null) { - final StatusBarNotification sbn = mHeadsUpNotificationView.getEntry().notification; - mHeadsUpNotificationView.releaseImmediately(); + public void escalateHeadsUp() { + TreeSet<HeadsUpManager.HeadsUpEntry> entries = mHeadsUpManager.getSortedEntries(); + for (HeadsUpManager.HeadsUpEntry entry : entries) { + final StatusBarNotification sbn = entry.entry.notification; final Notification notification = sbn.getNotification(); if (notification.fullScreenIntent != null) { - if (DEBUG) + if (DEBUG) { Log.d(TAG, "converting a heads up to fullScreen"); + } try { EventLog.writeEvent(EventLogTags.SYSUI_HEADS_UP_ESCALATION, sbn.getKey()); @@ -1995,6 +1937,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } } + mHeadsUpManager.releaseAllImmediately(); } boolean panelsEnabled() { @@ -2038,10 +1981,20 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } public void animateCollapsePanels(int flags) { - animateCollapsePanels(flags, false /* force */); + animateCollapsePanels(flags, false /* force */, false /* delayed */, + 1.0f /* speedUpFactor */); } public void animateCollapsePanels(int flags, boolean force) { + animateCollapsePanels(flags, force, false /* delayed */, 1.0f /* speedUpFactor */); + } + + public void animateCollapsePanels(int flags, boolean force, boolean delayed) { + animateCollapsePanels(flags, force, delayed, 1.0f /* speedUpFactor */); + } + + public void animateCollapsePanels(int flags, boolean force, boolean delayed, + float speedUpFactor) { if (!force && (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED)) { runPostCollapseRunnables(); @@ -2060,17 +2013,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } - if ((flags & CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL) == 0) { - mHandler.removeMessages(MSG_CLOSE_SEARCH_PANEL); - mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL); - } - if (mStatusBarWindow != null) { // release focus immediately to kick off focus change transition mStatusBarWindowManager.setStatusBarFocusable(false); mStatusBarWindow.cancelExpandHelper(); - mStatusBarView.collapseAllPanels(true); + mStatusBarView.collapseAllPanels(true /* animate */, delayed, speedUpFactor); } } @@ -2113,7 +2061,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void animateCollapseQuickSettings() { if (mState == StatusBarState.SHADE) { - mStatusBarView.collapseAllPanels(true); + mStatusBarView.collapseAllPanels(true, false /* delayed */, 1.0f /* speedUpFactor */); } } @@ -2126,11 +2074,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } // Ensure the panel is fully collapsed (just in case; bug 6765842, 7260868) - mStatusBarView.collapseAllPanels(/*animate=*/ false); - - // reset things to their proper state - mStackScroller.setVisibility(View.VISIBLE); - mNotificationPanel.setVisibility(View.GONE); + mStatusBarView.collapseAllPanels(/*animate=*/ false, false /* delayed*/, + 1.0f /* speedUpFactor */); mNotificationPanel.closeQs(); @@ -2220,7 +2165,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mStatusBarWindowState = state; if (DEBUG_WINDOW_STATE) Log.d(TAG, "Status bar " + windowStateToString(state)); if (!showing && mState == StatusBarState.SHADE) { - mStatusBarView.collapseAllPanels(false); + mStatusBarView.collapseAllPanels(false /* animate */, false /* delayed */, + 1.0f /* speedUpFactor */); } } if (mNavigationBarView != null @@ -2324,9 +2270,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, boolean allowLight = isTransparentBar && !mBatteryController.isPowerSave(); boolean light = (vis & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0; - mIconController.setIconTint( - (allowLight && light) ? mLightModeIconColor : Color.WHITE); - + mIconController.setIconsDark(allowLight && light); } // restore the recents bit if (wasRecentsVisible) { @@ -2527,8 +2471,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, pw.println(Settings.Global.zenModeToString(mZenMode)); pw.print(" mUseHeadsUp="); pw.println(mUseHeadsUp); - pw.print(" interrupting package: "); - pw.println(hunStateToString(mHeadsUpNotificationView.getEntry())); dumpBarTransitions(pw, "mStatusBarView", mStatusBarView.getBarTransitions()); if (mNavigationBarView != null) { pw.print(" mNavigationBarWindowState="); @@ -2620,15 +2562,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mSecurityController != null) { mSecurityController.dump(fd, pw, args); } - if (mHeadsUpNotificationView != null) { - mHeadsUpNotificationView.dump(fd, pw, args); + if (mHeadsUpManager != null) { + mHeadsUpManager.dump(fd, pw, args); } else { - pw.println(" mHeadsUpNotificationView: null"); + pw.println(" mHeadsUpManager: null"); } pw.println("SharedPreferences:"); - for (Map.Entry<String, ?> entry : mContext.getSharedPreferences(mContext.getPackageName(), - Context.MODE_PRIVATE).getAll().entrySet()) { + for (Map.Entry<String, ?> entry : Prefs.getAll(mContext).entrySet()) { pw.print(" "); pw.print(entry.getKey()); pw.print("="); pw.println(entry.getValue()); } } @@ -2697,8 +2638,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } }); if (dismissShade) { - animateCollapsePanels( - CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, true /* force */); + animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, true /* force */, + true /* delayed*/); } return true; } @@ -2722,7 +2663,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, else if (Intent.ACTION_SCREEN_OFF.equals(action)) { mScreenOn = false; notifyNavigationBarScreenOn(false); - notifyHeadsUpScreenOn(false); + notifyHeadsUpScreenOff(); finishBarAnimations(); resetUserExpandedStates(); } @@ -2814,15 +2755,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mUserSetupObserver, mCurrentUserId); } - private void setHeadsUpVisibility(boolean vis) { - if (!ENABLE_HEADS_UP) return; - if (DEBUG) Log.v(TAG, (vis ? "showing" : "hiding") + " heads up window"); - EventLog.writeEvent(EventLogTags.SYSUI_HEADS_UP_STATUS, - vis ? mHeadsUpNotificationView.getKey() : "", - vis ? 1 : 0); - mHeadsUpNotificationView.setVisibility(vis ? View.VISIBLE : View.GONE); - } - /** * Reload some of our resources when the configuration changes. * @@ -2841,9 +2773,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mNotificationPanel != null) { mNotificationPanel.updateResources(); } - if (mHeadsUpNotificationView != null) { - mHeadsUpNotificationView.updateResources(); - } if (mBrightnessMirrorController != null) { mBrightnessMirrorController.updateResources(); } @@ -2989,7 +2918,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, }; @Override - protected boolean shouldDisableNavbarGestures() { + public boolean shouldDisableNavbarGestures() { return !isDeviceProvisioned() || mExpandedVisible || (mDisabled & StatusBarManager.DISABLE_SEARCH) != 0; @@ -3058,6 +2987,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mHandlerThread = null; } mContext.unregisterReceiver(mBroadcastReceiver); + mAssistGestureManager.destroy(); } private boolean mDemoModeAllowed; @@ -3337,8 +3267,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) { mScrimController.setKeyguardShowing(true); + mIconPolicy.setKeyguardShowing(true); } else { mScrimController.setKeyguardShowing(false); + mIconPolicy.setKeyguardShowing(false); } mNotificationPanel.setBarState(mState, mKeyguardFadingAway, goingToFullShade); updateDozingState(); @@ -3773,6 +3705,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (!mKeyguardFadingAway) { mIconController.appTransitionStarting(startTime, duration); } + if (mIconPolicy != null) { + mIconPolicy.appTransitionStarting(startTime, duration); + } } private final class ShadeUpdates { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 2236aae..fb42ba1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -16,16 +16,22 @@ package com.android.systemui.statusbar.phone; +import android.app.ActivityManagerNative; import android.app.AlarmManager; +import android.app.IUserSwitchObserver; import android.app.StatusBarManager; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.UserInfo; import android.media.AudioManager; import android.os.Handler; +import android.os.IRemoteCallback; +import android.os.RemoteException; import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings.Global; import android.telecom.TelecomManager; import android.util.Log; @@ -54,6 +60,7 @@ public class PhoneStatusBarPolicy { private static final String SLOT_ZEN = "zen"; private static final String SLOT_VOLUME = "volume"; private static final String SLOT_ALARM_CLOCK = "alarm_clock"; + private static final String SLOT_MANAGED_PROFILE = "managed_profile"; private final Context mContext; private final StatusBarManager mService; @@ -72,6 +79,10 @@ public class PhoneStatusBarPolicy { private boolean mBluetoothEnabled = false; + private boolean mManagedProfileFocused = false; + private boolean mManagedProfileIconVisible = true; + + private boolean mKeyguardVisible = true; private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override @@ -94,9 +105,6 @@ public class PhoneStatusBarPolicy { else if (action.equals(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED)) { updateTTY(intent); } - else if (action.equals(Intent.ACTION_USER_SWITCHED)) { - updateAlarm(); - } } }; @@ -115,9 +123,15 @@ public class PhoneStatusBarPolicy { filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED); - filter.addAction(Intent.ACTION_USER_SWITCHED); mContext.registerReceiver(mIntentReceiver, filter, null, mHandler); + // listen for user / profile change. + try { + ActivityManagerNative.getDefault().registerUserSwitchObserver(mUserSwitchListener); + } catch (RemoteException e) { + // Ignore + } + // TTY status mService.setIcon(SLOT_TTY, R.drawable.stat_sys_tty_mode, 0, null); mService.setIconVisibility(SLOT_TTY, false); @@ -147,6 +161,10 @@ public class PhoneStatusBarPolicy { mService.setIcon(SLOT_HOTSPOT, R.drawable.stat_sys_hotspot, 0, null); mService.setIconVisibility(SLOT_HOTSPOT, mHotspot.isHotspotEnabled()); mHotspot.addCallback(mHotspotCallback); + + // managed profile + mService.setIcon(SLOT_MANAGED_PROFILE, R.drawable.stat_sys_managed_profile_status, 0, null); + mService.setIconVisibility(SLOT_MANAGED_PROFILE, false); } public void setZenMode(int zen) { @@ -199,7 +217,7 @@ public class PhoneStatusBarPolicy { int volumeIconId = 0; String volumeDescription = null; - if (DndTile.isVisible(mContext)) { + if (DndTile.isVisible(mContext) || DndTile.isCombinedIcon(mContext)) { zenVisible = mZen != Global.ZEN_MODE_OFF; zenIconId = R.drawable.stat_sys_dnd; zenDescription = mContext.getString(R.string.quick_settings_dnd_label); @@ -218,7 +236,7 @@ public class PhoneStatusBarPolicy { volumeVisible = true; volumeIconId = R.drawable.stat_sys_ringer_silent; volumeDescription = mContext.getString(R.string.accessibility_ringer_silent); - } else if (mZen != Global.ZEN_MODE_NO_INTERRUPTIONS && + } else if (mZen != Global.ZEN_MODE_NO_INTERRUPTIONS && mZen != Global.ZEN_MODE_ALARMS && audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) { volumeVisible = true; volumeIconId = R.drawable.stat_sys_ringer_vibrate; @@ -298,6 +316,53 @@ public class PhoneStatusBarPolicy { mService.setIconVisibility(SLOT_CAST, isCasting); } + private void profileChanged(int userId) { + UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + UserInfo user = null; + if (userId == UserHandle.USER_CURRENT) { + try { + user = ActivityManagerNative.getDefault().getCurrentUser(); + } catch (RemoteException e) { + // Ignore + } + } else { + user = userManager.getUserInfo(userId); + } + + mManagedProfileFocused = user != null && user.isManagedProfile(); + if (DEBUG) Log.v(TAG, "profileChanged: mManagedProfileFocused: " + mManagedProfileFocused); + // Actually update the icon later when transition starts. + } + + private void updateManagedProfile() { + if (DEBUG) Log.v(TAG, "updateManagedProfile: mManagedProfileFocused: " + + mManagedProfileFocused + + " mKeyguardVisible: " + mKeyguardVisible); + boolean showIcon = mManagedProfileFocused && !mKeyguardVisible; + if (mManagedProfileIconVisible != showIcon) { + mService.setIconVisibility(SLOT_MANAGED_PROFILE, showIcon); + mManagedProfileIconVisible = showIcon; + } + } + + private final IUserSwitchObserver.Stub mUserSwitchListener = + new IUserSwitchObserver.Stub() { + @Override + public void onUserSwitching(int newUserId, IRemoteCallback reply) { + } + + @Override + public void onUserSwitchComplete(int newUserId) throws RemoteException { + updateAlarm(); + profileChanged(newUserId); + } + + @Override + public void onForegroundProfileSwitch(int newProfileId) { + profileChanged(newProfileId); + } + }; + private final HotspotController.Callback mHotspotCallback = new HotspotController.Callback() { @Override public void onHotspotChanged(boolean enabled) { @@ -311,4 +376,13 @@ public class PhoneStatusBarPolicy { updateCast(); } }; + + public void appTransitionStarting(long startTime, long duration) { + updateManagedProfile(); + } + + public void setKeyguardShowing(boolean visible) { + mKeyguardVisible = visible; + updateManagedProfile(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 0e8a794..e701783 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Color; @@ -29,13 +30,18 @@ import android.view.animation.Interpolator; import com.android.systemui.R; import com.android.systemui.statusbar.BackDropView; +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.ScrimView; +import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.stack.StackStateAnimator; /** * Controls both the scrim behind the notifications and in front of the notifications (when a * security method gets shown). */ -public class ScrimController implements ViewTreeObserver.OnPreDrawListener { +public class ScrimController implements ViewTreeObserver.OnPreDrawListener, + HeadsUpManager.OnHeadsUpChangedListener { public static final long ANIMATION_DURATION = 220; private static final float SCRIM_BEHIND_ALPHA = 0.62f; @@ -43,10 +49,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { private static final float SCRIM_BEHIND_ALPHA_UNLOCKING = 0.2f; private static final float SCRIM_IN_FRONT_ALPHA = 0.75f; private static final int TAG_KEY_ANIM = R.id.scrim; + private static final int TAG_HUN_START_ALPHA = R.id.hun_scrim_alpha_start; + private static final int TAG_HUN_END_ALPHA = R.id.hun_scrim_alpha_end; private final ScrimView mScrimBehind; private final ScrimView mScrimInFront; private final UnlockMethodCache mUnlockMethodCache; + private final View mHeadsUpScrim; private boolean mKeyguardShowing; private float mFraction; @@ -70,15 +79,22 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { private float mDozeBehindAlpha; private float mCurrentInFrontAlpha; private float mCurrentBehindAlpha; + private float mCurrentHeadsUpAlpha = 1; + private int mAmountOfPinnedHeadsUps; + private float mTopHeadsUpDragAmount; + private View mDraggedHeadsUpView; - public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, boolean scrimSrcEnabled) { + public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim, + boolean scrimSrcEnabled) { mScrimBehind = scrimBehind; mScrimInFront = scrimInFront; + mHeadsUpScrim = headsUpScrim; final Context context = scrimBehind.getContext(); mUnlockMethodCache = UnlockMethodCache.getInstance(context); mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, android.R.interpolator.linear_out_slow_in); mScrimSrcEnabled = scrimSrcEnabled; + updateHeadsUpScrim(false); } public void setKeyguardShowing(boolean showing) { @@ -217,7 +233,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { } } - private void setScrimColor(ScrimView scrim, float alpha) { + private void setScrimColor(View scrim, float alpha) { Object runningAnim = scrim.getTag(TAG_KEY_ANIM); if (runningAnim instanceof ValueAnimator) { ((ValueAnimator) runningAnim).cancel(); @@ -236,25 +252,34 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { } private float getCurrentScrimAlpha(View scrim) { - return scrim == mScrimBehind ? mCurrentBehindAlpha : mCurrentInFrontAlpha; + return scrim == mScrimBehind ? mCurrentBehindAlpha + : scrim == mScrimInFront ? mCurrentInFrontAlpha + : mCurrentHeadsUpAlpha; } private void setCurrentScrimAlpha(View scrim, float alpha) { if (scrim == mScrimBehind) { mCurrentBehindAlpha = alpha; - } else { + } else if (scrim == mScrimInFront) { mCurrentInFrontAlpha = alpha; + } else { + alpha = Math.max(0.0f, Math.min(1.0f, alpha)); + mCurrentHeadsUpAlpha = alpha; } } - private void updateScrimColor(ScrimView scrim) { + private void updateScrimColor(View scrim) { float alpha1 = getCurrentScrimAlpha(scrim); - float alpha2 = getDozeAlpha(scrim); - float alpha = 1 - (1 - alpha1) * (1 - alpha2); - scrim.setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0)); + if (scrim instanceof ScrimView) { + float alpha2 = getDozeAlpha(scrim); + float alpha = 1 - (1 - alpha1) * (1 - alpha2); + ((ScrimView) scrim).setScrimColor(Color.argb((int) (alpha * 255), 0, 0, 0)); + } else { + scrim.setAlpha(alpha1); + } } - private void startScrimAnimation(final ScrimView scrim, float target) { + private void startScrimAnimation(final View scrim, float target) { float current = getCurrentScrimAlpha(scrim); ValueAnimator anim = ValueAnimator.ofFloat(current, target); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @@ -320,4 +345,84 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener { boolean asSrc = mBackDropView.getVisibility() != View.VISIBLE && mScrimSrcEnabled; mScrimBehind.setDrawAsSrc(asSrc); } + + @Override + public void OnPinnedHeadsUpExistChanged(boolean exist, boolean changeImmediatly) { + } + + @Override + public void OnHeadsUpPinnedChanged(ExpandableNotificationRow headsUp, boolean isHeadsUp) { + if (isHeadsUp) { + mAmountOfPinnedHeadsUps++; + } else { + mAmountOfPinnedHeadsUps--; + if (headsUp == mDraggedHeadsUpView) { + mDraggedHeadsUpView = null; + mTopHeadsUpDragAmount = 0.0f; + } + } + updateHeadsUpScrim(true); + } + + @Override + public void OnHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) { + } + + private void updateHeadsUpScrim(boolean animate) { + float alpha = calculateHeadsUpAlpha(); + ValueAnimator previousAnimator = StackStateAnimator.getChildTag(mHeadsUpScrim, + TAG_KEY_ANIM); + float animEndValue = -1; + if (previousAnimator != null) { + if ((animate || alpha == mCurrentHeadsUpAlpha)) { + // lets cancel any running animators + previousAnimator.cancel(); + } + animEndValue = StackStateAnimator.getChildTag(mHeadsUpScrim, + TAG_HUN_START_ALPHA); + } + if (alpha != mCurrentHeadsUpAlpha && alpha != animEndValue) { + if (animate) { + startScrimAnimation(mHeadsUpScrim, alpha); + mHeadsUpScrim.setTag(TAG_HUN_START_ALPHA, mCurrentHeadsUpAlpha); + mHeadsUpScrim.setTag(TAG_HUN_END_ALPHA, alpha); + } else { + if (previousAnimator != null) { + float previousStartValue = StackStateAnimator.getChildTag(mHeadsUpScrim, + TAG_HUN_START_ALPHA); + float previousEndValue = StackStateAnimator.getChildTag(mHeadsUpScrim, + TAG_HUN_END_ALPHA); + // we need to increase all animation keyframes of the previous animator by the + // relative change to the end value + PropertyValuesHolder[] values = previousAnimator.getValues(); + float relativeDiff = alpha - previousEndValue; + float newStartValue = previousStartValue + relativeDiff; + values[0].setFloatValues(newStartValue, alpha); + mHeadsUpScrim.setTag(TAG_HUN_START_ALPHA, newStartValue); + mHeadsUpScrim.setTag(TAG_HUN_END_ALPHA, alpha); + previousAnimator.setCurrentPlayTime(previousAnimator.getCurrentPlayTime()); + } else { + // update the alpha directly + setCurrentScrimAlpha(mHeadsUpScrim, alpha); + updateScrimColor(mHeadsUpScrim); + } + } + } + } + + public void setTopHeadsUpDragAmount(View draggedHeadsUpView, float topHeadsUpDragAmount) { + mTopHeadsUpDragAmount = topHeadsUpDragAmount; + mDraggedHeadsUpView = draggedHeadsUpView; + updateHeadsUpScrim(false); + } + + private float calculateHeadsUpAlpha() { + if (mAmountOfPinnedHeadsUps >= 2) { + return 1.0f; + } else if (mAmountOfPinnedHeadsUps == 0) { + return 0.0f; + } else { + return 1.0f - mTopHeadsUpDragAmount; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index c49f620..45da297 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -16,11 +16,11 @@ package com.android.systemui.statusbar.phone; +import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; -import android.graphics.PorterDuff; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; @@ -74,12 +74,16 @@ public class StatusBarIconController { private int mIconHPadding; private int mIconTint = Color.WHITE; + private float mDarkIntensity; private boolean mTransitionPending; private boolean mTintChangePending; - private int mPendingIconTint; + private float mPendingDarkIntensity; private ValueAnimator mTintAnimator; + private int mDarkModeIconColorSingleTone; + private int mLightModeIconColorSingleTone; + private final Handler mHandler; private boolean mTransitionDeferring; private long mTransitionDeferringStartTime; @@ -111,6 +115,8 @@ public class StatusBarIconController { android.R.interpolator.linear_out_slow_in); mFastOutSlowIn = AnimationUtils.loadInterpolator(mContext, android.R.interpolator.fast_out_slow_in); + mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone); + mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone); mHandler = new Handler(); updateResources(); } @@ -296,30 +302,31 @@ public class StatusBarIconController { } } - public void setIconTint(int tint) { + public void setIconsDark(boolean dark) { if (mTransitionPending) { - deferIconTintChange(tint); + deferIconTintChange(dark ? 1.0f : 0.0f); } else if (mTransitionDeferring) { - animateIconTint(tint, + animateIconTint(dark ? 1.0f : 0.0f, Math.max(0, mTransitionDeferringStartTime - SystemClock.uptimeMillis()), mTransitionDeferringDuration); } else { - animateIconTint(tint, 0 /* delay */, DEFAULT_TINT_ANIMATION_DURATION); + animateIconTint(dark ? 1.0f : 0.0f, 0 /* delay */, DEFAULT_TINT_ANIMATION_DURATION); } } - private void animateIconTint(int targetTint, long delay, long duration) { + private void animateIconTint(float targetDarkIntensity, long delay, + long duration) { if (mTintAnimator != null) { mTintAnimator.cancel(); } - if (mIconTint == targetTint) { + if (mDarkIntensity == targetDarkIntensity) { return; } - mTintAnimator = ValueAnimator.ofArgb(mIconTint, targetTint); + mTintAnimator = ValueAnimator.ofFloat(mDarkIntensity, targetDarkIntensity); mTintAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { - setIconTintInternal((Integer) animation.getAnimatedValue()); + setIconTintInternal((Float) animation.getAnimatedValue()); } }); mTintAnimator.setDuration(duration); @@ -327,17 +334,20 @@ public class StatusBarIconController { mTintAnimator.setInterpolator(mFastOutSlowIn); mTintAnimator.start(); } - private void setIconTintInternal(int tint) { - mIconTint = tint; + + private void setIconTintInternal(float darkIntensity) { + mDarkIntensity = darkIntensity; + mIconTint = (int) ArgbEvaluator.getInstance().evaluate(darkIntensity, + mLightModeIconColorSingleTone, mDarkModeIconColorSingleTone); applyIconTint(); } - private void deferIconTintChange(int tint) { - if (mTintChangePending && tint == mPendingIconTint) { + private void deferIconTintChange(float darkIntensity) { + if (mTintChangePending && darkIntensity == mPendingDarkIntensity) { return; } mTintChangePending = true; - mPendingIconTint = tint; + mPendingDarkIntensity = darkIntensity; } private void applyIconTint() { @@ -345,9 +355,9 @@ public class StatusBarIconController { StatusBarIconView v = (StatusBarIconView) mStatusIcons.getChildAt(i); v.setImageTintList(ColorStateList.valueOf(mIconTint)); } - mSignalCluster.setIconTint(mIconTint); + mSignalCluster.setIconTint(mIconTint, mDarkIntensity); mMoreIcon.setImageTintList(ColorStateList.valueOf(mIconTint)); - mBatteryMeterView.setIconTint(mIconTint); + mBatteryMeterView.setDarkIntensity(mDarkIntensity); mClock.setTextColor(mIconTint); applyNotificationIconsTint(); } @@ -358,7 +368,6 @@ public class StatusBarIconController { boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L)); boolean colorize = !isPreL || isGrayscale(v); if (colorize) { - v.setImageTintMode(PorterDuff.Mode.SRC_ATOP); v.setImageTintList(ColorStateList.valueOf(mIconTint)); } } @@ -381,7 +390,7 @@ public class StatusBarIconController { public void appTransitionCancelled() { if (mTransitionPending && mTintChangePending) { mTintChangePending = false; - animateIconTint(mPendingIconTint, 0 /* delay */, DEFAULT_TINT_ANIMATION_DURATION); + animateIconTint(mPendingDarkIntensity, 0 /* delay */, DEFAULT_TINT_ANIMATION_DURATION); } mTransitionPending = false; } @@ -389,7 +398,7 @@ public class StatusBarIconController { public void appTransitionStarting(long startTime, long duration) { if (mTransitionPending && mTintChangePending) { mTintChangePending = false; - animateIconTint(mPendingIconTint, + animateIconTint(mPendingDarkIntensity, Math.max(0, startTime - SystemClock.uptimeMillis()), duration); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 6369d5e..194a19a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -441,7 +441,8 @@ public class StatusBarKeyguardViewManager { mPhoneStatusBar.keyguardGoingAway(); } - public void animateCollapsePanels() { - mPhoneStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */); + public void animateCollapsePanels(float speedUpFactor) { + mPhoneStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */, + false /* delayed */, speedUpFactor); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index 63bbf97..84a9f64 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -130,7 +130,7 @@ public class StatusBarWindowManager { private void applyHeight(State state) { boolean expanded = state.isKeyguardShowingAndNotOccluded() || state.statusBarExpanded - || state.keyguardFadingAway || state.bouncerShowing; + || state.keyguardFadingAway || state.bouncerShowing || state.headsUpShowing; if (expanded) { mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT; } else { @@ -172,11 +172,20 @@ public class StatusBarWindowManager { applyUserActivityTimeout(state); applyInputFeatures(state); applyFitsSystemWindows(state); + applyModalFlag(state); if (mLp.copyFrom(mLpChanged) != 0) { mWindowManager.updateViewLayout(mStatusBarView, mLp); } } + private void applyModalFlag(State state) { + if (state.headsUpShowing) { + mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + } else { + mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + } + } + public void setKeyguardShowing(boolean showing) { mCurrentState.keyguardShowing = showing; apply(mCurrentState); @@ -218,6 +227,11 @@ public class StatusBarWindowManager { apply(mCurrentState); } + public void setHeadsUpShowing(boolean showing) { + mCurrentState.headsUpShowing = showing; + apply(mCurrentState); + } + /** * @param state The {@link StatusBarState} of the status bar. */ @@ -235,6 +249,7 @@ public class StatusBarWindowManager { boolean bouncerShowing; boolean keyguardFadingAway; boolean qsExpanded; + boolean headsUpShowing; /** * The {@link BaseStatusBar} state from the status bar. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java new file mode 100644 index 0000000..dccf2e2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java @@ -0,0 +1,525 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy; + +import android.content.Context; +import android.content.res.Resources; +import android.database.ContentObserver; +import android.os.Handler; +import android.os.SystemClock; +import android.provider.Settings; +import android.util.ArrayMap; +import android.util.Log; +import android.util.Pools; +import android.view.ViewTreeObserver; +import android.view.accessibility.AccessibilityEvent; + +import com.android.systemui.R; +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.NotificationData; +import com.android.systemui.statusbar.phone.PhoneStatusBar; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Stack; +import java.util.TreeSet; + +public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsListener { + private static final String TAG = "HeadsUpManager"; + private static final boolean DEBUG = false; + private static final String SETTING_HEADS_UP_SNOOZE_LENGTH_MS = "heads_up_snooze_length_ms"; + + private final int mHeadsUpNotificationDecay; + private final int mMinimumDisplayTime; + + private final int mTouchSensitivityDelay; + private final ArrayMap<String, Long> mSnoozedPackages; + private final HashSet<OnHeadsUpChangedListener> mListeners = new HashSet<>(); + private final int mDefaultSnoozeLengthMs; + private final Handler mHandler = new Handler(); + private final Pools.Pool<HeadsUpEntry> mEntryPool = new Pools.Pool<HeadsUpEntry>() { + + private Stack<HeadsUpEntry> mPoolObjects = new Stack<>(); + + @Override + public HeadsUpEntry acquire() { + if (!mPoolObjects.isEmpty()) { + return mPoolObjects.pop(); + } + return new HeadsUpEntry(); + } + + @Override + public boolean release(HeadsUpEntry instance) { + instance.removeAutoCancelCallbacks(); + mPoolObjects.push(instance); + return true; + } + }; + + + private PhoneStatusBar mBar; + private int mSnoozeLengthMs; + private ContentObserver mSettingsObserver; + private HashMap<String, HeadsUpEntry> mHeadsUpEntries = new HashMap<>(); + private TreeSet<HeadsUpEntry> mSortedEntries = new TreeSet<>(); + private HashSet<String> mSwipedOutKeys = new HashSet<>(); + private int mUser; + private Clock mClock; + private boolean mReleaseOnExpandFinish; + private boolean mTrackingHeadsUp; + private HashSet<NotificationData.Entry> mEntriesToRemoveAfterExpand = new HashSet<>(); + private boolean mIsExpanded; + private boolean mHasPinnedHeadsUp; + private int[] mTmpTwoArray = new int[2]; + + public HeadsUpManager(final Context context, ViewTreeObserver observer) { + Resources resources = context.getResources(); + mTouchSensitivityDelay = resources.getInteger(R.integer.heads_up_sensitivity_delay); + if (DEBUG) Log.v(TAG, "create() " + mTouchSensitivityDelay); + mSnoozedPackages = new ArrayMap<>(); + mDefaultSnoozeLengthMs = resources.getInteger(R.integer.heads_up_default_snooze_length_ms); + mSnoozeLengthMs = mDefaultSnoozeLengthMs; + mMinimumDisplayTime = resources.getInteger(R.integer.heads_up_notification_minimum_time); + mHeadsUpNotificationDecay = resources.getInteger(R.integer.heads_up_notification_decay); + mClock = new Clock(); + + mSnoozeLengthMs = Settings.Global.getInt(context.getContentResolver(), + SETTING_HEADS_UP_SNOOZE_LENGTH_MS, mDefaultSnoozeLengthMs); + mSettingsObserver = new ContentObserver(mHandler) { + @Override + public void onChange(boolean selfChange) { + final int packageSnoozeLengthMs = Settings.Global.getInt( + context.getContentResolver(), SETTING_HEADS_UP_SNOOZE_LENGTH_MS, -1); + if (packageSnoozeLengthMs > -1 && packageSnoozeLengthMs != mSnoozeLengthMs) { + mSnoozeLengthMs = packageSnoozeLengthMs; + if (DEBUG) Log.v(TAG, "mSnoozeLengthMs = " + mSnoozeLengthMs); + } + } + }; + context.getContentResolver().registerContentObserver( + Settings.Global.getUriFor(SETTING_HEADS_UP_SNOOZE_LENGTH_MS), false, + mSettingsObserver); + if (DEBUG) Log.v(TAG, "mSnoozeLengthMs = " + mSnoozeLengthMs); + observer.addOnComputeInternalInsetsListener(this); + } + + public void setBar(PhoneStatusBar bar) { + mBar = bar; + } + + public void addListener(OnHeadsUpChangedListener listener) { + mListeners.add(listener); + } + + public PhoneStatusBar getBar() { + return mBar; + } + + /** + * Called when posting a new notification to the heads up. + */ + public void showNotification(NotificationData.Entry headsUp) { + if (DEBUG) Log.v(TAG, "showNotification"); + addHeadsUpEntry(headsUp); + updateNotification(headsUp, true); + headsUp.setInterruption(); + } + + /** + * Called when updating or posting a notification to the heads up. + */ + public void updateNotification(NotificationData.Entry headsUp, boolean alert) { + if (DEBUG) Log.v(TAG, "updateNotification"); + + headsUp.row.setChildrenExpanded(false /* expanded */, false /* animated */); + headsUp.row.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + + if (alert) { + HeadsUpEntry headsUpEntry = mHeadsUpEntries.get(headsUp.key); + headsUpEntry.updateEntry(); + setEntryToShade(headsUpEntry, mIsExpanded, false /* justAdded */, false); + } + } + + private void addHeadsUpEntry(NotificationData.Entry entry) { + HeadsUpEntry headsUpEntry = mEntryPool.acquire(); + + // This will also add the entry to the sortedList + headsUpEntry.setEntry(entry); + mHeadsUpEntries.put(entry.key, headsUpEntry); + entry.row.setHeadsUp(true); + setEntryToShade(headsUpEntry, mIsExpanded /* inShade */, true /* justAdded */, false); + for (OnHeadsUpChangedListener listener : mListeners) { + listener.OnHeadsUpStateChanged(entry, true); + } + entry.row.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + } + + private void setEntryToShade(HeadsUpEntry headsUpEntry, boolean inShade, boolean justAdded, + boolean forceImmediate) { + ExpandableNotificationRow row = headsUpEntry.entry.row; + if (row.isInShade() != inShade || justAdded) { + row.setInShade(inShade); + if (!justAdded || !inShade) { + updatePinnedHeadsUpState(forceImmediate); + for (OnHeadsUpChangedListener listener : mListeners) { + listener.OnHeadsUpPinnedChanged(row, !inShade); + } + } + } + } + + private void removeHeadsUpEntry(NotificationData.Entry entry) { + HeadsUpEntry remove = mHeadsUpEntries.remove(entry.key); + mSortedEntries.remove(remove); + mEntryPool.release(remove); + entry.row.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + entry.row.setHeadsUp(false); + setEntryToShade(remove, true /* inShade */, false /* justAdded */, + false /* forceImmediate */); + for (OnHeadsUpChangedListener listener : mListeners) { + listener.OnHeadsUpStateChanged(entry, false); + } + } + + private void updatePinnedHeadsUpState(boolean forceImmediate) { + boolean hasPinnedHeadsUp = hasPinnedHeadsUpInternal(); + if (hasPinnedHeadsUp == mHasPinnedHeadsUp) { + return; + } + mHasPinnedHeadsUp = hasPinnedHeadsUp; + for (OnHeadsUpChangedListener listener :mListeners) { + listener.OnPinnedHeadsUpExistChanged(hasPinnedHeadsUp, forceImmediate); + } + } + + /** + * React to the removal of the notification in the heads up. + * + * @return true if the notification was removed and false if it still needs to be kept around + * for a bit since it wasn't shown long enough + */ + public boolean removeNotification(String key) { + if (DEBUG) Log.v(TAG, "remove"); + if (wasShownLongEnough(key)) { + releaseImmediately(key); + return true; + } else { + getHeadsUpEntry(key).hideAsSoonAsPossible(); + return false; + } + } + + private boolean wasShownLongEnough(String key) { + HeadsUpEntry headsUpEntry = getHeadsUpEntry(key); + HeadsUpEntry topEntry = getTopEntry(); + if (mSwipedOutKeys.contains(key)) { + // We always instantly dismiss views being manually swiped out. + mSwipedOutKeys.remove(key); + return true; + } + if (headsUpEntry != topEntry) { + return true; + } + return headsUpEntry.wasShownLongEnough(); + } + + public boolean isHeadsUp(String key) { + return mHeadsUpEntries.containsKey(key); + } + + + /** + * Push any current Heads Up notification down into the shade. + */ + public void releaseAllImmediately() { + if (DEBUG) Log.v(TAG, "releaseAllImmediately"); + HashSet<String> keys = new HashSet<>(mHeadsUpEntries.keySet()); + for (String key: keys) { + releaseImmediately(key); + } + } + + public void releaseImmediately(String key) { + HeadsUpEntry headsUpEntry = getHeadsUpEntry(key); + if (headsUpEntry == null) { + return; + } + NotificationData.Entry shadeEntry = headsUpEntry.entry; + removeHeadsUpEntry(shadeEntry); + } + + public boolean isSnoozed(String packageName) { + final String key = snoozeKey(packageName, mUser); + Long snoozedUntil = mSnoozedPackages.get(key); + if (snoozedUntil != null) { + if (snoozedUntil > SystemClock.elapsedRealtime()) { + if (DEBUG) Log.v(TAG, key + " snoozed"); + return true; + } + mSnoozedPackages.remove(packageName); + } + return false; + } + + public void snooze() { + for (String key: mHeadsUpEntries.keySet()) { + HeadsUpEntry entry = mHeadsUpEntries.get(key); + String packageName = entry.entry.notification.getPackageName(); + mSnoozedPackages.put(snoozeKey(packageName, mUser), + SystemClock.elapsedRealtime() + mSnoozeLengthMs); + } + mReleaseOnExpandFinish = true; + } + + private static String snoozeKey(String packageName, int user) { + return user + "," + packageName; + } + + private HeadsUpEntry getHeadsUpEntry(String key) { + return mHeadsUpEntries.get(key); + } + + public NotificationData.Entry getEntry(String key) { + return mHeadsUpEntries.get(key).entry; + } + + public TreeSet<HeadsUpEntry> getSortedEntries() { + return mSortedEntries; + } + + public HeadsUpEntry getTopEntry() { + return mSortedEntries.isEmpty() ? null : mSortedEntries.first(); + } + + /** + * @param key the key of the touched notification + * @return whether the touch is valid and should not be discarded + */ + public boolean shouldSwallowClick(String key) { + if (mClock.currentTimeMillis() < mHeadsUpEntries.get(key).postTime) { + return true; + } + return false; + } + + public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { + if (!mIsExpanded && mHasPinnedHeadsUp) { + int minX = Integer.MAX_VALUE; + int maxX = 0; + int minY = Integer.MAX_VALUE; + int maxY = 0; + for (HeadsUpEntry entry: mSortedEntries) { + ExpandableNotificationRow row = entry.entry.row; + if (!row.isInShade()) { + row.getLocationOnScreen(mTmpTwoArray); + minX = Math.min(minX, mTmpTwoArray[0]); + minY = Math.min(minY, 0); + maxX = Math.max(maxX, mTmpTwoArray[0] + row.getWidth()); + maxY = Math.max(maxY, row.getHeadsUpHeight()); + } + } + + info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); + info.touchableRegion.set(minX, minY, maxX, maxY); + } + } + + public void setUser(int user) { + mUser = user; + } + + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("HeadsUpManager state:"); + pw.print(" mTouchSensitivityDelay="); pw.println(mTouchSensitivityDelay); + pw.print(" mSnoozeLengthMs="); pw.println(mSnoozeLengthMs); + pw.print(" now="); pw.println(SystemClock.elapsedRealtime()); + pw.print(" mUser="); pw.println(mUser); + for (HeadsUpEntry entry: mSortedEntries) { + pw.print(" HeadsUpEntry="); pw.println(entry.entry); + } + int N = mSnoozedPackages.size(); + pw.println(" snoozed packages: " + N); + for (int i = 0; i < N; i++) { + pw.print(" "); pw.print(mSnoozedPackages.valueAt(i)); + pw.print(", "); pw.println(mSnoozedPackages.keyAt(i)); + } + } + + public boolean hasPinnedHeadsUp() { + return mHasPinnedHeadsUp; + } + + private boolean hasPinnedHeadsUpInternal() { + for (String key: mHeadsUpEntries.keySet()) { + HeadsUpEntry entry = mHeadsUpEntries.get(key); + if (!entry.entry.row.isInShade()) { + return true; + } + } + return false; + } + + public void addSwipedOutKey(String key) { + mSwipedOutKeys.add(key); + } + + public float getHighestPinnedHeadsUp() { + float max = 0; + for (HeadsUpEntry entry: mSortedEntries) { + if (!entry.entry.row.isInShade()) { + max = Math.max(max, entry.entry.row.getActualHeight()); + } + } + return max; + } + + public void releaseAllToShade() { + for (String key: mHeadsUpEntries.keySet()) { + HeadsUpEntry entry = mHeadsUpEntries.get(key); + setEntryToShade(entry, true /* toShade */, false /* justAdded */, + true /* forceImmediate */); + } + } + + public void onExpandingFinished() { + if (mReleaseOnExpandFinish) { + releaseAllImmediately(); + mReleaseOnExpandFinish = false; + } else { + for (NotificationData.Entry entry : mEntriesToRemoveAfterExpand) { + removeHeadsUpEntry(entry); + } + mEntriesToRemoveAfterExpand.clear(); + } + } + + public void setTrackingHeadsUp(boolean trackingHeadsUp) { + mTrackingHeadsUp = trackingHeadsUp; + } + + public void setIsExpanded(boolean isExpanded) { + if (isExpanded != mIsExpanded) { + mIsExpanded = isExpanded; + if (isExpanded) { + releaseAllToShade(); + } + } + } + + public int getTopHeadsUpHeight() { + HeadsUpEntry topEntry = getTopEntry(); + return topEntry != null ? topEntry.entry.row.getHeadsUpHeight() : 0; + } + + public int compare(NotificationData.Entry a, NotificationData.Entry b) { + HeadsUpEntry aEntry = getHeadsUpEntry(a.key); + HeadsUpEntry bEntry = getHeadsUpEntry(b.key); + if (aEntry == null || bEntry == null) { + return aEntry == null ? 1 : -1; + } + return aEntry.compareTo(bEntry); + } + + public class HeadsUpEntry implements Comparable<HeadsUpEntry> { + public NotificationData.Entry entry; + public long postTime; + public long earliestRemovaltime; + private Runnable mRemoveHeadsUpRunnable; + + public void setEntry(final NotificationData.Entry entry) { + this.entry = entry; + + // The actual post time will be just after the heads-up really slided in + postTime = mClock.currentTimeMillis() + mTouchSensitivityDelay; + mRemoveHeadsUpRunnable = new Runnable() { + @Override + public void run() { + if (!mTrackingHeadsUp) { + removeHeadsUpEntry(entry); + } else { + mEntriesToRemoveAfterExpand.add(entry); + } + } + }; + updateEntry(); + } + + public void updateEntry() { + long currentTime = mClock.currentTimeMillis(); + earliestRemovaltime = currentTime + mMinimumDisplayTime; + postTime = Math.max(postTime, currentTime); + removeAutoCancelCallbacks(); + if (canEntryDecay()) { + long finishTime = postTime + mHeadsUpNotificationDecay; + long removeDelay = Math.max(finishTime - currentTime, mMinimumDisplayTime); + mHandler.postDelayed(mRemoveHeadsUpRunnable, removeDelay); + } + updateSortOrder(HeadsUpEntry.this); + } + + private boolean canEntryDecay() { + return entry.notification.getNotification().fullScreenIntent == null; + } + + @Override + public int compareTo(HeadsUpEntry o) { + return postTime < o.postTime ? 1 + : postTime == o.postTime ? 0 + : -1; + } + + public void removeAutoCancelCallbacks() { + mHandler.removeCallbacks(mRemoveHeadsUpRunnable); + } + + public boolean wasShownLongEnough() { + return earliestRemovaltime < mClock.currentTimeMillis(); + } + + public void hideAsSoonAsPossible() { + removeAutoCancelCallbacks(); + mHandler.postDelayed(mRemoveHeadsUpRunnable, + earliestRemovaltime - mClock.currentTimeMillis()); + } + } + + /** + * Update the sorted heads up order. + * + * @param headsUpEntry the headsUp that changed + */ + private void updateSortOrder(HeadsUpEntry headsUpEntry) { + mSortedEntries.remove(headsUpEntry); + mSortedEntries.add(headsUpEntry); + } + + public static class Clock { + public long currentTimeMillis() { + return SystemClock.elapsedRealtime(); + } + } + + public interface OnHeadsUpChangedListener { + void OnPinnedHeadsUpExistChanged(boolean exist, boolean changeImmediatly); + void OnHeadsUpPinnedChanged(ExpandableNotificationRow headsUp, boolean isHeadsUp); + void OnHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java deleted file mode 100644 index 1e40bab..0000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java +++ /dev/null @@ -1,622 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar.policy; - -import android.content.Context; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.database.ContentObserver; -import android.graphics.Outline; -import android.graphics.Rect; -import android.os.SystemClock; -import android.provider.Settings; -import android.util.ArrayMap; -import android.util.AttributeSet; -import android.util.Log; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.ViewGroup; -import android.view.ViewOutlineProvider; -import android.view.ViewTreeObserver; -import android.view.accessibility.AccessibilityEvent; -import android.widget.FrameLayout; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.ExpandHelper; -import com.android.systemui.Gefingerpoken; -import com.android.systemui.R; -import com.android.systemui.SwipeHelper; -import com.android.systemui.statusbar.ExpandableView; -import com.android.systemui.statusbar.NotificationData; -import com.android.systemui.statusbar.phone.PhoneStatusBar; - -import java.io.FileDescriptor; -import java.io.PrintWriter; - -public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.Callback, ExpandHelper.Callback, - ViewTreeObserver.OnComputeInternalInsetsListener { - private static final String TAG = "HeadsUpNotificationView"; - private static final boolean DEBUG = false; - private static final boolean SPEW = DEBUG; - private static final String SETTING_HEADS_UP_SNOOZE_LENGTH_MS = "heads_up_snooze_length_ms"; - - Rect mTmpRect = new Rect(); - int[] mTmpTwoArray = new int[2]; - - private final int mHeadsUpNotificationDecay; - private final int mMinimumDisplayTime; - - private final int mTouchSensitivityDelay; - private final float mMaxAlpha = 1f; - private final ArrayMap<String, Long> mSnoozedPackages; - private final int mDefaultSnoozeLengthMs; - - private SwipeHelper mSwipeHelper; - private EdgeSwipeHelper mEdgeSwipeHelper; - - private PhoneStatusBar mBar; - - private long mLingerUntilMs; - private long mStartTouchTime; - private ViewGroup mContentHolder; - private int mSnoozeLengthMs; - private ContentObserver mSettingsObserver; - - private NotificationData.Entry mHeadsUp; - private int mUser; - private String mMostRecentPackageName; - private boolean mTouched; - private Clock mClock; - - public static class Clock { - public long currentTimeMillis() { - return SystemClock.elapsedRealtime(); - } - } - - public HeadsUpNotificationView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public HeadsUpNotificationView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - Resources resources = context.getResources(); - mTouchSensitivityDelay = resources.getInteger(R.integer.heads_up_sensitivity_delay); - if (DEBUG) Log.v(TAG, "create() " + mTouchSensitivityDelay); - mSnoozedPackages = new ArrayMap<>(); - mDefaultSnoozeLengthMs = resources.getInteger(R.integer.heads_up_default_snooze_length_ms); - mSnoozeLengthMs = mDefaultSnoozeLengthMs; - mMinimumDisplayTime = resources.getInteger(R.integer.heads_up_notification_minimum_time); - mHeadsUpNotificationDecay = resources.getInteger(R.integer.heads_up_notification_decay); - mClock = new Clock(); - } - - @VisibleForTesting - public HeadsUpNotificationView(Context context, Clock clock, SwipeHelper swipeHelper, - EdgeSwipeHelper edgeSwipeHelper, int headsUpNotificationDecay, int minimumDisplayTime, - int touchSensitivityDelay, int snoozeLength) { - super(context, null); - mClock = clock; - mSwipeHelper = swipeHelper; - mEdgeSwipeHelper = edgeSwipeHelper; - mMinimumDisplayTime = minimumDisplayTime; - mHeadsUpNotificationDecay = headsUpNotificationDecay; - mTouchSensitivityDelay = touchSensitivityDelay; - mSnoozedPackages = new ArrayMap<>(); - mDefaultSnoozeLengthMs = snoozeLength; - } - - public void updateResources() { - if (mContentHolder != null) { - final LayoutParams lp = (LayoutParams) mContentHolder.getLayoutParams(); - lp.width = getResources().getDimensionPixelSize(R.dimen.notification_panel_width); - lp.gravity = getResources().getInteger(R.integer.notification_panel_layout_gravity); - mContentHolder.setLayoutParams(lp); - } - } - - public void setBar(PhoneStatusBar bar) { - mBar = bar; - } - - public PhoneStatusBar getBar() { - return mBar; - } - - public ViewGroup getHolder() { - return mContentHolder; - } - - /** - * Called when posting a new notification to the heads up. - */ - public void showNotification(NotificationData.Entry headsUp) { - if (DEBUG) Log.v(TAG, "showNotification"); - if (mHeadsUp != null) { - // bump any previous heads up back to the shade - releaseImmediately(); - } - mTouched = false; - updateNotification(headsUp, true); - mLingerUntilMs = mClock.currentTimeMillis() + mMinimumDisplayTime; - } - - /** - * Called when updating or posting a notification to the heads up. - */ - public void updateNotification(NotificationData.Entry headsUp, boolean alert) { - if (DEBUG) Log.v(TAG, "updateNotification"); - - if (mHeadsUp == headsUp) { - resetViewForHeadsup(); - // This is an in-place update. Noting more to do. - return; - } - - mHeadsUp = headsUp; - - if (mContentHolder != null) { - mContentHolder.removeAllViews(); - } - - if (mHeadsUp != null) { - mMostRecentPackageName = mHeadsUp.notification.getPackageName(); - if (mHeadsUp.row != null) { - resetViewForHeadsup(); - } - - mStartTouchTime = SystemClock.elapsedRealtime() + mTouchSensitivityDelay; - if (mContentHolder != null) { // only null in tests and before we are attached to a window - mContentHolder.setX(0); - mContentHolder.setVisibility(View.VISIBLE); - mContentHolder.setAlpha(mMaxAlpha); - mContentHolder.addView(mHeadsUp.row); - sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); - - mSwipeHelper.snapChild(mContentHolder, 1f); - } - - mHeadsUp.setInterruption(); - } - if (alert) { - // Make sure the heads up window is open. - mBar.scheduleHeadsUpOpen(); - mBar.scheduleHeadsUpDecay(mHeadsUpNotificationDecay); - } - } - - private void resetViewForHeadsup() { - if (mHeadsUp.row.areChildrenExpanded()) { - mHeadsUp.row.setChildrenExpanded(false /* expanded */, false /* animated */); - } - mHeadsUp.row.setSystemExpanded(true); - mHeadsUp.row.setSensitive(false); - mHeadsUp.row.setHeadsUp(true); - mHeadsUp.row.setTranslationY(0); - mHeadsUp.row.setTranslationZ(0); - mHeadsUp.row.setHideSensitive( - false, false /* animated */, 0 /* delay */, 0 /* duration */); - } - - /** - * Possibly enter the lingering state by delaying the closing of the window. - * - * @return true if the notification has entered the lingering state. - */ - private boolean startLingering(boolean removed) { - final long now = mClock.currentTimeMillis(); - if (!mTouched && mHeadsUp != null && now < mLingerUntilMs) { - if (removed) { - mHeadsUp = null; - } - mBar.scheduleHeadsUpDecay(mLingerUntilMs - now); - return true; - } - return false; - } - - /** - * React to the removal of the notification in the heads up. - */ - public void removeNotification(String key) { - if (DEBUG) Log.v(TAG, "remove"); - if (mHeadsUp == null || !mHeadsUp.key.equals(key)) { - return; - } - if (!startLingering(/* removed */ true)) { - mHeadsUp = null; - releaseImmediately(); - } - } - - /** - * Ask for any current Heads Up notification to be pushed down into the shade. - */ - public void release() { - if (DEBUG) Log.v(TAG, "release"); - if (!startLingering(/* removed */ false)) { - releaseImmediately(); - } - } - - /** - * Push any current Heads Up notification down into the shade. - */ - public void releaseImmediately() { - if (DEBUG) Log.v(TAG, "releaseImmediately"); - if (mHeadsUp != null) { - mContentHolder.removeView(mHeadsUp.row); - mBar.displayNotificationFromHeadsUp(mHeadsUp); - } - mHeadsUp = null; - mBar.scheduleHeadsUpClose(); - } - - @Override - protected void onVisibilityChanged(View changedView, int visibility) { - super.onVisibilityChanged(changedView, visibility); - if (DEBUG) Log.v(TAG, "onVisibilityChanged: " + visibility); - if (changedView.getVisibility() == VISIBLE) { - mStartTouchTime = mClock.currentTimeMillis() + mTouchSensitivityDelay; - sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); - } - } - - public boolean isSnoozed(String packageName) { - final String key = snoozeKey(packageName, mUser); - Long snoozedUntil = mSnoozedPackages.get(key); - if (snoozedUntil != null) { - if (snoozedUntil > SystemClock.elapsedRealtime()) { - if (DEBUG) Log.v(TAG, key + " snoozed"); - return true; - } - mSnoozedPackages.remove(packageName); - } - return false; - } - - private void snooze() { - if (mMostRecentPackageName != null) { - mSnoozedPackages.put(snoozeKey(mMostRecentPackageName, mUser), - SystemClock.elapsedRealtime() + mSnoozeLengthMs); - } - releaseImmediately(); - } - - private static String snoozeKey(String packageName, int user) { - return user + "," + packageName; - } - - public boolean isShowing(String key) { - return mHeadsUp != null && mHeadsUp.key.equals(key); - } - - public NotificationData.Entry getEntry() { - return mHeadsUp; - } - - public boolean isClearable() { - return mHeadsUp == null || mHeadsUp.notification.isClearable(); - } - - // ViewGroup methods - -private static final ViewOutlineProvider CONTENT_HOLDER_OUTLINE_PROVIDER = - new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - int outlineLeft = view.getPaddingLeft(); - int outlineTop = view.getPaddingTop(); - - // Apply padding to shadow. - outline.setRect(outlineLeft, outlineTop, - view.getWidth() - outlineLeft - view.getPaddingRight(), - view.getHeight() - outlineTop - view.getPaddingBottom()); - } - }; - - @Override - public void onAttachedToWindow() { - final ViewConfiguration viewConfiguration = ViewConfiguration.get(getContext()); - float touchSlop = viewConfiguration.getScaledTouchSlop(); - mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, getContext()); - mSwipeHelper.setMaxSwipeProgress(mMaxAlpha); - mEdgeSwipeHelper = new EdgeSwipeHelper(this, touchSlop); - - int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height); - int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_max_height); - - mContentHolder = (ViewGroup) findViewById(R.id.content_holder); - mContentHolder.setOutlineProvider(CONTENT_HOLDER_OUTLINE_PROVIDER); - - mSnoozeLengthMs = Settings.Global.getInt(mContext.getContentResolver(), - SETTING_HEADS_UP_SNOOZE_LENGTH_MS, mDefaultSnoozeLengthMs); - mSettingsObserver = new ContentObserver(getHandler()) { - @Override - public void onChange(boolean selfChange) { - final int packageSnoozeLengthMs = Settings.Global.getInt( - mContext.getContentResolver(), SETTING_HEADS_UP_SNOOZE_LENGTH_MS, -1); - if (packageSnoozeLengthMs > -1 && packageSnoozeLengthMs != mSnoozeLengthMs) { - mSnoozeLengthMs = packageSnoozeLengthMs; - if (DEBUG) Log.v(TAG, "mSnoozeLengthMs = " + mSnoozeLengthMs); - } - } - }; - mContext.getContentResolver().registerContentObserver( - Settings.Global.getUriFor(SETTING_HEADS_UP_SNOOZE_LENGTH_MS), false, - mSettingsObserver); - if (DEBUG) Log.v(TAG, "mSnoozeLengthMs = " + mSnoozeLengthMs); - - if (mHeadsUp != null) { - // whoops, we're on already! - showNotification(mHeadsUp); - } - - getViewTreeObserver().addOnComputeInternalInsetsListener(this); - } - - - @Override - protected void onDetachedFromWindow() { - mContext.getContentResolver().unregisterContentObserver(mSettingsObserver); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()"); - if (mClock.currentTimeMillis() < mStartTouchTime) { - return true; - } - mTouched = true; - return mEdgeSwipeHelper.onInterceptTouchEvent(ev) - || mSwipeHelper.onInterceptTouchEvent(ev) - || mHeadsUp == null // lingering - || super.onInterceptTouchEvent(ev); - } - - // View methods - - @Override - public void onDraw(android.graphics.Canvas c) { - super.onDraw(c); - if (DEBUG) { - //Log.d(TAG, "onDraw: canvas height: " + c.getHeight() + "px; measured height: " - // + getMeasuredHeight() + "px"); - c.save(); - c.clipRect(6, 6, c.getWidth() - 6, getMeasuredHeight() - 6, - android.graphics.Region.Op.DIFFERENCE); - c.drawColor(0xFFcc00cc); - c.restore(); - } - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - if (mClock.currentTimeMillis() < mStartTouchTime) { - return false; - } - - final boolean wasRemoved = mHeadsUp == null; - if (!wasRemoved) { - mBar.scheduleHeadsUpDecay(mHeadsUpNotificationDecay); - } - return mEdgeSwipeHelper.onTouchEvent(ev) - || mSwipeHelper.onTouchEvent(ev) - || wasRemoved - || super.onTouchEvent(ev); - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - float densityScale = getResources().getDisplayMetrics().density; - mSwipeHelper.setDensityScale(densityScale); - float pagingTouchSlop = ViewConfiguration.get(getContext()).getScaledPagingTouchSlop(); - mSwipeHelper.setPagingTouchSlop(pagingTouchSlop); - } - - // ExpandHelper.Callback methods - - @Override - public ExpandableView getChildAtRawPosition(float x, float y) { - return getChildAtPosition(x, y); - } - - @Override - public ExpandableView getChildAtPosition(float x, float y) { - return mHeadsUp == null ? null : mHeadsUp.row; - } - - @Override - public boolean canChildBeExpanded(View v) { - return mHeadsUp != null && mHeadsUp.row == v && mHeadsUp.row.isExpandable(); - } - - @Override - public void setUserExpandedChild(View v, boolean userExpanded) { - if (mHeadsUp != null && mHeadsUp.row == v) { - mHeadsUp.row.setUserExpanded(userExpanded); - } - } - - @Override - public void setUserLockedChild(View v, boolean userLocked) { - if (mHeadsUp != null && mHeadsUp.row == v) { - mHeadsUp.row.setUserLocked(userLocked); - } - } - - @Override - public void expansionStateChanged(boolean isExpanding) { - - } - - // SwipeHelper.Callback methods - - @Override - public boolean canChildBeDismissed(View v) { - return true; - } - - @Override - public boolean isAntiFalsingNeeded() { - return false; - } - - @Override - public float getFalsingThresholdFactor() { - return 1.0f; - } - - @Override - public void onChildDismissed(View v) { - Log.v(TAG, "User swiped heads up to dismiss"); - if (mHeadsUp != null && mHeadsUp.notification.isClearable()) { - mBar.onNotificationClear(mHeadsUp.notification); - mHeadsUp = null; - } - releaseImmediately(); - } - - @Override - public void onBeginDrag(View v) { - } - - @Override - public void onDragCancelled(View v) { - mContentHolder.setAlpha(mMaxAlpha); // sometimes this isn't quite reset - } - - @Override - public void onChildSnappedBack(View animView) { - } - - @Override - public boolean updateSwipeProgress(View animView, boolean dismissable, float swipeProgress) { - getBackground().setAlpha((int) (255 * swipeProgress)); - return false; - } - - @Override - public View getChildAtPosition(MotionEvent ev) { - return mContentHolder; - } - - @Override - public View getChildContentView(View v) { - return mContentHolder; - } - - @Override - public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { - mContentHolder.getLocationOnScreen(mTmpTwoArray); - - info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); - info.touchableRegion.set(mTmpTwoArray[0], mTmpTwoArray[1], - mTmpTwoArray[0] + mContentHolder.getWidth(), - mTmpTwoArray[1] + mContentHolder.getHeight()); - } - - public void escalate() { - mBar.scheduleHeadsUpEscalation(); - } - - public String getKey() { - return mHeadsUp == null ? null : mHeadsUp.notification.getKey(); - } - - public void setUser(int user) { - mUser = user; - } - - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println("HeadsUpNotificationView state:"); - pw.print(" mTouchSensitivityDelay="); pw.println(mTouchSensitivityDelay); - pw.print(" mSnoozeLengthMs="); pw.println(mSnoozeLengthMs); - pw.print(" mLingerUntilMs="); pw.println(mLingerUntilMs); - pw.print(" mTouched="); pw.println(mTouched); - pw.print(" mMostRecentPackageName="); pw.println(mMostRecentPackageName); - pw.print(" mStartTouchTime="); pw.println(mStartTouchTime); - pw.print(" now="); pw.println(SystemClock.elapsedRealtime()); - pw.print(" mUser="); pw.println(mUser); - if (mHeadsUp == null) { - pw.println(" mHeadsUp=null"); - } else { - pw.print(" mHeadsUp="); pw.println(mHeadsUp.notification.getKey()); - } - int N = mSnoozedPackages.size(); - pw.println(" snoozed packages: " + N); - for (int i = 0; i < N; i++) { - pw.print(" "); pw.print(mSnoozedPackages.valueAt(i)); - pw.print(", "); pw.println(mSnoozedPackages.keyAt(i)); - } - } - - public static class EdgeSwipeHelper implements Gefingerpoken { - private static final boolean DEBUG_EDGE_SWIPE = false; - private final float mTouchSlop; - private final HeadsUpNotificationView mHeadsUpView; - private boolean mConsuming; - private float mFirstY; - private float mFirstX; - - public EdgeSwipeHelper(HeadsUpNotificationView headsUpView, float touchSlop) { - mHeadsUpView = headsUpView; - mTouchSlop = touchSlop; - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - switch (ev.getActionMasked()) { - case MotionEvent.ACTION_DOWN: - if (DEBUG_EDGE_SWIPE) Log.d(TAG, "action down " + ev.getY()); - mFirstX = ev.getX(); - mFirstY = ev.getY(); - mConsuming = false; - break; - - case MotionEvent.ACTION_MOVE: - if (DEBUG_EDGE_SWIPE) Log.d(TAG, "action move " + ev.getY()); - final float dY = ev.getY() - mFirstY; - final float daX = Math.abs(ev.getX() - mFirstX); - final float daY = Math.abs(dY); - if (!mConsuming && daX < daY && daY > mTouchSlop) { - mHeadsUpView.snooze(); - if (dY > 0) { - if (DEBUG_EDGE_SWIPE) Log.d(TAG, "found an open"); - mHeadsUpView.getBar().animateExpandNotificationsPanel(); - } - mConsuming = true; - } - break; - - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - if (DEBUG_EDGE_SWIPE) Log.d(TAG, "action done"); - mConsuming = false; - break; - } - return mConsuming; - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - return mConsuming; - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index a18daed..6bc51fa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -48,6 +48,7 @@ public class KeyButtonView extends ImageView { private int mTouchSlop; private boolean mSupportsLongpress = true; private AudioManager mAudioManager; + private boolean mGestureAborted; private final Runnable mCheckLongPress = new Runnable() { public void run() { @@ -126,10 +127,15 @@ public class KeyButtonView extends ImageView { public boolean onTouchEvent(MotionEvent ev) { final int action = ev.getAction(); int x, y; + if (action == MotionEvent.ACTION_DOWN) { + mGestureAborted = false; + } + if (mGestureAborted) { + return false; + } switch (action) { case MotionEvent.ACTION_DOWN: - //Log.d("KeyButtonView", "press"); mDownTime = SystemClock.uptimeMillis(); setPressed(true); if (mCode != 0) { @@ -203,6 +209,11 @@ public class KeyButtonView extends ImageView { InputManager.getInstance().injectInputEvent(ev, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); } + + public void abortCurrentGesture() { + setPressed(false); + mGestureAborted = true; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index ba938cc..c3c6b12 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -114,6 +114,11 @@ public class MobileSignalController extends SignalController< setInetCondition(inetCondition); } + public void setCarrierNetworkChangeMode(boolean carrierNetworkChangeMode) { + mCurrentState.carrierNetworkChangeMode = carrierNetworkChangeMode; + notifyListenersIfNecessary(); + } + /** * Start listening for phone state changes. */ @@ -123,7 +128,8 @@ public class MobileSignalController extends SignalController< | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS | PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE - | PhoneStateListener.LISTEN_DATA_ACTIVITY); + | PhoneStateListener.LISTEN_DATA_ACTIVITY + | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE); } /** @@ -201,8 +207,12 @@ public class MobileSignalController extends SignalController< && !mCurrentState.isEmergency, getQsCurrentIconId(), contentDescription, qsTypeIcon, - mCurrentState.dataConnected && mCurrentState.activityIn, - mCurrentState.dataConnected && mCurrentState.activityOut, + mCurrentState.dataConnected + && !mCurrentState.carrierNetworkChangeMode + && mCurrentState.activityIn, + mCurrentState.dataConnected + && !mCurrentState.carrierNetworkChangeMode + && mCurrentState.activityOut, dataContentDescription, mCurrentState.isEmergency ? null : mCurrentState.networkName, // Only wide if actually showing something. @@ -215,6 +225,7 @@ public class MobileSignalController extends SignalController< mSignalClusters.get(i).setMobileDataIndicators( mCurrentState.enabled && !mCurrentState.airplaneMode, getCurrentIconId(), + getCurrentDarkIconId(), typeIcon, contentDescription, dataContentDescription, @@ -224,6 +235,10 @@ public class MobileSignalController extends SignalController< } } + private int getCurrentDarkIconId() { + return getCurrentIconId(false /* light */); + } + @Override protected MobileState cleanState() { return new MobileState(); @@ -270,6 +285,10 @@ public class MobileSignalController extends SignalController< } } + private boolean isCarrierNetworkChangeActive() { + return !hasService() && mCurrentState.carrierNetworkChangeMode; + } + public void handleBroadcast(Intent intent) { String action = intent.getAction(); if (action.equals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION)) { @@ -351,7 +370,9 @@ public class MobileSignalController extends SignalController< mCurrentState.dataConnected = mCurrentState.connected && mDataState == TelephonyManager.DATA_CONNECTED; - if (isRoaming()) { + if (isCarrierNetworkChangeActive()) { + mCurrentState.iconGroup = TelephonyIcons.CARRIER_NETWORK_CHANGE; + } else if (isRoaming()) { mCurrentState.iconGroup = TelephonyIcons.ROAMING; } if (isEmergencyOnly() != mCurrentState.isEmergency) { @@ -363,6 +384,7 @@ public class MobileSignalController extends SignalController< && mServiceState.getOperatorAlphaShort() != null) { mCurrentState.networkName = mServiceState.getOperatorAlphaShort(); } + notifyListenersIfNecessary(); } @@ -428,6 +450,16 @@ public class MobileSignalController extends SignalController< } setActivity(direction); } + + @Override + public void onCarrierNetworkChange(boolean active) { + if (DEBUG) { + Log.d(mTag, "onCarrierNetworkChange: active=" + active); + } + mCurrentState.carrierNetworkChangeMode = active; + + updateTelephony(); + } }; static class MobileIconGroup extends SignalController.IconGroup { @@ -440,8 +472,17 @@ public class MobileSignalController extends SignalController< int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, int discContentDesc, int dataContentDesc, int dataType, boolean isWide, int[] qsDataType) { - super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState, - qsDiscState, discContentDesc); + this(name, sbIcons, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, + sbDiscState, sbDiscState, qsDiscState, discContentDesc, dataContentDesc, + dataType, isWide, qsDataType); + } + + public MobileIconGroup(String name, int[][] sbIcons, int[][] sbDarkIcons, int[][] qsIcons, + int[] contentDesc, int sbNullState, int qsNullState, int sbDiscState, + int sbDarkDiscState, int qsDiscState, int discContentDesc, int dataContentDesc, + int dataType, boolean isWide, int[] qsDataType) { + super(name, sbIcons, sbDarkIcons, qsIcons, contentDesc, sbNullState, qsNullState, + sbDiscState, sbDarkDiscState, qsDiscState, discContentDesc); mDataContentDescription = dataContentDesc; mDataType = dataType; mIsWide = isWide; @@ -455,6 +496,7 @@ public class MobileSignalController extends SignalController< boolean dataConnected; boolean isEmergency; boolean airplaneMode; + boolean carrierNetworkChangeMode; int inetForNetwork; @Override @@ -467,6 +509,7 @@ public class MobileSignalController extends SignalController< inetForNetwork = state.inetForNetwork; isEmergency = state.isEmergency; airplaneMode = state.airplaneMode; + carrierNetworkChangeMode = state.carrierNetworkChangeMode; } @Override @@ -478,7 +521,8 @@ public class MobileSignalController extends SignalController< builder.append("dataConnected=").append(dataConnected).append(','); builder.append("inetForNetwork=").append(inetForNetwork).append(','); builder.append("isEmergency=").append(isEmergency).append(','); - builder.append("airplaneMode=").append(airplaneMode); + builder.append("airplaneMode=").append(airplaneMode).append(','); + builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode); } @Override @@ -489,6 +533,7 @@ public class MobileSignalController extends SignalController< && ((MobileState) o).dataConnected == dataConnected && ((MobileState) o).isEmergency == isEmergency && ((MobileState) o).airplaneMode == airplaneMode + && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode && ((MobileState) o).inetForNetwork == inetForNetwork; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index bb3eb7a..5cf6a6e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -704,6 +704,13 @@ public class NetworkControllerImpl extends BroadcastReceiver controller.getState().enabled = show; controller.notifyListeners(); } + String carrierNetworkChange = args.getString("carriernetworkchange"); + if (carrierNetworkChange != null) { + boolean show = carrierNetworkChange.equals("show"); + for (MobileSignalController controller : mMobileSignalControllers.values()) { + controller.setCarrierNetworkChangeMode(show); + } + } } } @@ -718,9 +725,9 @@ public class NetworkControllerImpl extends BroadcastReceiver public interface SignalCluster { void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription); - void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon, - String contentDescription, String typeContentDescription, boolean isTypeIconWide, - int subId); + void setMobileDataIndicators(boolean visible, int strengthIcon, int darkStrengthIcon, + int typeIcon, String contentDescription, String typeContentDescription, + boolean isTypeIconWide, int subId); void setSubs(List<SubscriptionInfo> subs); void setNoSims(boolean show); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java index 34068fd..0dce82f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.policy; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -106,15 +107,28 @@ public class PreviewInflater { public static boolean wouldLaunchResolverActivity(Context ctx, Intent intent, int currentUserId) { + return getTargetPackage(ctx, intent, currentUserId) == null; + } + + /** + * @return the target package of the intent it resolves to a specific package or {@code null} if + * it resolved to the resolver activity + */ + public static String getTargetPackage(Context ctx, Intent intent, + int currentUserId) { PackageManager packageManager = ctx.getPackageManager(); final List<ResolveInfo> appList = packageManager.queryIntentActivitiesAsUser( intent, PackageManager.MATCH_DEFAULT_ONLY, currentUserId); if (appList.size() == 0) { - return false; + return null; } ResolveInfo resolved = packageManager.resolveActivityAsUser(intent, PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA, currentUserId); - return wouldLaunchResolverActivity(resolved, appList); + if (resolved == null || wouldLaunchResolverActivity(resolved, appList)) { + return null; + } else { + return resolved.activityInfo.packageName; + } } private static boolean wouldLaunchResolverActivity( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java index 1d96c6b..c204814 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalController.java @@ -142,8 +142,16 @@ public abstract class SignalController<T extends SignalController.State, * Gets the signal icon for SB based on current state of connected, enabled, and level. */ public int getCurrentIconId() { + return getCurrentIconId(true /* light */); + } + + protected int getCurrentIconId(boolean light) { if (mCurrentState.connected) { - return getIcons().mSbIcons[mCurrentState.inetCondition][mCurrentState.level]; + if (light) { + return getIcons().mSbIcons[mCurrentState.inetCondition][mCurrentState.level]; + } else { + return getIcons().mSbDarkIcons[mCurrentState.inetCondition][mCurrentState.level]; + } } else if (mCurrentState.enabled) { return getIcons().mSbDiscState; } else { @@ -226,11 +234,13 @@ public abstract class SignalController<T extends SignalController.State, */ static class IconGroup { final int[][] mSbIcons; + final int[][] mSbDarkIcons; final int[][] mQsIcons; final int[] mContentDesc; final int mSbNullState; final int mQsNullState; final int mSbDiscState; + final int mSbDarkDiscState; final int mQsDiscState; final int mDiscContentDesc; // For logging. @@ -239,13 +249,22 @@ public abstract class SignalController<T extends SignalController.State, public IconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, int discContentDesc) { + this(name, sbIcons, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, + sbDiscState, sbDiscState, qsDiscState, discContentDesc); + } + + public IconGroup(String name, int[][] sbIcons, int[][] sbDarkIcons, int[][] qsIcons, + int[] contentDesc, int sbNullState, int qsNullState, int sbDiscState, + int sbDarkDiscState, int qsDiscState, int discContentDesc) { mName = name; mSbIcons = sbIcons; + mSbDarkIcons = sbDarkIcons; mQsIcons = qsIcons; mContentDesc = contentDesc; mSbNullState = sbNullState; mQsNullState = qsNullState; mSbDiscState = sbDiscState; + mSbDarkDiscState = sbDarkDiscState; mQsDiscState = qsDiscState; mDiscContentDesc = discContentDesc; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java index d266ed8..053feb12 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -68,6 +68,42 @@ class TelephonyIcons { R.drawable.stat_sys_signal_4_fully } }; + //CarrierNetworkChange + static final int[][] TELEPHONY_CARRIER_NETWORK_CHANGE = { + { R.drawable.stat_sys_signal_carrier_network_change_animation, + R.drawable.stat_sys_signal_carrier_network_change_animation, + R.drawable.stat_sys_signal_carrier_network_change_animation, + R.drawable.stat_sys_signal_carrier_network_change_animation }, + { R.drawable.stat_sys_signal_carrier_network_change_animation, + R.drawable.stat_sys_signal_carrier_network_change_animation, + R.drawable.stat_sys_signal_carrier_network_change_animation, + R.drawable.stat_sys_signal_carrier_network_change_animation } + }; + + static final int[][] TELEPHONY_CARRIER_NETWORK_CHANGE_DARK = { + { R.drawable.stat_sys_signal_dark_carrier_network_change_animation, + R.drawable.stat_sys_signal_dark_carrier_network_change_animation, + R.drawable.stat_sys_signal_dark_carrier_network_change_animation, + R.drawable.stat_sys_signal_dark_carrier_network_change_animation }, + { R.drawable.stat_sys_signal_dark_carrier_network_change_animation, + R.drawable.stat_sys_signal_dark_carrier_network_change_animation, + R.drawable.stat_sys_signal_dark_carrier_network_change_animation, + R.drawable.stat_sys_signal_dark_carrier_network_change_animation } + }; + + static final int[][] QS_TELEPHONY_CARRIER_NETWORK_CHANGE = { + { R.drawable.ic_qs_signal_carrier_network_change_animation, + R.drawable.ic_qs_signal_carrier_network_change_animation, + R.drawable.ic_qs_signal_carrier_network_change_animation, + R.drawable.ic_qs_signal_carrier_network_change_animation, + R.drawable.ic_qs_signal_carrier_network_change_animation }, + { R.drawable.ic_qs_signal_carrier_network_change_animation, + R.drawable.ic_qs_signal_carrier_network_change_animation, + R.drawable.ic_qs_signal_carrier_network_change_animation, + R.drawable.ic_qs_signal_carrier_network_change_animation, + R.drawable.ic_qs_signal_carrier_network_change_animation } + }; + static final int[] QS_DATA_R = { R.drawable.ic_qs_signal_r, R.drawable.ic_qs_signal_r @@ -202,11 +238,34 @@ class TelephonyIcons { static final int ICON_3G = R.drawable.stat_sys_data_fully_connected_3g; static final int ICON_4G = R.drawable.stat_sys_data_fully_connected_4g; static final int ICON_1X = R.drawable.stat_sys_data_fully_connected_1x; + static final int ICON_CARRIER_NETWORK_CHANGE = + R.drawable.stat_sys_signal_carrier_network_change_animation; + static final int ICON_CARRIER_NETWORK_CHANGE_DARK = + R.drawable.stat_sys_signal_dark_carrier_network_change_animation; static final int QS_ICON_LTE = R.drawable.ic_qs_signal_lte; static final int QS_ICON_3G = R.drawable.ic_qs_signal_3g; static final int QS_ICON_4G = R.drawable.ic_qs_signal_4g; static final int QS_ICON_1X = R.drawable.ic_qs_signal_1x; + static final int QS_ICON_CARRIER_NETWORK_CHANGE = + R.drawable.ic_qs_signal_carrier_network_change_animation; + + static final MobileIconGroup CARRIER_NETWORK_CHANGE = new MobileIconGroup( + "CARRIER_NETWORK_CHANGE", + TelephonyIcons.TELEPHONY_CARRIER_NETWORK_CHANGE, + TelephonyIcons.TELEPHONY_CARRIER_NETWORK_CHANGE_DARK, + TelephonyIcons.QS_TELEPHONY_CARRIER_NETWORK_CHANGE, + AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, + 0, 0, + TelephonyIcons.ICON_CARRIER_NETWORK_CHANGE, + TelephonyIcons.ICON_CARRIER_NETWORK_CHANGE_DARK, + TelephonyIcons.QS_ICON_CARRIER_NETWORK_CHANGE, + AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], + R.string.accessibility_carrier_network_change_mode, + 0, + false, + null + ); static final MobileIconGroup THREE_G = new MobileIconGroup( "3G", 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 4ac41a1..194bcfa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -19,6 +19,9 @@ package com.android.systemui.statusbar.policy; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.Dialog; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -63,6 +66,7 @@ public class UserSwitcherController { private static final boolean DEBUG = false; private static final String SIMPLE_USER_SWITCHER_GLOBAL_SETTING = "lockscreenSimpleUserSwitcher"; + private static final String ACTION_REMOVE_GUEST = "com.android.systemui.REMOVE_GUEST"; private final Context mContext; private final UserManager mUserManager; @@ -89,6 +93,7 @@ public class UserSwitcherController { filter.addAction(Intent.ACTION_USER_INFO_CHANGED); filter.addAction(Intent.ACTION_USER_SWITCHED); filter.addAction(Intent.ACTION_USER_STOPPING); + filter.addAction(ACTION_REMOVE_GUEST); mContext.registerReceiverAsUser(mReceiver, UserHandle.OWNER, filter, null /* permission */, null /* scheduler */); @@ -296,6 +301,22 @@ public class UserSwitcherController { Log.v(TAG, "Broadcast: a=" + intent.getAction() + " user=" + intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1)); } + if (ACTION_REMOVE_GUEST.equals(intent.getAction())) { + int currentUser = ActivityManager.getCurrentUser(); + UserInfo userInfo = mUserManager.getUserInfo(currentUser); + if (userInfo != null && userInfo.isGuest()) { + showExitGuestDialog(currentUser); + } + return; + } + if (Intent.ACTION_USER_ADDED.equals(intent.getAction())) { + final int currentId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); + UserInfo userInfo = mUserManager.getUserInfo(currentId); + if (userInfo != null && userInfo.isGuest()) { + showGuestNotification(currentId); + } + } + if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) { if (mExitGuestDialog != null && mExitGuestDialog.isShowing()) { mExitGuestDialog.cancel(); @@ -329,6 +350,24 @@ public class UserSwitcherController { } refreshUsers(forcePictureLoadForId); } + + private void showGuestNotification(int guestUserId) { + PendingIntent removeGuestPI = PendingIntent.getBroadcastAsUser(mContext, + 0, new Intent(ACTION_REMOVE_GUEST), 0, UserHandle.OWNER); + Notification notification = new Notification.Builder(mContext) + .setVisibility(Notification.VISIBILITY_SECRET) + .setPriority(Notification.PRIORITY_MIN) + .setSmallIcon(R.drawable.ic_person) + .setContentTitle(mContext.getString(R.string.guest_notification_title)) + .setContentText(mContext.getString(R.string.guest_notification_text)) + .setShowWhen(false) + .addAction(R.drawable.ic_delete, + mContext.getString(R.string.guest_notification_remove_action), + removeGuestPI) + .build(); + NotificationManager.from(mContext).notifyAsUser(null, 0, notification, + new UserHandle(guestUserId)); + } }; private final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java index 0e21457..67cc788 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java @@ -17,16 +17,19 @@ package com.android.systemui.statusbar.policy; import android.content.ComponentName; +import android.net.Uri; import android.service.notification.Condition; +import android.service.notification.ZenModeConfig; +import android.service.notification.ZenModeConfig.ZenRule; public interface ZenModeController { void addCallback(Callback callback); void removeCallback(Callback callback); - void setZen(int zen); + void setZen(int zen, Uri conditionId, String reason); int getZen(); void requestConditions(boolean request); - void setExitCondition(Condition exitCondition); - Condition getExitCondition(); + ZenRule getManualRule(); + ZenModeConfig getConfig(); long getNextAlarm(); void setUserId(int userId); boolean isZenAvailable(); @@ -35,10 +38,11 @@ public interface ZenModeController { public static class Callback { public void onZenChanged(int zen) {} - public void onExitConditionChanged(Condition exitCondition) {} public void onConditionsChanged(Condition[] conditions) {} public void onNextAlarmChanged() {} public void onZenAvailableChanged(boolean available) {} public void onEffectsSupressorChanged() {} + public void onManualRuleChanged(ZenRule rule) {} + public void onConfigChanged(ZenModeConfig config) {} } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java index bea0c86..830a197 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java @@ -33,6 +33,7 @@ import android.provider.Settings.Secure; import android.service.notification.Condition; import android.service.notification.IConditionListener; import android.service.notification.ZenModeConfig; +import android.service.notification.ZenModeConfig.ZenRule; import android.util.Log; import android.util.Slog; @@ -40,6 +41,7 @@ import com.android.systemui.qs.GlobalSetting; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.Objects; /** Platform implementation of the zen mode controller. **/ public class ZenModeControllerImpl implements ZenModeController { @@ -58,6 +60,7 @@ public class ZenModeControllerImpl implements ZenModeController { private int mUserId; private boolean mRequesting; private boolean mRegistered; + private ZenModeConfig mConfig; public ZenModeControllerImpl(Context context, Handler handler) { mContext = context; @@ -70,12 +73,13 @@ public class ZenModeControllerImpl implements ZenModeController { mConfigSetting = new GlobalSetting(mContext, handler, Global.ZEN_MODE_CONFIG_ETAG) { @Override protected void handleValueChanged(int value) { - fireExitConditionChanged(); + updateZenModeConfig(); } }; + mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + mConfig = mNoMan.getZenModeConfig(); mModeSetting.setListening(true); mConfigSetting.setListening(true); - mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); mSetupObserver = new SetupObserver(handler); mSetupObserver.register(); @@ -97,8 +101,8 @@ public class ZenModeControllerImpl implements ZenModeController { } @Override - public void setZen(int zen) { - mModeSetting.setValue(zen); + public void setZen(int zen, Uri conditionId, String reason) { + mNoMan.setZenMode(zen, conditionId, reason); } @Override @@ -116,13 +120,13 @@ public class ZenModeControllerImpl implements ZenModeController { } @Override - public void setExitCondition(Condition exitCondition) { - mNoMan.setZenModeCondition(exitCondition); + public ZenRule getManualRule() { + return mConfig == null ? null : mConfig.manualRule; } @Override - public Condition getExitCondition() { - return mNoMan.getZenModeCondition(); + public ZenModeConfig getConfig() { + return mConfig; } @Override @@ -185,11 +189,15 @@ public class ZenModeControllerImpl implements ZenModeController { } } - private void fireExitConditionChanged() { - final Condition exitCondition = getExitCondition(); - if (DEBUG) Slog.d(TAG, "exitCondition changed: " + exitCondition); + private void fireManualRuleChanged(ZenRule rule) { + for (Callback cb : mCallbacks) { + cb.onManualRuleChanged(rule); + } + } + + private void fireConfigChanged(ZenModeConfig config) { for (Callback cb : mCallbacks) { - cb.onExitConditionChanged(exitCondition); + cb.onConfigChanged(config); } } @@ -203,6 +211,17 @@ public class ZenModeControllerImpl implements ZenModeController { mConditions.values().toArray(new Condition[mConditions.values().size()])); } + private void updateZenModeConfig() { + final ZenModeConfig config = mNoMan.getZenModeConfig(); + if (Objects.equals(config, mConfig)) return; + final ZenRule oldRule = mConfig != null ? mConfig.manualRule : null; + mConfig = config; + fireConfigChanged(config); + final ZenRule newRule = config != null ? config.manualRule : null; + if (Objects.equals(oldRule, newRule)) return; + fireManualRuleChanged(newRule); + } + private final IConditionListener mListener = new IConditionListener.Stub() { @Override public void onConditionsReceived(Condition[] conditions) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java index 8e677f1..f2b971f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java @@ -17,9 +17,13 @@ package com.android.systemui.statusbar.stack; import android.view.View; + import com.android.systemui.statusbar.ActivatableNotificationView; +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.policy.HeadsUpManager; import java.util.ArrayList; +import java.util.TreeSet; /** * A global state to track all input states for the algorithm. @@ -34,6 +38,12 @@ public class AmbientState { private int mSpeedBumpIndex = -1; private boolean mDark; private boolean mHideSensitive; + private HeadsUpManager mHeadsUpManager; + private float mStackTranslation; + private int mLayoutHeight; + private int mTopPadding; + private boolean mShadeExpanded; + private float mMaxHeadsUpTranslation; public int getScrollY() { return mScrollY; @@ -115,4 +125,67 @@ public class AmbientState { public void setSpeedBumpIndex(int speedBumpIndex) { mSpeedBumpIndex = speedBumpIndex; } + + public void setHeadsUpManager(HeadsUpManager headsUpManager) { + mHeadsUpManager = headsUpManager; + } + + public TreeSet<HeadsUpManager.HeadsUpEntry> getSortedHeadsUpEntries() { + return mHeadsUpManager.getSortedEntries(); + } + + public float getStackTranslation() { + return mStackTranslation; + } + + public void setStackTranslation(float stackTranslation) { + mStackTranslation = stackTranslation; + } + + public int getLayoutHeight() { + return mLayoutHeight; + } + + public void setLayoutHeight(int layoutHeight) { + mLayoutHeight = layoutHeight; + } + + public float getTopPadding() { + return mTopPadding; + } + + public void setTopPadding(int topPadding) { + mTopPadding = topPadding; + } + + public int getInnerHeight() { + return mLayoutHeight - mTopPadding - getTopHeadsUpPushIn(); + } + + private int getTopHeadsUpPushIn() { + ExpandableNotificationRow topHeadsUpEntry = getTopHeadsUpEntry(); + return topHeadsUpEntry != null ? topHeadsUpEntry.getHeadsUpHeight() + - topHeadsUpEntry.getMinHeight(): 0; + } + + public boolean isShadeExpanded() { + return mShadeExpanded; + } + + public void setShadeExpanded(boolean shadeExpanded) { + mShadeExpanded = shadeExpanded; + } + + public void setMaxHeadsUpTranslation(float maxHeadsUpTranslation) { + mMaxHeadsUpTranslation = maxHeadsUpTranslation; + } + + public float getMaxHeadsUpTranslation() { + return mMaxHeadsUpTranslation; + } + + public ExpandableNotificationRow getTopHeadsUpEntry() { + HeadsUpManager.HeadsUpEntry topEntry = mHeadsUpManager.getTopEntry(); + return topEntry == null ? null : topEntry.entry.row; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 2eafd57..88fc602 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -24,6 +24,7 @@ import android.graphics.Paint; import android.graphics.PointF; import android.util.AttributeSet; import android.util.Log; +import android.util.Pair; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; @@ -47,6 +48,8 @@ import com.android.systemui.statusbar.StackScrollerDecorView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.PhoneStatusBar; +import com.android.systemui.statusbar.phone.ScrimController; +import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.ScrollAdapter; import java.util.ArrayList; @@ -121,15 +124,15 @@ public class NotificationStackScrollLayout extends ViewGroup private StackScrollState mCurrentStackScrollState = new StackScrollState(this); private AmbientState mAmbientState = new AmbientState(); private NotificationGroupManager mGroupManager; - private ArrayList<View> mChildrenToAddAnimated = new ArrayList<View>(); - private ArrayList<View> mChildrenToRemoveAnimated = new ArrayList<View>(); - private ArrayList<View> mSnappedBackChildren = new ArrayList<View>(); - private ArrayList<View> mDragAnimPendingChildren = new ArrayList<View>(); - private ArrayList<View> mChildrenChangingPositions = new ArrayList<View>(); + private ArrayList<View> mChildrenToAddAnimated = new ArrayList<>(); + private ArrayList<View> mAddedHeadsUpChildren = new ArrayList<>(); + private ArrayList<View> mChildrenToRemoveAnimated = new ArrayList<>(); + private ArrayList<View> mSnappedBackChildren = new ArrayList<>(); + private ArrayList<View> mDragAnimPendingChildren = new ArrayList<>(); + private ArrayList<View> mChildrenChangingPositions = new ArrayList<>(); private HashSet<View> mFromMoreCardAdditions = new HashSet<>(); - private ArrayList<AnimationEvent> mAnimationEvents - = new ArrayList<AnimationEvent>(); - private ArrayList<View> mSwipedOutViews = new ArrayList<View>(); + private ArrayList<AnimationEvent> mAnimationEvents = new ArrayList<>(); + private ArrayList<View> mSwipedOutViews = new ArrayList<>(); private final StackStateAnimator mStateAnimator = new StackStateAnimator(this); private boolean mAnimationsEnabled; private boolean mChangePositionInProgress; @@ -143,7 +146,6 @@ public class NotificationStackScrollLayout extends ViewGroup * The raw amount of the overScroll on the bottom, which is not rubber-banded. */ private float mOverScrolledBottomPixels; - private OnChildLocationsChangedListener mListener; private OnOverscrollTopChangedListener mOverscrollTopChangedListener; private ExpandableView.OnHeightChangedListener mOnHeightChangedListener; @@ -171,7 +173,6 @@ public class NotificationStackScrollLayout extends ViewGroup * Was the scroller scrolled to the top when the down motion was observed? */ private boolean mScrolledToTopOnFirstDown; - /** * The minimal amount of over scroll which is needed in order to switch to the quick settings * when over scrolling on a expanded card. @@ -179,6 +180,7 @@ public class NotificationStackScrollLayout extends ViewGroup private float mMinTopOverScrollToEscape; private int mIntrinsicPadding; private int mNotificationTopPadding; + private float mStackTranslation; private float mTopPaddingOverflow; private boolean mDontReportNextOverScroll; private boolean mRequestViewResizeAnimationOnLayout; @@ -202,9 +204,9 @@ public class NotificationStackScrollLayout extends ViewGroup private ViewGroup mScrollView; private boolean mInterceptDelegateEnabled; private boolean mDelegateToScrollView; + private boolean mDisallowScrollingInThisMotion; private long mGoToFullShadeDelay; - private ViewTreeObserver.OnPreDrawListener mChildrenUpdater = new ViewTreeObserver.OnPreDrawListener() { @Override @@ -218,7 +220,12 @@ public class NotificationStackScrollLayout extends ViewGroup private PhoneStatusBar mPhoneStatusBar; private int[] mTempInt2 = new int[2]; private boolean mGenerateChildOrderChangedEvent; - private boolean mRemoveAnimationEnabled; + private HashSet<Runnable> mAnimationFinishedRunnables = new HashSet<>(); + private HashSet<Pair<ExpandableNotificationRow, Boolean>> mHeadsUpChangeAnimations + = new HashSet<>(); + private HeadsUpManager mHeadsUpManager; + private boolean mTrackingHeadsUp; + private ScrimController mScrimController; public NotificationStackScrollLayout(Context context) { this(context, null); @@ -404,8 +411,8 @@ public class NotificationStackScrollLayout extends ViewGroup } private void updateAlgorithmHeightAndPadding() { - mStackScrollAlgorithm.setLayoutHeight(getLayoutHeight()); - mStackScrollAlgorithm.setTopPadding(mTopPadding); + mAmbientState.setLayoutHeight(getLayoutHeight()); + mAmbientState.setTopPadding(mTopPadding); } /** @@ -478,9 +485,13 @@ public class NotificationStackScrollLayout extends ViewGroup int newStackHeight = (int) height; int minStackHeight = getMinStackHeight(); int stackHeight; - if (newStackHeight - mTopPadding - mTopPaddingOverflow >= minStackHeight + float paddingOffset; + boolean trackingHeadsUp = mTrackingHeadsUp; + int normalExpandPositionStart = trackingHeadsUp ? mHeadsUpManager.getTopHeadsUpHeight() + : minStackHeight; + if (newStackHeight - mTopPadding - mTopPaddingOverflow >= normalExpandPositionStart || getNotGoneChildCount() == 0) { - setTranslationY(mTopPaddingOverflow); + paddingOffset = mTopPaddingOverflow; stackHeight = newStackHeight; } else { @@ -492,9 +503,13 @@ public class NotificationStackScrollLayout extends ViewGroup float partiallyThere = (newStackHeight - mTopPadding - mTopPaddingOverflow) / minStackHeight; partiallyThere = Math.max(0, partiallyThere); - translationY += (1 - partiallyThere) * (mBottomStackPeekSize + - mCollapseSecondCardPadding); - setTranslationY(translationY - mTopPadding); + if (!trackingHeadsUp) { + translationY += (1 - partiallyThere) * (mBottomStackPeekSize + + mCollapseSecondCardPadding); + } else { + translationY = (int) (height - mHeadsUpManager.getTopHeadsUpHeight()); + } + paddingOffset = translationY - mTopPadding; stackHeight = (int) (height - (translationY - mTopPadding)); } if (stackHeight != mCurrentStackHeight) { @@ -502,6 +517,19 @@ public class NotificationStackScrollLayout extends ViewGroup updateAlgorithmHeightAndPadding(); requestChildrenUpdate(); } + setStackTranslation(paddingOffset); + } + + public float getStackTranslation() { + return mStackTranslation; + } + + private void setStackTranslation(float stackTranslation) { + if (stackTranslation != mStackTranslation) { + mStackTranslation = stackTranslation; + mAmbientState.setStackTranslation(stackTranslation); + requestChildrenUpdate(); + } } /** @@ -543,11 +571,6 @@ public class NotificationStackScrollLayout extends ViewGroup if (mDismissAllInProgress) { return; } - if (DEBUG) Log.v(TAG, "onChildDismissed: " + v); - final View veto = v.findViewById(R.id.veto); - if (veto != null && veto.getVisibility() != View.GONE) { - veto.performClick(); - } setSwipingInProgress(false); if (mDragAnimPendingChildren.contains(v)) { // We start the swipe and finish it in the same frame, we don't want any animation @@ -556,6 +579,17 @@ public class NotificationStackScrollLayout extends ViewGroup } mSwipedOutViews.add(v); mAmbientState.onDragFinished(v); + if (v instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) v; + if (row.isHeadsUp()) { + mHeadsUpManager.addSwipedOutKey(row.getStatusBarNotification().getKey()); + } + } + final View veto = v.findViewById(R.id.veto); + if (veto != null && veto.getVisibility() != View.GONE) { + veto.performClick(); + } + if (DEBUG) Log.v(TAG, "onChildDismissed: " + v); } @Override @@ -575,28 +609,48 @@ public class NotificationStackScrollLayout extends ViewGroup @Override public boolean updateSwipeProgress(View animView, boolean dismissable, float swipeProgress) { + if (isPinnedHeadsUp(animView) && canChildBeDismissed(animView)) { + mScrimController.setTopHeadsUpDragAmount(animView, + Math.min(Math.abs(swipeProgress - 1.0f), 1.0f)); + } return false; } - @Override - public float getFalsingThresholdFactor() { - return mPhoneStatusBar.isScreenOnComingFromTouch() ? 1.5f : 1.0f; - } - public void onBeginDrag(View v) { setSwipingInProgress(true); mAmbientState.onBeginDrag(v); - if (mAnimationsEnabled) { + if (mAnimationsEnabled && !isPinnedHeadsUp(v)) { mDragAnimPendingChildren.add(v); mNeedsAnimation = true; } requestChildrenUpdate(); } + public boolean isPinnedHeadsUp(View v) { + if (v instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) v; + return row.isHeadsUp() && !row.isInShade(); + } + return false; + } + + private boolean isHeadsUp(View v) { + if (v instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) v; + return row.isHeadsUp(); + } + return false; + } + public void onDragCancelled(View v) { setSwipingInProgress(false); } + @Override + public float getFalsingThresholdFactor() { + return mPhoneStatusBar.isScreenOnComingFromTouch() ? 1.5f : 1.0f; + } + public View getChildAtPosition(MotionEvent ev) { return getChildAtPosition(ev.getX(), ev.getY()); } @@ -657,6 +711,10 @@ public class NotificationStackScrollLayout extends ViewGroup if (touchY >= top && touchY <= bottom && touchX >= left && touchX <= right) { if (slidingChild instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) slidingChild; + if (row.isHeadsUp() && !row.isInShade() + && mHeadsUpManager.getTopEntry().entry.row != row) { + continue; + } return row.getViewAtPosition(touchY - childTop); } return slidingChild; @@ -667,7 +725,8 @@ public class NotificationStackScrollLayout extends ViewGroup public boolean canChildBeExpanded(View v) { return v instanceof ExpandableNotificationRow - && ((ExpandableNotificationRow) v).isExpandable(); + && ((ExpandableNotificationRow) v).isExpandable() + && !((ExpandableNotificationRow) v).isHeadsUp(); } public void setUserExpandedChild(View v, boolean userExpanded) { @@ -1343,12 +1402,9 @@ public class NotificationStackScrollLayout extends ViewGroup // add the padding before this element height += mPaddingBetweenElements; } - if (child instanceof ExpandableNotificationRow) { - ExpandableNotificationRow row = (ExpandableNotificationRow) child; - height += row.getIntrinsicHeight(); - } else if (child instanceof ExpandableView) { + if (child instanceof ExpandableView) { ExpandableView expandableView = (ExpandableView) child; - height += expandableView.getActualHeight(); + height += expandableView.getIntrinsicHeight(); } } } @@ -1573,16 +1629,11 @@ public class NotificationStackScrollLayout extends ViewGroup ((ExpandableView) child).setOnHeightChangedListener(null); mCurrentStackScrollState.removeViewStateForView(child); updateScrollStateForRemovedChild(child); - if (mRemoveAnimationEnabled) { - boolean animationGenerated = generateRemoveAnimation(child); - if (animationGenerated && !mSwipedOutViews.contains(child)) { - // Add this view to an overlay in order to ensure that it will still be temporary - // drawn when removed - getOverlay().add(child); - } - } else { - // TODO: handle this more cleanly when HEADS-up and the shade are merged - requestAnimateEverything(); + boolean animationGenerated = generateRemoveAnimation(child); + if (animationGenerated && !mSwipedOutViews.contains(child)) { + // Add this view to an overlay in order to ensure that it will still be temporary + // drawn when removed + getOverlay().add(child); } updateAnimationState(false, child); @@ -1713,16 +1764,17 @@ public class NotificationStackScrollLayout extends ViewGroup } private void updateNotificationAnimationStates() { - boolean running = mIsExpanded && mAnimationsEnabled; + boolean running = mAnimationsEnabled; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); + running &= mIsExpanded || isPinnedHeadsUp(child); updateAnimationState(running, child); } } private void updateAnimationState(View child) { - updateAnimationState(mAnimationsEnabled && mIsExpanded, child); + updateAnimationState((mAnimationsEnabled || isPinnedHeadsUp(child)) && mIsExpanded, child); } @@ -1752,6 +1804,10 @@ public class NotificationStackScrollLayout extends ViewGroup } mNeedsAnimation = true; } + if (isHeadsUp(child)) { + mAddedHeadsUpChildren.add(child); + mChildrenToAddAnimated.remove(child); + } } /** @@ -1790,6 +1846,7 @@ public class NotificationStackScrollLayout extends ViewGroup } private void generateChildHierarchyEvents() { + generateHeadsUpAnimationEvents(); generateChildRemovalEvents(); generateChildAdditionEvents(); generatePositionChangeEvents(); @@ -1807,6 +1864,40 @@ public class NotificationStackScrollLayout extends ViewGroup mNeedsAnimation = false; } + private void generateHeadsUpAnimationEvents() { + for (Pair<ExpandableNotificationRow, Boolean> eventPair : mHeadsUpChangeAnimations) { + ExpandableNotificationRow row = eventPair.first; + boolean isHeadsUp = eventPair.second; + int type = AnimationEvent.ANIMATION_TYPE_HEADS_UP_OTHER; + boolean onBottom = false; + if (!mIsExpanded && !isHeadsUp) { + type = AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR; + } else if (mAddedHeadsUpChildren.contains(row) || (!row.isInShade() && !mIsExpanded)) { + if (!row.isInShade() || shouldHunAppearFromBottom(row)) { + // Our custom add animation + type = AnimationEvent.ANIMATION_TYPE_HEADS_UP_APPEAR; + } else { + // Normal add animation + type = AnimationEvent.ANIMATION_TYPE_ADD; + } + onBottom = row.isInShade(); + } + AnimationEvent event = new AnimationEvent(row, type); + event.headsUpFromBottom = onBottom; + mAnimationEvents.add(event); + } + mHeadsUpChangeAnimations.clear(); + mAddedHeadsUpChildren.clear(); + } + + private boolean shouldHunAppearFromBottom(ExpandableNotificationRow row) { + StackViewState viewState = mCurrentStackScrollState.getViewStateForView(row); + if (viewState.yTranslation + viewState.height < mAmbientState.getMaxHeadsUpTranslation()) { + return false; + } + return true; + } + private void generateGroupExpansionEvent() { // Generate a group expansion/collapsing event if there is such a group at all if (mExpandedGroupView != null) { @@ -2182,6 +2273,10 @@ public class NotificationStackScrollLayout extends ViewGroup public void onChildAnimationFinished() { requestChildrenUpdate(); + for (Runnable runnable : mAnimationFinishedRunnables) { + runnable.run(); + } + mAnimationFinishedRunnables.clear(); } /** @@ -2283,7 +2378,7 @@ public class NotificationStackScrollLayout extends ViewGroup * @return the y position of the first notification */ public float getNotificationsTopY() { - return mTopPadding + getTranslationY(); + return mTopPadding + getStackTranslation(); } @Override @@ -2470,7 +2565,7 @@ public class NotificationStackScrollLayout extends ViewGroup max = bottom; } } - return max + getTranslationY(); + return max + getStackTranslation(); } /** @@ -2530,10 +2625,6 @@ public class NotificationStackScrollLayout extends ViewGroup return touchY > mIntrinsicPadding; } - public void setRemoveAnimationEnabled(boolean enabled) { - mRemoveAnimationEnabled = enabled; - } - private void updateExpandButtons() { for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); @@ -2579,6 +2670,50 @@ public class NotificationStackScrollLayout extends ViewGroup } } + public void performOnAnimationFinished(Runnable runnable) { + mAnimationFinishedRunnables.add(runnable); + } + + public void setHeadsUpManager(HeadsUpManager headsUpManager) { + mHeadsUpManager = headsUpManager; + mAmbientState.setHeadsUpManager(headsUpManager); + mStackScrollAlgorithm.setHeadsUpManager(headsUpManager); + } + + public void generateHeadsUpAnimation(ExpandableNotificationRow row, boolean isHeadsUp) { + if (mAnimationsEnabled) { + mHeadsUpChangeAnimations.add(new Pair<>(row, isHeadsUp)); + mNeedsAnimation = true; + requestChildrenUpdate(); + } + } + + public void setShadeExpanded(boolean shadeExpanded) { + mAmbientState.setShadeExpanded(shadeExpanded); + mStateAnimator.setShadeExpanded(shadeExpanded); + } + + /** + * Set the boundary for the bottom heads up position. The heads up will always be above this + * position. + * + * @param height the height of the screen + * @param bottomBarHeight the height of the bar on the bottom + */ + public void setHeadsUpBoundaries(int height, int bottomBarHeight) { + mAmbientState.setMaxHeadsUpTranslation(height - bottomBarHeight); + mStateAnimator.setHeadsUpAppearHeightBottom(height); + requestChildrenUpdate(); + } + + public void setTrackingHeadsUp(boolean trackingHeadsUp) { + mTrackingHeadsUp = trackingHeadsUp; + } + + public void setScrimController(ScrimController scrimController) { + mScrimController = scrimController; + } + /** * A listener that is notified when some child locations might have changed. */ @@ -2723,6 +2858,30 @@ public class NotificationStackScrollLayout extends ViewGroup .animateY() .animateZ(), + // ANIMATION_TYPE_HEADS_UP_APPEAR + new AnimationFilter() + .animateAlpha() + .animateHeight() + .animateTopInset() + .animateY() + .animateZ(), + + // ANIMATION_TYPE_HEADS_UP_DISAPPEAR + new AnimationFilter() + .animateAlpha() + .animateHeight() + .animateTopInset() + .animateY() + .animateZ(), + + // ANIMATION_TYPE_HEADS_UP_OTHER + new AnimationFilter() + .animateAlpha() + .animateHeight() + .animateTopInset() + .animateY() + .animateZ(), + // ANIMATION_TYPE_EVERYTHING new AnimationFilter() .animateAlpha() @@ -2780,6 +2939,15 @@ public class NotificationStackScrollLayout extends ViewGroup // ANIMATION_TYPE_GROUP_EXPANSION_CHANGED StackStateAnimator.ANIMATION_DURATION_EXPAND_CLICKED, + // ANIMATION_TYPE_HEADS_UP_APPEAR + StackStateAnimator.ANIMATION_DURATION_HEADS_UP_APPEAR, + + // ANIMATION_TYPE_HEADS_UP_DISAPPEAR + StackStateAnimator.ANIMATION_DURATION_HEADS_UP_DISAPPEAR, + + // ANIMATION_TYPE_HEADS_UP_OTHER + StackStateAnimator.ANIMATION_DURATION_STANDARD, + // ANIMATION_TYPE_EVERYTHING StackStateAnimator.ANIMATION_DURATION_STANDARD, }; @@ -2798,7 +2966,10 @@ public class NotificationStackScrollLayout extends ViewGroup static final int ANIMATION_TYPE_HIDE_SENSITIVE = 11; static final int ANIMATION_TYPE_VIEW_RESIZE = 12; static final int ANIMATION_TYPE_GROUP_EXPANSION_CHANGED = 13; - static final int ANIMATION_TYPE_EVERYTHING = 14; + static final int ANIMATION_TYPE_HEADS_UP_APPEAR = 14; + static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR = 15; + static final int ANIMATION_TYPE_HEADS_UP_OTHER = 16; + static final int ANIMATION_TYPE_EVERYTHING = 17; static final int DARK_ANIMATION_ORIGIN_INDEX_ABOVE = -1; static final int DARK_ANIMATION_ORIGIN_INDEX_BELOW = -2; @@ -2810,6 +2981,7 @@ public class NotificationStackScrollLayout extends ViewGroup final long length; View viewAfterChangingView; int darkAnimationOriginIndex; + boolean headsUpFromBottom; AnimationEvent(View view, int type) { this(view, type, LENGTHS[type]); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index e7bf47b..d98bcfe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -25,9 +25,11 @@ import android.view.ViewGroup; import com.android.systemui.R; import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.ExpandableView; +import com.android.systemui.statusbar.policy.HeadsUpManager; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; /** * The Algorithm of the {@link com.android.systemui.statusbar.stack @@ -54,11 +56,6 @@ public class StackScrollAlgorithm { private StackIndentationFunctor mTopStackIndentationFunctor; private StackIndentationFunctor mBottomStackIndentationFunctor; - private int mLayoutHeight; - - /** mLayoutHeight - mTopPadding */ - private int mInnerHeight; - private int mTopPadding; private StackScrollAlgorithmState mTempAlgorithmState = new StackScrollAlgorithmState(); private boolean mIsExpansionChanging; private int mFirstChildMaxHeight; @@ -74,6 +71,7 @@ public class StackScrollAlgorithm { private boolean mIsSmallScreen; private int mMaxNotificationHeight; private boolean mScaleDimmed; + private HeadsUpManager mHeadsUpManager; public StackScrollAlgorithm(Context context) { initConstants(context); @@ -157,20 +155,20 @@ public class StackScrollAlgorithm { scrollY = Math.max(0, scrollY); algorithmState.scrollY = (int) (scrollY + mCollapsedSize + bottomOverScroll); - updateVisibleChildren(resultState, algorithmState); + updateVisibleChildren(resultState, algorithmState, ambientState); // Phase 1: - findNumberOfItemsInTopStackAndUpdateState(resultState, algorithmState); + findNumberOfItemsInTopStackAndUpdateState(resultState, algorithmState, ambientState); // Phase 2: - updatePositionsForState(resultState, algorithmState); + updatePositionsForState(resultState, algorithmState, ambientState); // Phase 3: updateZValuesForState(resultState, algorithmState); handleDraggedViews(ambientState, resultState, algorithmState); updateDimmedActivatedHideSensitive(ambientState, resultState, algorithmState); - updateClipping(resultState, algorithmState); + updateClipping(resultState, algorithmState, ambientState); updateSpeedBumpState(resultState, algorithmState, ambientState.getSpeedBumpIndex()); getNotificationChildrenStates(resultState, algorithmState); } @@ -201,7 +199,7 @@ public class StackScrollAlgorithm { } private void updateClipping(StackScrollState resultState, - StackScrollAlgorithmState algorithmState) { + StackScrollAlgorithmState algorithmState, AmbientState ambientState) { float previousNotificationEnd = 0; float previousNotificationStart = 0; boolean previousNotificationIsSwiped = false; @@ -242,7 +240,7 @@ public class StackScrollAlgorithm { // otherwise we would clip to a transparent view. previousNotificationStart = newYTranslation + state.clipTopAmount * state.scale; previousNotificationEnd = newNotificationEnd; - previousNotificationIsSwiped = child.getTranslationX() != 0; + previousNotificationIsSwiped = ambientState.getDraggedViews().contains(child); } } } @@ -314,7 +312,9 @@ public class StackScrollAlgorithm { StackViewState viewState = resultState.getViewStateForView( nextChild); // The child below the dragged one must be fully visible - viewState.alpha = 1; + if (!isPinnedHeadsUpView(draggedView) || isPinnedHeadsUpView(nextChild)) { + viewState.alpha = 1; + } } // Lets set the alpha to the one it currently has, as its currently being dragged @@ -325,27 +325,41 @@ public class StackScrollAlgorithm { } } + private boolean isPinnedHeadsUpView(View view) { + if (view instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) view; + return row.isHeadsUp() && !row.isInShade(); + } + return false; + } + /** * Update the visible children on the state. */ private void updateVisibleChildren(StackScrollState resultState, - StackScrollAlgorithmState state) { + StackScrollAlgorithmState state, AmbientState ambientState) { ViewGroup hostView = resultState.getHostView(); int childCount = hostView.getChildCount(); state.visibleChildren.clear(); state.visibleChildren.ensureCapacity(childCount); int notGoneIndex = 0; + TreeSet<HeadsUpManager.HeadsUpEntry> headsUpEntries + = ambientState.getSortedHeadsUpEntries(); + for (HeadsUpManager.HeadsUpEntry entry: headsUpEntries) { + ExpandableView v = entry.entry.row; + notGoneIndex = updateNotGoneIndex(resultState, state, notGoneIndex, v); + } for (int i = 0; i < childCount; i++) { ExpandableView v = (ExpandableView) hostView.getChildAt(i); if (v.getVisibility() != View.GONE) { - StackViewState viewState = resultState.getViewStateForView(v); - viewState.notGoneIndex = notGoneIndex; - state.visibleChildren.add(v); - notGoneIndex++; - - // handle the notgoneIndex for the children as well if (v instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) v; + if (row.isHeadsUp()) { + continue; + } + notGoneIndex = updateNotGoneIndex(resultState, state, notGoneIndex, v); + + // handle the notgoneIndex for the children as well List<ExpandableNotificationRow> children = row.getNotificationChildren(); if (row.areChildrenExpanded() && children != null) { @@ -358,22 +372,35 @@ public class StackScrollAlgorithm { } } } + } else { + notGoneIndex = updateNotGoneIndex(resultState, state, notGoneIndex, v); } } } } + private int updateNotGoneIndex(StackScrollState resultState, + StackScrollAlgorithmState state, int notGoneIndex, + ExpandableView v) { + StackViewState viewState = resultState.getViewStateForView(v); + viewState.notGoneIndex = notGoneIndex; + state.visibleChildren.add(v); + notGoneIndex++; + return notGoneIndex; + } + /** * Determine the positions for the views. This is the main part of the algorithm. * - * @param resultState The result state to update if a change to the properties of a child occurs + * @param resultState The result state to update if a change to the properties of a child occurs * @param algorithmState The state in which the current pass of the algorithm is currently in + * @param ambientState The current ambient state */ private void updatePositionsForState(StackScrollState resultState, - StackScrollAlgorithmState algorithmState) { + StackScrollAlgorithmState algorithmState, AmbientState ambientState) { // The starting position of the bottom stack peek - float bottomPeekStart = mInnerHeight - mBottomStackPeekSize; + float bottomPeekStart = ambientState.getInnerHeight() - mBottomStackPeekSize; // The position where the bottom stack starts. float bottomStackStart = bottomPeekStart - mBottomStackSlowDownLength; @@ -384,13 +411,17 @@ public class StackScrollAlgorithm { // How far in is the element currently transitioning into the bottom stack. float yPositionInScrollView = 0.0f; + // If we have a heads-up higher than the collapsed height we need to add the difference to + // the padding of all other elements, i.e push in the top stack slightly. + ExpandableNotificationRow topHeadsUpEntry = ambientState.getTopHeadsUpEntry(); + int childCount = algorithmState.visibleChildren.size(); int numberOfElementsCompletelyIn = (int) algorithmState.itemsInTopStack; for (int i = 0; i < childCount; i++) { ExpandableView child = algorithmState.visibleChildren.get(i); StackViewState childViewState = resultState.getViewStateForView(child); childViewState.location = StackViewState.LOCATION_UNKNOWN; - int childHeight = getMaxAllowedChildHeight(child); + int childHeight = getMaxAllowedChildHeight(child, ambientState); float yPositionInScrollViewAfterElement = yPositionInScrollView + childHeight + mPaddingBetweenElements; @@ -427,7 +458,8 @@ public class StackScrollAlgorithm { bottomPeekStart, childViewState.yTranslation, childViewState, childHeight); } - clampPositionToBottomStackStart(childViewState, childViewState.height); + clampPositionToBottomStackStart(childViewState, childViewState.height, + ambientState); } else if (nextYPosition >= bottomStackStart) { // Case 2: // We are in the bottom stack. @@ -435,7 +467,7 @@ public class StackScrollAlgorithm { // According to the regular scroll view we are fully translated out of the // bottom of the screen so we are fully in the bottom stack updateStateForChildFullyInBottomStack(algorithmState, - bottomStackStart, childViewState, childHeight); + bottomStackStart, childViewState, childHeight, ambientState); } else { // According to the regular scroll view we are currently translating out of / // into the bottom of the screen @@ -447,7 +479,7 @@ public class StackScrollAlgorithm { // Case 3: // We are in the regular scroll area. childViewState.location = StackViewState.LOCATION_MAIN_AREA; - clampYTranslation(childViewState, childHeight); + clampYTranslation(childViewState, childHeight, ambientState); } // The first card is always rendered. @@ -468,7 +500,44 @@ public class StackScrollAlgorithm { currentYPosition = childViewState.yTranslation + childHeight + mPaddingBetweenElements; yPositionInScrollView = yPositionInScrollViewAfterElement; - childViewState.yTranslation += mTopPadding; + if (ambientState.isShadeExpanded() && topHeadsUpEntry != null + && child != topHeadsUpEntry) { + childViewState.yTranslation += topHeadsUpEntry.getHeadsUpHeight() - mCollapsedSize; + } + childViewState.yTranslation += ambientState.getTopPadding() + + ambientState.getStackTranslation(); + } + updateHeadsUpStates(resultState, ambientState); + } + + private void updateHeadsUpStates(StackScrollState resultState, AmbientState ambientState) { + TreeSet<HeadsUpManager.HeadsUpEntry> headsUpEntries = ambientState.getSortedHeadsUpEntries(); + for (HeadsUpManager.HeadsUpEntry entry: headsUpEntries) { + ExpandableNotificationRow row = entry.entry.row; + StackViewState childState = resultState.getViewStateForView(row); + ExpandableNotificationRow topHeadsUpEntry = ambientState.getTopHeadsUpEntry(); + boolean isTopEntry = topHeadsUpEntry == row; + if (!row.isInShade()) { + childState.yTranslation = 0; + childState.height = row.getHeadsUpHeight(); + if (!isTopEntry) { + // Ensure that a headsUp is never below the topmost headsUp + StackViewState topState = resultState.getViewStateForView(topHeadsUpEntry); + childState.height = row.getHeadsUpHeight(); + childState.yTranslation = topState.yTranslation + topState.height + - childState.height; + } + } else if (mIsExpanded) { + if (isTopEntry) { + childState.height += row.getHeadsUpHeight() - mCollapsedSize; + } + childState.height = Math.max(childState.height, row.getHeadsUpHeight()); + // Ensure that the heads up is always visible even when scrolled of from the bottom + float bottomPosition = ambientState.getMaxHeadsUpTranslation() - childState.height; + childState.yTranslation = Math.min(childState.yTranslation, + bottomPosition); + } + } } @@ -478,8 +547,9 @@ public class StackScrollAlgorithm { * @param childViewState the view state of the child * @param childHeight the height of this child */ - private void clampYTranslation(StackViewState childViewState, int childHeight) { - clampPositionToBottomStackStart(childViewState, childHeight); + private void clampYTranslation(StackViewState childViewState, int childHeight, + AmbientState ambientState) { + clampPositionToBottomStackStart(childViewState, childHeight, ambientState); clampPositionToTopStackEnd(childViewState, childHeight); } @@ -491,14 +561,15 @@ public class StackScrollAlgorithm { * @param childHeight the height of this child */ private void clampPositionToBottomStackStart(StackViewState childViewState, - int childHeight) { + int childHeight, AmbientState ambientState) { childViewState.yTranslation = Math.min(childViewState.yTranslation, - mInnerHeight - mBottomStackPeekSize - mCollapseSecondCardPadding - childHeight); + ambientState.getInnerHeight() - mBottomStackPeekSize - mCollapseSecondCardPadding + - childHeight); } /** * Clamp the yTranslation of the child up such that its end is at lest on the end of the top - * stack.get + * stack. * * @param childViewState the view state of the child * @param childHeight the height of this child @@ -509,9 +580,14 @@ public class StackScrollAlgorithm { mCollapsedSize - childHeight); } - private int getMaxAllowedChildHeight(View child) { + private int getMaxAllowedChildHeight(View child, AmbientState ambientState) { if (child instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) child; + if (ambientState == null && row.isHeadsUp() + || ambientState != null && ambientState.getTopHeadsUpEntry() == child) { + int extraSize = row.getIntrinsicHeight() - row.getHeadsUpHeight(); + return mCollapsedSize + extraSize; + } return row.getIntrinsicHeight(); } else if (child instanceof ExpandableView) { ExpandableView expandableView = (ExpandableView) child; @@ -548,8 +624,7 @@ public class StackScrollAlgorithm { private void updateStateForChildFullyInBottomStack(StackScrollAlgorithmState algorithmState, float transitioningPositionStart, StackViewState childViewState, - int childHeight) { - + int childHeight, AmbientState ambientState) { float currentYPosition; algorithmState.itemsInBottomStack += 1.0f; if (algorithmState.itemsInBottomStack < MAX_ITEMS_IN_BOTTOM_STACK) { @@ -567,7 +642,7 @@ public class StackScrollAlgorithm { childViewState.alpha = 1.0f - algorithmState.partialInBottom; } childViewState.location = StackViewState.LOCATION_BOTTOM_STACK_HIDDEN; - currentYPosition = mInnerHeight; + currentYPosition = ambientState.getInnerHeight(); } childViewState.yTranslation = currentYPosition - childHeight; clampPositionToTopStackEnd(childViewState, childHeight); @@ -629,7 +704,7 @@ public class StackScrollAlgorithm { * @param algorithmState The state in which the current pass of the algorithm is currently in */ private void findNumberOfItemsInTopStackAndUpdateState(StackScrollState resultState, - StackScrollAlgorithmState algorithmState) { + StackScrollAlgorithmState algorithmState, AmbientState ambientState) { // The y Position if the element would be in a regular scrollView float yPositionInScrollView = 0.0f; @@ -639,7 +714,7 @@ public class StackScrollAlgorithm { for (int i = 0; i < childCount; i++) { ExpandableView child = algorithmState.visibleChildren.get(i); StackViewState childViewState = resultState.getViewStateForView(child); - int childHeight = getMaxAllowedChildHeight(child); + int childHeight = getMaxAllowedChildHeight(child, ambientState); float yPositionInScrollViewAfterElement = yPositionInScrollView + childHeight + mPaddingBetweenElements; @@ -647,7 +722,7 @@ public class StackScrollAlgorithm { if (i == 0 && algorithmState.scrollY <= mCollapsedSize) { // The starting position of the bottom stack peek - int bottomPeekStart = mInnerHeight - mBottomStackPeekSize - + int bottomPeekStart = ambientState.getInnerHeight() - mBottomStackPeekSize - mCollapseSecondCardPadding; // Collapse and expand the first child while the shade is being expanded float maxHeight = mIsExpansionChanging && child == mFirstChildWhileExpanding @@ -744,21 +819,6 @@ public class StackScrollAlgorithm { } } - public void setLayoutHeight(int layoutHeight) { - this.mLayoutHeight = layoutHeight; - updateInnerHeight(); - } - - public void setTopPadding(int topPadding) { - mTopPadding = topPadding; - updateInnerHeight(); - } - - private void updateInnerHeight() { - mInnerHeight = mLayoutHeight - mTopPadding; - } - - /** * Update whether the device is very small, i.e. Notifications can be in both the top and the * bottom stack at the same time @@ -788,6 +848,13 @@ public class StackScrollAlgorithm { // current height or the end value of the animation. mFirstChildMaxHeight = StackStateAnimator.getFinalActualHeight( mFirstChildWhileExpanding); + if (mFirstChildWhileExpanding instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = + (ExpandableNotificationRow) mFirstChildWhileExpanding; + if (row.isHeadsUp()) { + mFirstChildMaxHeight += mCollapsedSize - row.getHeadsUpHeight(); + } + } } else { updateFirstChildMaxSizeToMaxHeight(); } @@ -809,7 +876,7 @@ public class StackScrollAlgorithm { int oldBottom) { if (mFirstChildWhileExpanding != null) { mFirstChildMaxHeight = getMaxAllowedChildHeight( - mFirstChildWhileExpanding); + mFirstChildWhileExpanding, null); } else { mFirstChildMaxHeight = 0; } @@ -817,7 +884,7 @@ public class StackScrollAlgorithm { } }); } else { - mFirstChildMaxHeight = getMaxAllowedChildHeight(mFirstChildWhileExpanding); + mFirstChildMaxHeight = getMaxAllowedChildHeight(mFirstChildWhileExpanding, null); } } @@ -830,6 +897,9 @@ public class StackScrollAlgorithm { } private View findFirstVisibleChild(ViewGroup container) { + if (mHeadsUpManager != null && mHeadsUpManager.getTopEntry() != null) { + return mHeadsUpManager.getTopEntry().entry.row; + } int childCount = container.getChildCount(); for (int i = 0; i < childCount; i++) { View child = container.getChildAt(i); @@ -870,6 +940,10 @@ public class StackScrollAlgorithm { } } + public void setHeadsUpManager(HeadsUpManager headsUpManager) { + mHeadsUpManager = headsUpManager; + } + class StackScrollAlgorithmState { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java index b249fbf..f5d94c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -21,9 +21,11 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; +import android.graphics.Path; import android.view.View; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; +import android.view.animation.PathInterpolator; import com.android.systemui.R; import com.android.systemui.statusbar.ExpandableNotificationRow; @@ -32,7 +34,6 @@ import com.android.systemui.statusbar.SpeedBumpView; import java.util.ArrayList; import java.util.HashSet; -import java.util.Set; import java.util.Stack; /** @@ -45,6 +46,8 @@ public class StackStateAnimator { public static final int ANIMATION_DURATION_APPEAR_DISAPPEAR = 464; public static final int ANIMATION_DURATION_EXPAND_CLICKED = 360; public static final int ANIMATION_DURATION_DIMMED_ACTIVATED = 220; + public static final int ANIMATION_DURATION_HEADS_UP_APPEAR = 650; + public static final int ANIMATION_DURATION_HEADS_UP_DISAPPEAR = 230; public static final int ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING = 80; public static final int ANIMATION_DELAY_PER_ELEMENT_EXPAND_CHILDREN = 54; public static final int ANIMATION_DELAY_PER_ELEMENT_MANUAL = 32; @@ -73,12 +76,15 @@ public class StackStateAnimator { private static final int TAG_START_TOP_INSET = R.id.top_inset_animator_start_value_tag; private final Interpolator mFastOutSlowInInterpolator; + private final Interpolator mHeadsUpAppearInterpolator; private final int mGoToFullShadeAppearingTranslation; public NotificationStackScrollLayout mHostLayout; private ArrayList<NotificationStackScrollLayout.AnimationEvent> mNewEvents = new ArrayList<>(); private ArrayList<View> mNewAddChildren = new ArrayList<>(); - private Set<Animator> mAnimatorSet = new HashSet<>(); + private HashSet<View> mHeadsUpAppearChildren = new HashSet<>(); + private HashSet<View> mHeadsUpDisappearChildren = new HashSet<>(); + private HashSet<Animator> mAnimatorSet = new HashSet<>(); private Stack<AnimatorListenerAdapter> mAnimationListenerPool = new Stack<>(); private AnimationFilter mAnimationFilter = new AnimationFilter(); private long mCurrentLength; @@ -86,10 +92,12 @@ public class StackStateAnimator { /** The current index for the last child which was not added in this event set. */ private int mCurrentLastNotAddedIndex; - private ValueAnimator mTopOverScrollAnimator; private ValueAnimator mBottomOverScrollAnimator; private ExpandableNotificationRow mChildExpandingView; + private StackViewState mTmpState = new StackViewState(); + private int mHeadsUpAppearHeightBottom; + private boolean mShadeExpanded; public StackStateAnimator(NotificationStackScrollLayout hostLayout) { mHostLayout = hostLayout; @@ -98,6 +106,25 @@ public class StackStateAnimator { mGoToFullShadeAppearingTranslation = hostLayout.getContext().getResources().getDimensionPixelSize( R.dimen.go_to_full_shade_appearing_translation); + Path path = new Path(); + path.moveTo(0, 0); + float x1 = 250f; + float x2 = 150f; + float x3 = 100f; + float y1 = 90f; + float y2 = 78f; + float y3 = 80f; + float xTot = (x1 + x2 + x3); + path.cubicTo(x1 * 0.9f / xTot, 0f, + x1 * 0.8f / xTot, y1 / y3, + x1 / xTot , y1 / y3); + path.cubicTo((x1 + x2 * 0.4f) / xTot, y1 / y3, + (x1 + x2 * 0.2f) / xTot, y2 / y3, + (x1 + x2) / xTot, y2 / y3); + path.cubicTo((x1 + x2 + x3 * 0.4f) / xTot, y2 / y3, + (x1 + x2 + x3 * 0.2f) / xTot, 1f, + 1f, 1f); + mHeadsUpAppearInterpolator = new PathInterpolator(path); } public boolean isRunning() { @@ -119,7 +146,8 @@ public class StackStateAnimator { final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i); StackViewState viewState = finalState.getViewStateForView(child); - if (viewState == null || child.getVisibility() == View.GONE) { + if (viewState == null || child.getVisibility() == View.GONE + || applyWithoutAnimation(child, viewState, finalState)) { continue; } @@ -130,11 +158,39 @@ public class StackStateAnimator { // no child has preformed any animation, lets finish onAnimationFinished(); } + mHeadsUpAppearChildren.clear(); + mHeadsUpDisappearChildren.clear(); mNewEvents.clear(); mNewAddChildren.clear(); mChildExpandingView = null; } + /** + * Determines if a view should not perform an animation and applies it directly. + * + * @return true if no animation should be performed + */ + private boolean applyWithoutAnimation(ExpandableView child, StackViewState viewState, + StackScrollState finalState) { + if (mShadeExpanded) { + return false; + } + if (getChildTag(child, TAG_ANIMATOR_TRANSLATION_Y) != null) { + // A Y translation animation is running + return false; + } + if (mHeadsUpDisappearChildren.contains(child) || mHeadsUpAppearChildren.contains(child)) { + // This is a heads up animation + return false; + } + if (mHostLayout.isPinnedHeadsUp(child)) { + // This is another headsUp which might move. Let's animate! + return false; + } + finalState.applyState(child, viewState); + return true; + } + private int findLastNotAddedIndex(StackScrollState finalState) { int childCount = mHostLayout.getChildCount(); for (int i = childCount - 1; i >= 0; i--) { @@ -616,7 +672,9 @@ public class StackStateAnimator { ObjectAnimator animator = ObjectAnimator.ofFloat(child, View.TRANSLATION_Y, child.getTranslationY(), newEndValue); - animator.setInterpolator(mFastOutSlowInInterpolator); + Interpolator interpolator = mHeadsUpAppearChildren.contains(child) ? + mHeadsUpAppearInterpolator :mFastOutSlowInInterpolator; + animator.setInterpolator(interpolator); long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator); animator.setDuration(newDuration); if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) { @@ -731,7 +789,7 @@ public class StackStateAnimator { }; } - private static <T> T getChildTag(View child, int tag) { + public static <T> T getChildTag(View child, int tag) { return (T) child.getTag(tag); } @@ -828,6 +886,22 @@ public class StackStateAnimator { ExpandableNotificationRow row = (ExpandableNotificationRow) event.changingView; row.prepareExpansionChanged(finalState); mChildExpandingView = row; + } else if (event.animationType == NotificationStackScrollLayout + .AnimationEvent.ANIMATION_TYPE_HEADS_UP_APPEAR) { + // This item is added, initialize it's properties. + StackViewState viewState = finalState.getViewStateForView(changingView); + mTmpState.copyFrom(viewState); + if (event.headsUpFromBottom) { + mTmpState.yTranslation = mHeadsUpAppearHeightBottom; + } else { + mTmpState.yTranslation = -mTmpState.height; + } + mHeadsUpAppearChildren.add(changingView); + finalState.applyState(changingView, mTmpState); + } else if (event.animationType == NotificationStackScrollLayout + .AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR) { + // This item is added, initialize it's properties. + mHeadsUpDisappearChildren.add(changingView); } mNewEvents.add(event); } @@ -893,4 +967,12 @@ public class StackStateAnimator { return getChildTag(view, TAG_END_HEIGHT); } } + + public void setHeadsUpAppearHeightBottom(int headsUpAppearHeightBottom) { + mHeadsUpAppearHeightBottom = headsUpAppearHeightBottom; + } + + public void setShadeExpanded(boolean shadeExpanded) { + mShadeExpanded = shadeExpanded; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java index d1e1b71..dce695d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java @@ -20,8 +20,6 @@ import android.os.IBinder; import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; import android.view.View; -import android.view.ViewGroup.LayoutParams; -import android.view.WindowManager; import com.android.internal.statusbar.StatusBarIcon; import com.android.systemui.statusbar.ActivatableNotificationView; @@ -106,12 +104,6 @@ public class TvStatusBar extends BaseStatusBar { } @Override - protected WindowManager.LayoutParams getSearchLayoutParams( - LayoutParams layoutParams) { - return null; - } - - @Override protected void setAreThereNotifications() { } @@ -120,7 +112,7 @@ public class TvStatusBar extends BaseStatusBar { } @Override - protected boolean shouldDisableNavbarGestures() { + public boolean shouldDisableNavbarGestures() { return true; } @@ -129,19 +121,7 @@ public class TvStatusBar extends BaseStatusBar { } @Override - public void scheduleHeadsUpDecay(long delay) { - } - - @Override - public void scheduleHeadsUpOpen() { - } - - @Override - public void scheduleHeadsUpEscalation() { - } - - @Override - public void scheduleHeadsUpClose() { + public void escalateHeadsUp() { } @Override @@ -184,4 +164,17 @@ public class TvStatusBar extends BaseStatusBar { @Override public void appTransitionStarting(long startTime, long duration) { } + + @Override + protected void updateHeadsUp(String key, NotificationData.Entry entry, boolean shouldInterrupt, + boolean alertAgain) { + } + + @Override + protected void setHeadsUpUser(int newUserId) { + } + + protected boolean isSnoozedPackage(StatusBarNotification sbn) { + return false; + } } diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java index 5771d22..4a441c7 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java +++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Google Inc. + * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,424 +17,316 @@ package com.android.systemui.usb; import android.app.Notification; +import android.app.Notification.Action; import android.app.NotificationManager; import android.app.PendingIntent; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; -import android.os.Environment; -import android.os.Handler; -import android.os.HandlerThread; +import android.content.IntentFilter; import android.os.UserHandle; +import android.os.storage.DiskInfo; import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; -import android.os.storage.StorageVolume; -import android.provider.Settings; +import android.os.storage.VolumeInfo; import android.util.Log; +import com.android.internal.R; import com.android.systemui.SystemUI; +import java.util.List; + public class StorageNotification extends SystemUI { private static final String TAG = "StorageNotification"; - private static final boolean DEBUG = false; - - private static final boolean POP_UMS_ACTIVITY_ON_CONNECT = true; - - /** - * The notification that is shown when a USB mass storage host - * is connected. - * <p> - * This is lazily created, so use {@link #setUsbStorageNotification()}. - */ - private Notification mUsbStorageNotification; - - /** - * The notification that is shown when the following media events occur: - * - Media is being checked - * - Media is blank (or unknown filesystem) - * - Media is corrupt - * - Media is safe to unmount - * - Media is missing - * <p> - * This is lazily created, so use {@link #setMediaStorageNotification()}. - */ - private Notification mMediaStorageNotification; - private boolean mUmsAvailable; + + private static final int NOTIF_ID = 0x53544f52; // STOR + + private static final String ACTION_SNOOZE_VOLUME = "com.android.systemui.action.SNOOZE_VOLUME"; + + // TODO: delay some notifications to avoid bumpy fast operations + // TODO: annoy user when private media is missing + + private NotificationManager mNotificationManager; private StorageManager mStorageManager; - private Handler mAsyncEventHandler; + private final StorageEventListener mListener = new StorageEventListener() { + @Override + public void onVolumeStateChanged(VolumeInfo vol, int oldState, int newState) { + onVolumeStateChangedInternal(vol, oldState, newState); + } - private class StorageNotificationEventListener extends StorageEventListener { - public void onUsbMassStorageConnectionChanged(final boolean connected) { - mAsyncEventHandler.post(new Runnable() { - @Override - public void run() { - onUsbMassStorageConnectionChangedAsync(connected); - } - }); + @Override + public void onVolumeMetadataChanged(VolumeInfo vol) { + // Avoid kicking notifications when getting early metadata before + // mounted. If already mounted, we're being kicked because of a + // nickname or init'ed change. + if (vol.getState() == VolumeInfo.STATE_MOUNTED) { + onVolumeStateChangedInternal(vol, vol.getState(), vol.getState()); + } } - public void onStorageStateChanged(final String path, - final String oldState, final String newState) { - mAsyncEventHandler.post(new Runnable() { - @Override - public void run() { - onStorageStateChangedAsync(path, oldState, newState); - } - }); + }; + + private final BroadcastReceiver mSnoozeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // TODO: kick this onto background thread + final String volId = intent.getStringExtra(VolumeInfo.EXTRA_VOLUME_ID); + mStorageManager.setVolumeSnoozed(volId, true); } - } + }; @Override public void start() { - mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); - final boolean connected = mStorageManager.isUsbMassStorageConnected(); - if (DEBUG) Log.d(TAG, String.format( "Startup with UMS connection %s (media state %s)", - mUmsAvailable, Environment.getExternalStorageState())); - - HandlerThread thr = new HandlerThread("SystemUI StorageNotification"); - thr.start(); - mAsyncEventHandler = new Handler(thr.getLooper()); - - StorageNotificationEventListener listener = new StorageNotificationEventListener(); - listener.onUsbMassStorageConnectionChanged(connected); - mStorageManager.registerListener(listener); - } + mNotificationManager = mContext.getSystemService(NotificationManager.class); + + mStorageManager = mContext.getSystemService(StorageManager.class); + mStorageManager.registerListener(mListener); + + mContext.registerReceiver(mSnoozeReceiver, new IntentFilter(ACTION_SNOOZE_VOLUME), + android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, null); - private void onUsbMassStorageConnectionChangedAsync(boolean connected) { - mUmsAvailable = connected; - /* - * Even though we may have a UMS host connected, we the SD card - * may not be in a state for export. - */ - String st = Environment.getExternalStorageState(); - - if (DEBUG) Log.i(TAG, String.format("UMS connection changed to %s (media state %s)", - connected, st)); - - if (connected && (st.equals( - Environment.MEDIA_REMOVED) || st.equals(Environment.MEDIA_CHECKING))) { - /* - * No card or card being checked = don't display - */ - connected = false; + // Kick current state into place + final List<VolumeInfo> vols = mStorageManager.getVolumes(); + for (VolumeInfo vol : vols) { + onVolumeStateChangedInternal(vol, vol.getState(), vol.getState()); } - updateUsbMassStorageNotification(connected); } - private void onStorageStateChangedAsync(String path, String oldState, String newState) { - if (DEBUG) Log.i(TAG, String.format( - "Media {%s} state changed from {%s} -> {%s}", path, oldState, newState)); - if (newState.equals(Environment.MEDIA_SHARED)) { - /* - * Storage is now shared. Modify the UMS notification - * for stopping UMS. - */ - Intent intent = new Intent(); - intent.setClass(mContext, com.android.systemui.usb.UsbStorageActivity.class); - PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); - setUsbStorageNotification( - com.android.internal.R.string.usb_storage_stop_notification_title, - com.android.internal.R.string.usb_storage_stop_notification_message, - com.android.internal.R.drawable.stat_sys_warning, false, true, pi); - } else if (newState.equals(Environment.MEDIA_CHECKING)) { - /* - * Storage is now checking. Update media notification and disable - * UMS notification. - */ - setMediaStorageNotification( - com.android.internal.R.string.ext_media_checking_notification_title, - com.android.internal.R.string.ext_media_checking_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard_prepare, true, false, null); - updateUsbMassStorageNotification(false); - } else if (newState.equals(Environment.MEDIA_MOUNTED)) { - /* - * Storage is now mounted. Dismiss any media notifications, - * and enable UMS notification if connected. - */ - setMediaStorageNotification(0, 0, 0, false, false, null); - updateUsbMassStorageNotification(mUmsAvailable); - } else if (newState.equals(Environment.MEDIA_UNMOUNTED)) { - /* - * Storage is now unmounted. We may have been unmounted - * because the user is enabling/disabling UMS, in which case we don't - * want to display the 'safe to unmount' notification. - */ - if (!mStorageManager.isUsbMassStorageEnabled()) { - if (oldState.equals(Environment.MEDIA_SHARED)) { - /* - * The unmount was due to UMS being enabled. Dismiss any - * media notifications, and enable UMS notification if connected - */ - setMediaStorageNotification(0, 0, 0, false, false, null); - updateUsbMassStorageNotification(mUmsAvailable); - } else { - /* - * Show safe to unmount media notification, and enable UMS - * notification if connected. - */ - if (Environment.isExternalStorageRemovable()) { - setMediaStorageNotification( - com.android.internal.R.string.ext_media_safe_unmount_notification_title, - com.android.internal.R.string.ext_media_safe_unmount_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard, true, true, null); - } else { - // This device does not have removable storage, so - // don't tell the user they can remove it. - setMediaStorageNotification(0, 0, 0, false, false, null); - } - updateUsbMassStorageNotification(mUmsAvailable); - } - } else { - /* - * The unmount was due to UMS being enabled. Dismiss any - * media notifications, and disable the UMS notification - */ - setMediaStorageNotification(0, 0, 0, false, false, null); - updateUsbMassStorageNotification(false); - } - } else if (newState.equals(Environment.MEDIA_NOFS)) { - /* - * Storage has no filesystem. Show blank media notification, - * and enable UMS notification if connected. - */ - Intent intent = new Intent(); - intent.setClass(mContext, com.android.internal.app.ExternalMediaFormatActivity.class); - intent.putExtra(StorageVolume.EXTRA_STORAGE_VOLUME, - getVolumeByPath(mStorageManager.getVolumeList(), path)); - PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); - - setMediaStorageNotification( - com.android.internal.R.string.ext_media_nofs_notification_title, - com.android.internal.R.string.ext_media_nofs_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard_usb, true, false, pi); - updateUsbMassStorageNotification(mUmsAvailable); - } else if (newState.equals(Environment.MEDIA_UNMOUNTABLE)) { - /* - * Storage is corrupt. Show corrupt media notification, - * and enable UMS notification if connected. - */ - Intent intent = new Intent(); - intent.setClass(mContext, com.android.internal.app.ExternalMediaFormatActivity.class); - intent.putExtra(StorageVolume.EXTRA_STORAGE_VOLUME, - getVolumeByPath(mStorageManager.getVolumeList(), path)); - PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); - - setMediaStorageNotification( - com.android.internal.R.string.ext_media_unmountable_notification_title, - com.android.internal.R.string.ext_media_unmountable_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard_usb, true, false, pi); - updateUsbMassStorageNotification(mUmsAvailable); - } else if (newState.equals(Environment.MEDIA_REMOVED)) { - /* - * Storage has been removed. Show nomedia media notification, - * and disable UMS notification regardless of connection state. - */ - setMediaStorageNotification( - com.android.internal.R.string.ext_media_nomedia_notification_title, - com.android.internal.R.string.ext_media_nomedia_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard_usb, - true, false, null); - updateUsbMassStorageNotification(false); - } else if (newState.equals(Environment.MEDIA_BAD_REMOVAL)) { - /* - * Storage has been removed unsafely. Show bad removal media notification, - * and disable UMS notification regardless of connection state. - */ - setMediaStorageNotification( - com.android.internal.R.string.ext_media_badremoval_notification_title, - com.android.internal.R.string.ext_media_badremoval_notification_message, - com.android.internal.R.drawable.stat_sys_warning, - true, true, null); - updateUsbMassStorageNotification(false); - } else { - Log.w(TAG, String.format("Ignoring unknown state {%s}", newState)); + public void onVolumeStateChangedInternal(VolumeInfo vol, int oldState, int newState) { + // We only care about public volumes + if (vol.getType() != VolumeInfo.TYPE_PUBLIC) { + return; } - } - /** - * Get the corresponding StorageVolume object for a specific path. - */ - private final StorageVolume getVolumeByPath(StorageVolume[] volumes, String path) { - for (StorageVolume volume : volumes) { - if (volume.getPath().equals(path)) { - return volume; - } + Log.d(TAG, vol.toString()); + + // New state means we tear down any old notifications + mNotificationManager.cancelAsUser(vol.getId(), NOTIF_ID, UserHandle.ALL); + + switch (newState) { + case VolumeInfo.STATE_UNMOUNTED: + onVolumeUnmounted(vol); + break; + case VolumeInfo.STATE_CHECKING: + onVolumeChecking(vol); + break; + case VolumeInfo.STATE_MOUNTED: + onVolumeMounted(vol); + break; + case VolumeInfo.STATE_FORMATTING: + onVolumeFormatting(vol); + break; + case VolumeInfo.STATE_EJECTING: + onVolumeEjecting(vol); + break; + case VolumeInfo.STATE_UNMOUNTABLE: + onVolumeUnmountable(vol); + break; + case VolumeInfo.STATE_REMOVED: + onVolumeRemoved(vol); + break; + case VolumeInfo.STATE_BAD_REMOVAL: + onVolumeBadRemoval(vol); + break; } - Log.w(TAG, "No storage found"); - return null; } - /** - * Update the state of the USB mass storage notification - */ - void updateUsbMassStorageNotification(boolean available) { - - if (available) { - Intent intent = new Intent(); - intent.setClass(mContext, com.android.systemui.usb.UsbStorageActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - - PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); - setUsbStorageNotification( - com.android.internal.R.string.usb_storage_notification_title, - com.android.internal.R.string.usb_storage_notification_message, - com.android.internal.R.drawable.stat_sys_data_usb, - false, true, pi); - } else { - setUsbStorageNotification(0, 0, 0, false, false, null); - } + private void onVolumeUnmounted(VolumeInfo vol) { + // Ignored } - /** - * Sets the USB storage notification. - */ - private synchronized void setUsbStorageNotification(int titleId, int messageId, int icon, - boolean sound, boolean visible, PendingIntent pi) { + private void onVolumeChecking(VolumeInfo vol) { + final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId()); + final CharSequence title = mContext.getString( + R.string.ext_media_checking_notification_title, disk.getDescription()); + final CharSequence text = mContext.getString( + R.string.ext_media_checking_notification_message, disk.getDescription()); + + final Notification notif = buildNotificationBuilder(title, text) + .setSmallIcon(R.drawable.stat_notify_sdcard_prepare) + .setCategory(Notification.CATEGORY_PROGRESS) + .setPriority(Notification.PRIORITY_LOW) + .setOngoing(true) + .build(); + + mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL); + } - if (!visible && mUsbStorageNotification == null) { - return; + private void onVolumeMounted(VolumeInfo vol) { + // Don't annoy when user dismissed in past + if (vol.isSnoozed()) return; + + final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId()); + final Notification notif; + if (disk.isAdoptable() && !vol.isInited()) { + final CharSequence title = disk.getDescription(); + final CharSequence text = mContext.getString( + R.string.ext_media_new_notification_message, disk.getDescription()); + + notif = buildNotificationBuilder(title, text) + .setSmallIcon(R.drawable.stat_notify_sdcard) + .addAction(new Action(0, mContext.getString(R.string.ext_media_init_action), + buildInitPendingIntent(vol))) + .addAction(new Action(0, mContext.getString(R.string.ext_media_unmount_action), + buildUnmountPendingIntent(vol))) + .setDeleteIntent(buildSnoozeIntent(vol)) + .setCategory(Notification.CATEGORY_SYSTEM) + .build(); + + } else { + final CharSequence title = disk.getDescription(); + final CharSequence text = mContext.getString( + R.string.ext_media_ready_notification_message, disk.getDescription()); + + notif = buildNotificationBuilder(title, text) + .setSmallIcon(R.drawable.stat_notify_sdcard) + .addAction(new Action(0, mContext.getString(R.string.ext_media_browse_action), + buildBrowsePendingIntent(vol))) + .addAction(new Action(0, mContext.getString(R.string.ext_media_unmount_action), + buildUnmountPendingIntent(vol))) + .setDeleteIntent(buildSnoozeIntent(vol)) + .setCategory(Notification.CATEGORY_SYSTEM) + .setPriority(Notification.PRIORITY_LOW) + .build(); } - NotificationManager notificationManager = (NotificationManager) mContext - .getSystemService(Context.NOTIFICATION_SERVICE); + mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL); + } - if (notificationManager == null) { - return; - } + private void onVolumeFormatting(VolumeInfo vol) { + // Ignored + } - if (visible) { - Resources r = Resources.getSystem(); - CharSequence title = r.getText(titleId); - CharSequence message = r.getText(messageId); + private void onVolumeEjecting(VolumeInfo vol) { + final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId()); + final CharSequence title = mContext.getString( + R.string.ext_media_unmounting_notification_title, disk.getDescription()); + final CharSequence text = mContext.getString( + R.string.ext_media_unmounting_notification_message, disk.getDescription()); + + final Notification notif = buildNotificationBuilder(title, text) + .setSmallIcon(R.drawable.stat_notify_sdcard_prepare) + .setCategory(Notification.CATEGORY_PROGRESS) + .setPriority(Notification.PRIORITY_LOW) + .setOngoing(true) + .build(); + + mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL); + } - if (mUsbStorageNotification == null) { - mUsbStorageNotification = new Notification(); - mUsbStorageNotification.icon = icon; - mUsbStorageNotification.when = 0; - } + private void onVolumeUnmountable(VolumeInfo vol) { + final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId()); + final CharSequence title = mContext.getString( + R.string.ext_media_unmountable_notification_title, disk.getDescription()); + final CharSequence text = mContext.getString( + R.string.ext_media_unmountable_notification_message, disk.getDescription()); - if (sound) { - mUsbStorageNotification.defaults |= Notification.DEFAULT_SOUND; - } else { - mUsbStorageNotification.defaults &= ~Notification.DEFAULT_SOUND; - } + final Notification notif = buildNotificationBuilder(title, text) + .setSmallIcon(R.drawable.stat_notify_sdcard) + .setContentIntent(buildDetailsPendingIntent(vol)) + .setCategory(Notification.CATEGORY_ERROR) + .build(); - mUsbStorageNotification.flags = Notification.FLAG_ONGOING_EVENT; + mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL); + } - mUsbStorageNotification.tickerText = title; - if (pi == null) { - Intent intent = new Intent(); - pi = PendingIntent.getBroadcastAsUser(mContext, 0, intent, 0, - UserHandle.CURRENT); - } - mUsbStorageNotification.color = mContext.getColor( - com.android.internal.R.color.system_notification_accent_color); - mUsbStorageNotification.setLatestEventInfo(mContext, title, message, pi); - mUsbStorageNotification.visibility = Notification.VISIBILITY_PUBLIC; - mUsbStorageNotification.category = Notification.CATEGORY_SYSTEM; - - final boolean adbOn = 1 == Settings.Global.getInt( - mContext.getContentResolver(), - Settings.Global.ADB_ENABLED, - 0); - - if (POP_UMS_ACTIVITY_ON_CONNECT && !adbOn) { - // Pop up a full-screen alert to coach the user through enabling UMS. The average - // user has attached the device to USB either to charge the phone (in which case - // this is harmless) or transfer files, and in the latter case this alert saves - // several steps (as well as subtly indicates that you shouldn't mix UMS with other - // activities on the device). - // - // If ADB is enabled, however, we suppress this dialog (under the assumption that a - // developer (a) knows how to enable UMS, and (b) is probably using USB to install - // builds or use adb commands. - mUsbStorageNotification.fullScreenIntent = pi; - } + private void onVolumeRemoved(VolumeInfo vol) { + if (!vol.isPrimary()) { + // Ignore non-primary media + return; } - final int notificationId = mUsbStorageNotification.icon; - if (visible) { - notificationManager.notifyAsUser(null, notificationId, mUsbStorageNotification, - UserHandle.ALL); - } else { - notificationManager.cancelAsUser(null, notificationId, UserHandle.ALL); - } - } + final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId()); + final CharSequence title = mContext.getString( + R.string.ext_media_nomedia_notification_title, disk.getDescription()); + final CharSequence text = mContext.getString( + R.string.ext_media_nomedia_notification_message, disk.getDescription()); - private synchronized boolean getMediaStorageNotificationDismissable() { - if ((mMediaStorageNotification != null) && - ((mMediaStorageNotification.flags & Notification.FLAG_AUTO_CANCEL) == - Notification.FLAG_AUTO_CANCEL)) - return true; + final Notification notif = buildNotificationBuilder(title, text) + .setSmallIcon(R.drawable.stat_notify_sdcard) + .setCategory(Notification.CATEGORY_ERROR) + .build(); - return false; + mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL); } - /** - * Sets the media storage notification. - */ - private synchronized void setMediaStorageNotification(int titleId, int messageId, int icon, boolean visible, - boolean dismissable, PendingIntent pi) { - - if (!visible && mMediaStorageNotification == null) { + private void onVolumeBadRemoval(VolumeInfo vol) { + if (!vol.isPrimary()) { + // Ignore non-primary media return; } - NotificationManager notificationManager = (NotificationManager) mContext - .getSystemService(Context.NOTIFICATION_SERVICE); + final DiskInfo disk = mStorageManager.findDiskById(vol.getDiskId()); + final CharSequence title = mContext.getString( + R.string.ext_media_badremoval_notification_title, disk.getDescription()); + final CharSequence text = mContext.getString( + R.string.ext_media_badremoval_notification_message, disk.getDescription()); - if (notificationManager == null) { - return; - } + final Notification notif = buildNotificationBuilder(title, text) + .setSmallIcon(R.drawable.stat_notify_sdcard) + .setCategory(Notification.CATEGORY_ERROR) + .build(); - if (mMediaStorageNotification != null && visible) { - /* - * Dismiss the previous notification - we're about to - * re-use it. - */ - final int notificationId = mMediaStorageNotification.icon; - notificationManager.cancel(notificationId); - } + mNotificationManager.notifyAsUser(vol.getId(), NOTIF_ID, notif, UserHandle.ALL); + } + + private Notification.Builder buildNotificationBuilder(CharSequence title, CharSequence text) { + return new Notification.Builder(mContext) + .setColor(mContext.getColor(R.color.system_notification_accent_color)) + .setContentTitle(title) + .setContentText(text) + .setStyle(new Notification.BigTextStyle().bigText(text)) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setLocalOnly(true); + } - if (visible) { - Resources r = Resources.getSystem(); - CharSequence title = r.getText(titleId); - CharSequence message = r.getText(messageId); + private PendingIntent buildInitPendingIntent(VolumeInfo vol) { + final Intent intent = new Intent(); + intent.setClassName("com.android.settings", + "com.android.settings.deviceinfo.StorageWizardInit"); + intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId()); - if (mMediaStorageNotification == null) { - mMediaStorageNotification = new Notification(); - mMediaStorageNotification.when = 0; - } + final int requestKey = vol.getId().hashCode(); + return PendingIntent.getActivityAsUser(mContext, requestKey, intent, + PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT); + } - mMediaStorageNotification.defaults &= ~Notification.DEFAULT_SOUND; + private PendingIntent buildUnmountPendingIntent(VolumeInfo vol) { + final Intent intent = new Intent(); + intent.setClassName("com.android.settings", + "com.android.settings.deviceinfo.StorageUnmountReceiver"); + intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId()); - if (dismissable) { - mMediaStorageNotification.flags = Notification.FLAG_AUTO_CANCEL; - } else { - mMediaStorageNotification.flags = Notification.FLAG_ONGOING_EVENT; - } + final int requestKey = vol.getId().hashCode(); + return PendingIntent.getBroadcastAsUser(mContext, requestKey, intent, + PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.CURRENT); + } - mMediaStorageNotification.tickerText = title; - if (pi == null) { - Intent intent = new Intent(); - pi = PendingIntent.getBroadcastAsUser(mContext, 0, intent, 0, - UserHandle.CURRENT); - } + private PendingIntent buildBrowsePendingIntent(VolumeInfo vol) { + final Intent intent = vol.buildBrowseIntent(); - mMediaStorageNotification.icon = icon; - mMediaStorageNotification.color = mContext.getColor( - com.android.internal.R.color.system_notification_accent_color); - mMediaStorageNotification.setLatestEventInfo(mContext, title, message, pi); - mMediaStorageNotification.visibility = Notification.VISIBILITY_PUBLIC; - mMediaStorageNotification.category = Notification.CATEGORY_SYSTEM; - } + final int requestKey = vol.getId().hashCode(); + return PendingIntent.getActivityAsUser(mContext, requestKey, intent, + PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT); + } - final int notificationId = mMediaStorageNotification.icon; - if (visible) { - notificationManager.notifyAsUser(null, notificationId, - mMediaStorageNotification, UserHandle.ALL); - } else { - notificationManager.cancelAsUser(null, notificationId, UserHandle.ALL); - } + private PendingIntent buildDetailsPendingIntent(VolumeInfo vol) { + final Intent intent = new Intent(); + intent.setClassName("com.android.settings", + "com.android.settings.Settings$StorageVolumeSettingsActivity"); + intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId()); + + final int requestKey = vol.getId().hashCode(); + return PendingIntent.getActivityAsUser(mContext, requestKey, intent, + PendingIntent.FLAG_CANCEL_CURRENT, null, UserHandle.CURRENT); + } + + private PendingIntent buildSnoozeIntent(VolumeInfo vol) { + final Intent intent = new Intent(ACTION_SNOOZE_VOLUME); + intent.putExtra(VolumeInfo.EXTRA_VOLUME_ID, vol.getId()); + + final int requestKey = vol.getId().hashCode(); + return PendingIntent.getBroadcastAsUser(mContext, requestKey, intent, + PendingIntent.FLAG_CANCEL_CURRENT, UserHandle.CURRENT); } } diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java index 9928f7f..23a65e8 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java @@ -93,7 +93,8 @@ public class UsbResolverActivity extends ResolverActivity { } @Override - protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) { + protected void onTargetSelected(TargetInfo target, boolean alwaysCheck) { + final ResolveInfo ri = target.getResolveInfo(); try { IBinder b = ServiceManager.getService(USB_SERVICE); IUsbManager service = IUsbManager.Stub.asInterface(b); @@ -121,7 +122,7 @@ public class UsbResolverActivity extends ResolverActivity { } try { - startActivityAsUser(intent, new UserHandle(userId)); + target.startAsUser(this, null, new UserHandle(userId)); } catch (ActivityNotFoundException e) { Log.e(TAG, "startActivity failed", e); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPanel.java b/packages/SystemUI/src/com/android/systemui/volume/D.java index 272c321..db7c853 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/D.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 The Android Open Source Project + * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,8 +14,10 @@ * limitations under the License. */ -package com.android.systemui.statusbar; +package com.android.systemui.volume; -public interface StatusBarPanel { - public boolean isInContentArea(int x, int y); +import android.util.Log; + +class D { + public static boolean BUG = Log.isLoggable("volume", Log.DEBUG); } diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java new file mode 100644 index 0000000..12dca94 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.media.AudioManager; +import android.media.AudioSystem; +import android.provider.Settings.Global; +import android.util.Log; + +import com.android.systemui.volume.VolumeDialogController.State; + +import java.util.Arrays; + +/** + * Interesting events related to the volume. + */ +public class Events { + private static final String TAG = Util.logTag(Events.class); + + public static final int EVENT_SHOW_DIALOG = 0; // (reason|int) (keyguard|bool) + public static final int EVENT_DISMISS_DIALOG = 1; // (reason|int) + public static final int EVENT_ACTIVE_STREAM_CHANGED = 2; // (stream|int) + public static final int EVENT_EXPAND = 3; // (expand|bool) + public static final int EVENT_KEY = 4; + public static final int EVENT_COLLECTION_STARTED = 5; + public static final int EVENT_COLLECTION_STOPPED = 6; + public static final int EVENT_ICON_CLICK = 7; // (stream|int) (icon_state|int) + public static final int EVENT_SETTINGS_CLICK = 8; + public static final int EVENT_TOUCH_LEVEL_CHANGED = 9; // (stream|int) (level|int) + public static final int EVENT_LEVEL_CHANGED = 10; // (stream|int) (level|int) + public static final int EVENT_INTERNAL_RINGER_MODE_CHANGED = 11; // (mode|int) + public static final int EVENT_EXTERNAL_RINGER_MODE_CHANGED = 12; // (mode|int) + public static final int EVENT_ZEN_MODE_CHANGED = 13; // (mode|int) + public static final int EVENT_SUPPRESSOR_CHANGED = 14; // (component|string) (name|string) + public static final int EVENT_MUTE_CHANGED = 15; // (stream|int) (muted|bool) + + private static final String[] EVENT_TAGS = { + "show_dialog", + "dismiss_dialog", + "active_stream_changed", + "expand", + "key", + "collection_started", + "collection_stopped", + "icon_click", + "settings_click", + "touch_level_changed", + "level_changed", + "internal_ringer_mode_changed", + "external_ringer_mode_changed", + "zen_mode_changed", + "suppressor_changed", + "mute_changed", + }; + + public static final int DISMISS_REASON_UNKNOWN = 0; + public static final int DISMISS_REASON_TOUCH_OUTSIDE = 1; + public static final int DISMISS_REASON_VOLUME_CONTROLLER = 2; + public static final int DISMISS_REASON_TIMEOUT = 3; + public static final int DISMISS_REASON_SCREEN_OFF = 4; + public static final int DISMISS_REASON_SETTINGS_CLICKED = 5; + public static final int DISMISS_REASON_DONE_CLICKED = 6; + public static final String[] DISMISS_REASONS = { + "unknown", + "touch_outside", + "volume_controller", + "timeout", + "screen_off", + "settings_clicked", + "done_clicked", + }; + + public static final int SHOW_REASON_UNKNOWN = 0; + public static final int SHOW_REASON_VOLUME_CHANGED = 1; + public static final int SHOW_REASON_REMOTE_VOLUME_CHANGED = 2; + public static final String[] SHOW_REASONS = { + "unknown", + "volume_changed", + "remote_volume_changed" + }; + + public static final int ICON_STATE_UNKNOWN = 0; + public static final int ICON_STATE_UNMUTE = 1; + public static final int ICON_STATE_MUTE = 2; + public static final int ICON_STATE_VIBRATE = 3; + + public static Callback sCallback; + + public static void writeEvent(int tag, Object... list) { + final long time = System.currentTimeMillis(); + final StringBuilder sb = new StringBuilder("writeEvent ").append(EVENT_TAGS[tag]); + if (list != null && list.length > 0) { + sb.append(" "); + switch (tag) { + case EVENT_SHOW_DIALOG: + sb.append(SHOW_REASONS[(Integer) list[0]]).append(" keyguard=").append(list[1]); + break; + case EVENT_EXPAND: + sb.append(list[0]); + break; + case EVENT_DISMISS_DIALOG: + sb.append(DISMISS_REASONS[(Integer) list[0]]); + break; + case EVENT_ACTIVE_STREAM_CHANGED: + sb.append(AudioSystem.streamToString((Integer) list[0])); + break; + case EVENT_ICON_CLICK: + sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ') + .append(iconStateToString((Integer) list[1])); + break; + case EVENT_TOUCH_LEVEL_CHANGED: + case EVENT_LEVEL_CHANGED: + case EVENT_MUTE_CHANGED: + sb.append(AudioSystem.streamToString((Integer) list[0])).append(' ') + .append(list[1]); + break; + case EVENT_INTERNAL_RINGER_MODE_CHANGED: + case EVENT_EXTERNAL_RINGER_MODE_CHANGED: + sb.append(ringerModeToString((Integer) list[0])); + break; + case EVENT_ZEN_MODE_CHANGED: + sb.append(zenModeToString((Integer) list[0])); + break; + case EVENT_SUPPRESSOR_CHANGED: + sb.append(list[0]).append(' ').append(list[1]); + break; + default: + sb.append(Arrays.asList(list)); + break; + } + } + Log.i(TAG, sb.toString()); + if (sCallback != null) { + sCallback.writeEvent(time, tag, list); + } + } + + public static void writeState(long time, State state) { + if (sCallback != null) { + sCallback.writeState(time, state); + } + } + + private static String iconStateToString(int iconState) { + switch (iconState) { + case ICON_STATE_UNMUTE: return "unmute"; + case ICON_STATE_MUTE: return "mute"; + case ICON_STATE_VIBRATE: return "vibrate"; + default: return "unknown_state_" + iconState; + } + } + + private static String ringerModeToString(int ringerMode) { + switch (ringerMode) { + case AudioManager.RINGER_MODE_SILENT: return "silent"; + case AudioManager.RINGER_MODE_VIBRATE: return "vibrate"; + case AudioManager.RINGER_MODE_NORMAL: return "normal"; + default: return "unknown"; + } + } + + private static String zenModeToString(int zenMode) { + switch (zenMode) { + case Global.ZEN_MODE_OFF: return "off"; + case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: return "important_interruptions"; + case Global.ZEN_MODE_ALARMS: return "alarms"; + case Global.ZEN_MODE_NO_INTERRUPTIONS: return "no_interruptions"; + default: return "unknown"; + } + } + + public interface Callback { + void writeEvent(long time, int tag, Object[] list); + void writeState(long time, State state); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/MediaSessions.java b/packages/SystemUI/src/com/android/systemui/volume/MediaSessions.java new file mode 100644 index 0000000..712ea27 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/MediaSessions.java @@ -0,0 +1,378 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; +import android.media.IRemoteVolumeController; +import android.media.MediaMetadata; +import android.media.session.ISessionController; +import android.media.session.MediaController; +import android.media.session.MediaController.PlaybackInfo; +import android.media.session.MediaSession.QueueItem; +import android.media.session.MediaSession.Token; +import android.media.session.MediaSessionManager; +import android.media.session.MediaSessionManager.OnActiveSessionsChangedListener; +import android.media.session.PlaybackState; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.os.RemoteException; +import android.util.Log; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** + * Convenience client for all media session updates. Provides a callback interface for events + * related to remote media sessions. + */ +public class MediaSessions { + private static final String TAG = Util.logTag(MediaSessions.class); + + private static final boolean USE_SERVICE_LABEL = false; + + private final Context mContext; + private final H mHandler; + private final MediaSessionManager mMgr; + private final Map<Token, MediaControllerRecord> mRecords = new HashMap<>(); + private final Callbacks mCallbacks; + + private boolean mInit; + + public MediaSessions(Context context, Looper looper, Callbacks callbacks) { + mContext = context; + mHandler = new H(looper); + mMgr = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE); + mCallbacks = callbacks; + } + + public void dump(PrintWriter writer) { + writer.println(getClass().getSimpleName() + " state:"); + writer.print(" mInit: "); writer.println(mInit); + writer.print(" mRecords.size: "); writer.println(mRecords.size()); + int i = 0; + for (MediaControllerRecord r : mRecords.values()) { + dump(++i, writer, r.controller); + } + } + + public void init() { + if (D.BUG) Log.d(TAG, "init"); + // will throw if no permission + mMgr.addOnActiveSessionsChangedListener(mSessionsListener, null, mHandler); + mInit = true; + postUpdateSessions(); + mMgr.setRemoteVolumeController(mRvc); + } + + protected void postUpdateSessions() { + if (!mInit) return; + mHandler.sendEmptyMessage(H.UPDATE_SESSIONS); + } + + public void destroy() { + if (D.BUG) Log.d(TAG, "destroy"); + mInit = false; + mMgr.removeOnActiveSessionsChangedListener(mSessionsListener); + } + + public void setVolume(Token token, int level) { + final MediaControllerRecord r = mRecords.get(token); + if (r == null) { + Log.w(TAG, "setVolume: No record found for token " + token); + return; + } + if (D.BUG) Log.d(TAG, "Setting level to " + level); + r.controller.setVolumeTo(level, 0); + } + + private void onRemoteVolumeChangedH(ISessionController session, int flags) { + final MediaController controller = new MediaController(mContext, session); + if (D.BUG) Log.d(TAG, "remoteVolumeChangedH " + controller.getPackageName() + " " + + Util.audioManagerFlagsToString(flags)); + final Token token = controller.getSessionToken(); + mCallbacks.onRemoteVolumeChanged(token, flags); + } + + private void onUpdateRemoteControllerH(ISessionController session) { + final MediaController controller = session != null ? new MediaController(mContext, session) + : null; + final String pkg = controller != null ? controller.getPackageName() : null; + if (D.BUG) Log.d(TAG, "updateRemoteControllerH " + pkg); + // this may be our only indication that a remote session is changed, refresh + postUpdateSessions(); + } + + protected void onActiveSessionsUpdatedH(List<MediaController> controllers) { + if (D.BUG) Log.d(TAG, "onActiveSessionsUpdatedH n=" + controllers.size()); + final Set<Token> toRemove = new HashSet<Token>(mRecords.keySet()); + for (MediaController controller : controllers) { + final Token token = controller.getSessionToken(); + final PlaybackInfo pi = controller.getPlaybackInfo(); + toRemove.remove(token); + if (!mRecords.containsKey(token)) { + final MediaControllerRecord r = new MediaControllerRecord(controller); + r.name = getControllerName(controller); + mRecords.put(token, r); + controller.registerCallback(r, mHandler); + } + final MediaControllerRecord r = mRecords.get(token); + final boolean remote = isRemote(pi); + if (remote) { + updateRemoteH(token, r.name, pi); + r.sentRemote = true; + } + } + for (Token t : toRemove) { + final MediaControllerRecord r = mRecords.get(t); + r.controller.unregisterCallback(r); + mRecords.remove(t); + if (D.BUG) Log.d(TAG, "Removing " + r.name + " sentRemote=" + r.sentRemote); + if (r.sentRemote) { + mCallbacks.onRemoteRemoved(t); + r.sentRemote = false; + } + } + } + + private static boolean isRemote(PlaybackInfo pi) { + return pi != null && pi.getPlaybackType() == PlaybackInfo.PLAYBACK_TYPE_REMOTE; + } + + protected String getControllerName(MediaController controller) { + final PackageManager pm = mContext.getPackageManager(); + final String pkg = controller.getPackageName(); + try { + if (USE_SERVICE_LABEL) { + final List<ResolveInfo> ris = pm.queryIntentServices( + new Intent("android.media.MediaRouteProviderService").setPackage(pkg), 0); + if (ris != null) { + for (ResolveInfo ri : ris) { + if (ri.serviceInfo == null) continue; + if (pkg.equals(ri.serviceInfo.packageName)) { + final String serviceLabel = + Objects.toString(ri.serviceInfo.loadLabel(pm), "").trim(); + if (serviceLabel.length() > 0) { + return serviceLabel; + } + } + } + } + } + final ApplicationInfo ai = pm.getApplicationInfo(pkg, 0); + final String appLabel = Objects.toString(ai.loadLabel(pm), "").trim(); + if (appLabel.length() > 0) { + return appLabel; + } + } catch (NameNotFoundException e) { } + return pkg; + } + + private void updateRemoteH(Token token, String name, PlaybackInfo pi) { + if (mCallbacks != null) { + mCallbacks.onRemoteUpdate(token, name, pi); + } + } + + private static void dump(int n, PrintWriter writer, MediaController c) { + writer.println(" Controller " + n + ": " + c.getPackageName()); + final Bundle extras = c.getExtras(); + final long flags = c.getFlags(); + final MediaMetadata mm = c.getMetadata(); + final PlaybackInfo pi = c.getPlaybackInfo(); + final PlaybackState playbackState = c.getPlaybackState(); + final List<QueueItem> queue = c.getQueue(); + final CharSequence queueTitle = c.getQueueTitle(); + final int ratingType = c.getRatingType(); + final PendingIntent sessionActivity = c.getSessionActivity(); + + writer.println(" PlaybackState: " + Util.playbackStateToString(playbackState)); + writer.println(" PlaybackInfo: " + Util.playbackInfoToString(pi)); + if (mm != null) { + writer.println(" MediaMetadata.desc=" + mm.getDescription()); + } + writer.println(" RatingType: " + ratingType); + writer.println(" Flags: " + flags); + if (extras != null) { + writer.println(" Extras:"); + for (String key : extras.keySet()) { + writer.println(" " + key + "=" + extras.get(key)); + } + } + if (queueTitle != null) { + writer.println(" QueueTitle: " + queueTitle); + } + if (queue != null && !queue.isEmpty()) { + writer.println(" Queue:"); + for (QueueItem qi : queue) { + writer.println(" " + qi); + } + } + if (pi != null) { + writer.println(" sessionActivity: " + sessionActivity); + } + } + + public static void dumpMediaSessions(Context context) { + final MediaSessionManager mgr = (MediaSessionManager) context + .getSystemService(Context.MEDIA_SESSION_SERVICE); + try { + final List<MediaController> controllers = mgr.getActiveSessions(null); + final int N = controllers.size(); + if (D.BUG) Log.d(TAG, N + " controllers"); + for (int i = 0; i < N; i++) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw, true); + dump(i + 1, pw, controllers.get(i)); + if (D.BUG) Log.d(TAG, sw.toString()); + } + } catch (SecurityException e) { + Log.w(TAG, "Not allowed to get sessions", e); + } + } + + private final class MediaControllerRecord extends MediaController.Callback { + private final MediaController controller; + + private boolean sentRemote; + private String name; + + private MediaControllerRecord(MediaController controller) { + this.controller = controller; + } + + private String cb(String method) { + return method + " " + controller.getPackageName() + " "; + } + + @Override + public void onAudioInfoChanged(PlaybackInfo info) { + if (D.BUG) Log.d(TAG, cb("onAudioInfoChanged") + Util.playbackInfoToString(info) + + " sentRemote=" + sentRemote); + final boolean remote = isRemote(info); + if (!remote && sentRemote) { + mCallbacks.onRemoteRemoved(controller.getSessionToken()); + sentRemote = false; + } else if (remote) { + updateRemoteH(controller.getSessionToken(), name, info); + sentRemote = true; + } + } + + @Override + public void onExtrasChanged(Bundle extras) { + if (D.BUG) Log.d(TAG, cb("onExtrasChanged") + extras); + } + + @Override + public void onMetadataChanged(MediaMetadata metadata) { + if (D.BUG) Log.d(TAG, cb("onMetadataChanged") + Util.mediaMetadataToString(metadata)); + } + + @Override + public void onPlaybackStateChanged(PlaybackState state) { + if (D.BUG) Log.d(TAG, cb("onPlaybackStateChanged") + Util.playbackStateToString(state)); + } + + @Override + public void onQueueChanged(List<QueueItem> queue) { + if (D.BUG) Log.d(TAG, cb("onQueueChanged") + queue); + } + + @Override + public void onQueueTitleChanged(CharSequence title) { + if (D.BUG) Log.d(TAG, cb("onQueueTitleChanged") + title); + } + + @Override + public void onSessionDestroyed() { + if (D.BUG) Log.d(TAG, cb("onSessionDestroyed")); + } + + @Override + public void onSessionEvent(String event, Bundle extras) { + if (D.BUG) Log.d(TAG, cb("onSessionEvent") + "event=" + event + " extras=" + extras); + } + } + + private final OnActiveSessionsChangedListener mSessionsListener = + new OnActiveSessionsChangedListener() { + @Override + public void onActiveSessionsChanged(List<MediaController> controllers) { + onActiveSessionsUpdatedH(controllers); + } + }; + + private final IRemoteVolumeController mRvc = new IRemoteVolumeController.Stub() { + @Override + public void remoteVolumeChanged(ISessionController session, int flags) + throws RemoteException { + mHandler.obtainMessage(H.REMOTE_VOLUME_CHANGED, flags, 0, session).sendToTarget(); + } + + @Override + public void updateRemoteController(final ISessionController session) + throws RemoteException { + mHandler.obtainMessage(H.UPDATE_REMOTE_CONTROLLER, session).sendToTarget(); + } + }; + + private final class H extends Handler { + private static final int UPDATE_SESSIONS = 1; + private static final int REMOTE_VOLUME_CHANGED = 2; + private static final int UPDATE_REMOTE_CONTROLLER = 3; + + private H(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case UPDATE_SESSIONS: + onActiveSessionsUpdatedH(mMgr.getActiveSessions(null)); + break; + case REMOTE_VOLUME_CHANGED: + onRemoteVolumeChangedH((ISessionController) msg.obj, msg.arg1); + break; + case UPDATE_REMOTE_CONTROLLER: + onUpdateRemoteControllerH((ISessionController) msg.obj); + break; + } + } + } + + public interface Callbacks { + void onRemoteUpdate(Token token, String name, PlaybackInfo pi); + void onRemoteRemoved(Token t); + void onRemoteVolumeChanged(Token token, int flags); + } + +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/SafetyWarningDialog.java b/packages/SystemUI/src/com/android/systemui/volume/SafetyWarningDialog.java new file mode 100644 index 0000000..04640a2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/SafetyWarningDialog.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.media.AudioManager; +import android.util.Log; +import android.view.KeyEvent; +import android.view.WindowManager; + +import com.android.systemui.statusbar.phone.SystemUIDialog; + +abstract public class SafetyWarningDialog extends SystemUIDialog + implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener { + + private static final String TAG = Util.logTag(SafetyWarningDialog.class); + + private static final int KEY_CONFIRM_ALLOWED_AFTER = 1000; // milliseconds + + private final Context mContext; + private final AudioManager mAudioManager; + + private long mShowTime; + private boolean mNewVolumeUp; + + public SafetyWarningDialog(Context context, AudioManager audioManager) { + super(context); + mContext = context; + mAudioManager = audioManager; + + getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); + setMessage(mContext.getString(com.android.internal.R.string.safe_media_volume_warning)); + setButton(DialogInterface.BUTTON_POSITIVE, + mContext.getString(com.android.internal.R.string.yes), this); + setButton(DialogInterface.BUTTON_NEGATIVE, + mContext.getString(com.android.internal.R.string.no), (OnClickListener) null); + setOnDismissListener(this); + + final IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + context.registerReceiver(mReceiver, filter); + } + + abstract protected void cleanUp(); + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getRepeatCount() == 0) { + mNewVolumeUp = true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mNewVolumeUp + && (System.currentTimeMillis() - mShowTime) > KEY_CONFIRM_ALLOWED_AFTER) { + if (D.BUG) Log.d(TAG, "Confirmed warning via VOLUME_UP"); + mAudioManager.disableSafeMediaVolume(); + dismiss(); + } + return super.onKeyUp(keyCode, event); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + mAudioManager.disableSafeMediaVolume(); + } + + @Override + protected void onStart() { + super.onStart(); + mShowTime = System.currentTimeMillis(); + } + + @Override + public void onDismiss(DialogInterface unused) { + mContext.unregisterReceiver(mReceiver); + cleanUp(); + } + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { + if (D.BUG) Log.d(TAG, "Received ACTION_CLOSE_SYSTEM_DIALOGS"); + cancel(); + cleanUp(); + } + } + }; +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java b/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java index 5f5b881..4f20ac7 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java +++ b/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java @@ -60,17 +60,14 @@ public class SegmentedButtons extends LinearLayout { final Object tag = c.getTag(); final boolean selected = Objects.equals(mSelectedValue, tag); c.setSelected(selected); - c.getCompoundDrawables()[1].setTint(mContext.getColor(selected - ? R.color.segmented_button_selected : R.color.segmented_button_unselected)); } fireOnSelected(); } - public void addButton(int labelResId, int iconResId, Object value) { + public void addButton(int labelResId, Object value) { final Button b = (Button) mInflater.inflate(R.layout.segmented_button, this, false); b.setTag(LABEL_RES_KEY, labelResId); b.setText(labelResId); - b.setCompoundDrawablesWithIntrinsicBounds(0, iconResId, 0, 0); final LayoutParams lp = (LayoutParams) b.getLayoutParams(); if (getChildCount() == 0) { lp.leftMargin = lp.rightMargin = 0; // first button has no margin diff --git a/packages/SystemUI/src/com/android/systemui/volume/SpTexts.java b/packages/SystemUI/src/com/android/systemui/volume/SpTexts.java new file mode 100644 index 0000000..d8e53db --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/SpTexts.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.content.Context; +import android.content.res.Resources; +import android.util.ArrayMap; +import android.util.TypedValue; +import android.view.View; +import android.view.View.OnAttachStateChangeListener; +import android.widget.TextView; + +/** + * Capture initial sp values for registered textviews, and update properly when configuration + * changes. + */ +public class SpTexts { + + private final Context mContext; + private final ArrayMap<TextView, Integer> mTexts = new ArrayMap<>(); + + public SpTexts(Context context) { + mContext = context; + } + + public int add(final TextView text) { + if (text == null) return 0; + final Resources res = mContext.getResources(); + final float fontScale = res.getConfiguration().fontScale; + final float density = res.getDisplayMetrics().density; + final float px = text.getTextSize(); + final int sp = (int)(px / fontScale / density); + mTexts.put(text, sp); + text.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { + @Override + public void onViewDetachedFromWindow(View v) { + } + + @Override + public void onViewAttachedToWindow(View v) { + setTextSizeH(text, sp); + } + }); + return sp; + } + + public void update() { + if (mTexts.isEmpty()) return; + mTexts.keyAt(0).post(mUpdateAll); + } + + private void setTextSizeH(TextView text, int sp) { + text.setTextSize(TypedValue.COMPLEX_UNIT_SP, sp); + } + + private final Runnable mUpdateAll = new Runnable() { + @Override + public void run() { + for (int i = 0; i < mTexts.size(); i++) { + setTextSizeH(mTexts.keyAt(i), mTexts.valueAt(i)); + } + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/Util.java b/packages/SystemUI/src/com/android/systemui/volume/Util.java new file mode 100644 index 0000000..216a4da --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/Util.java @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.media.AudioManager; +import android.media.MediaMetadata; +import android.media.VolumeProvider; +import android.media.session.MediaController.PlaybackInfo; +import android.media.session.PlaybackState; +import android.view.View; +import android.widget.TextView; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Objects; + +/** + * Static helpers for the volume dialog. + */ +class Util { + + // Note: currently not shown (only used in the text footer) + private static final SimpleDateFormat HMMAA = new SimpleDateFormat("h:mm aa", Locale.US); + + private static int[] AUDIO_MANAGER_FLAGS = new int[] { + AudioManager.FLAG_SHOW_UI, + AudioManager.FLAG_VIBRATE, + AudioManager.FLAG_PLAY_SOUND, + AudioManager.FLAG_ALLOW_RINGER_MODES, + AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE, + AudioManager.FLAG_SHOW_VIBRATE_HINT, + AudioManager.FLAG_SHOW_SILENT_HINT, + AudioManager.FLAG_FROM_KEY, + AudioManager.FLAG_SHOW_UI_WARNINGS, + }; + + private static String[] AUDIO_MANAGER_FLAG_NAMES = new String[] { + "SHOW_UI", + "VIBRATE", + "PLAY_SOUND", + "ALLOW_RINGER_MODES", + "REMOVE_SOUND_AND_VIBRATE", + "SHOW_VIBRATE_HINT", + "SHOW_SILENT_HINT", + "FROM_KEY", + "SHOW_UI_WARNINGS", + }; + + public static String logTag(Class<?> c) { + final String tag = "vol." + c.getSimpleName(); + return tag.length() < 23 ? tag : tag.substring(0, 23); + } + + public static String ringerModeToString(int ringerMode) { + switch (ringerMode) { + case AudioManager.RINGER_MODE_SILENT: return "RINGER_MODE_SILENT"; + case AudioManager.RINGER_MODE_VIBRATE: return "RINGER_MODE_VIBRATE"; + case AudioManager.RINGER_MODE_NORMAL: return "RINGER_MODE_NORMAL"; + default: return "RINGER_MODE_UNKNOWN_" + ringerMode; + } + } + + public static String mediaMetadataToString(MediaMetadata metadata) { + return metadata.getDescription().toString(); + } + + public static String playbackInfoToString(PlaybackInfo info) { + if (info == null) return null; + final String type = playbackInfoTypeToString(info.getPlaybackType()); + final String vc = volumeProviderControlToString(info.getVolumeControl()); + return String.format("PlaybackInfo[vol=%s,max=%s,type=%s,vc=%s],atts=%s", + info.getCurrentVolume(), info.getMaxVolume(), type, vc, info.getAudioAttributes()); + } + + public static String playbackInfoTypeToString(int type) { + switch (type) { + case PlaybackInfo.PLAYBACK_TYPE_LOCAL: return "LOCAL"; + case PlaybackInfo.PLAYBACK_TYPE_REMOTE: return "REMOTE"; + default: return "UNKNOWN_" + type; + } + } + + public static String playbackStateStateToString(int state) { + switch (state) { + case PlaybackState.STATE_NONE: return "STATE_NONE"; + case PlaybackState.STATE_STOPPED: return "STATE_STOPPED"; + case PlaybackState.STATE_PAUSED: return "STATE_PAUSED"; + case PlaybackState.STATE_PLAYING: return "STATE_PLAYING"; + default: return "UNKNOWN_" + state; + } + } + + public static String volumeProviderControlToString(int control) { + switch (control) { + case VolumeProvider.VOLUME_CONTROL_ABSOLUTE: return "VOLUME_CONTROL_ABSOLUTE"; + case VolumeProvider.VOLUME_CONTROL_FIXED: return "VOLUME_CONTROL_FIXED"; + case VolumeProvider.VOLUME_CONTROL_RELATIVE: return "VOLUME_CONTROL_RELATIVE"; + default: return "VOLUME_CONTROL_UNKNOWN_" + control; + } + } + + public static String playbackStateToString(PlaybackState playbackState) { + if (playbackState == null) return null; + return playbackStateStateToString(playbackState.getState()) + " " + playbackState; + } + + public static String audioManagerFlagsToString(int value) { + return bitFieldToString(value, AUDIO_MANAGER_FLAGS, AUDIO_MANAGER_FLAG_NAMES); + } + + private static String bitFieldToString(int value, int[] values, String[] names) { + if (value == 0) return ""; + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < values.length; i++) { + if ((value & values[i]) != 0) { + if (sb.length() > 0) sb.append(','); + sb.append(names[i]); + } + value &= ~values[i]; + } + if (value != 0) { + if (sb.length() > 0) sb.append(','); + sb.append("UNKNOWN_").append(value); + } + return sb.toString(); + } + + public static String getShortTime(long millis) { + return HMMAA.format(new Date(millis)); + } + + public static void setText(TextView tv, CharSequence text) { + if (Objects.equals(tv.getText(), text)) return; + tv.setText(text); + } + + public static final void setVisOrGone(View v, boolean vis) { + if (v == null || (v.getVisibility() == View.VISIBLE) == vis) return; + v.setVisibility(vis ? View.VISIBLE : View.GONE); + } + + public static final void setVisOrInvis(View v, boolean vis) { + if (v == null || (v.getVisibility() == View.VISIBLE) == vis) return; + v.setVisibility(vis ? View.VISIBLE : View.INVISIBLE); + } + +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java index e3f8f3d..1f0ee57 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java @@ -16,10 +16,18 @@ package com.android.systemui.volume; +import android.content.res.Configuration; + import com.android.systemui.DemoMode; import com.android.systemui.statusbar.policy.ZenModeController; +import java.io.FileDescriptor; +import java.io.PrintWriter; + public interface VolumeComponent extends DemoMode { ZenModeController getZenController(); void dismissNow(); + void onConfigurationChanged(Configuration newConfig); + void dump(FileDescriptor fd, PrintWriter pw, String[] args); + void register(); } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java new file mode 100644 index 0000000..bb4aa61 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -0,0 +1,1073 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.animation.LayoutTransition; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.drawable.AnimatedVectorDrawable; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.os.SystemClock; +import android.provider.Settings.Global; +import android.service.notification.ZenModeConfig; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.SparseBooleanArray; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnLayoutChangeListener; +import android.view.View.OnTouchListener; +import android.view.ViewGroup; +import android.view.ViewGroup.MarginLayoutParams; +import android.view.Window; +import android.view.WindowManager; +import android.view.animation.DecelerateInterpolator; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.SeekBar.OnSeekBarChangeListener; +import android.widget.TextView; + +import com.android.systemui.R; +import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.volume.VolumeDialogController.State; +import com.android.systemui.volume.VolumeDialogController.StreamState; + +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +/** + * Visual presentation of the volume dialog. + * + * A client of VolumeDialogController and its state model. + * + * Methods ending in "H" must be called on the (ui) handler. + */ +public class VolumeDialog { + private static final String TAG = Util.logTag(VolumeDialog.class); + + private static final long USER_ATTEMPT_GRACE_PERIOD = 1000; + private static final int WAIT_FOR_RIPPLE = 200; + private static final int UPDATE_ANIMATION_DURATION = 80; + + private final Context mContext; + private final H mHandler = new H(); + private final VolumeDialogController mController; + + private final CustomDialog mDialog; + private final ViewGroup mDialogView; + private final ViewGroup mDialogContentView; + private final ImageButton mExpandButton; + private final TextView mFootlineText; + private final Button mFootlineAction; + private final View mSettingsButton; + private final View mFooter; + private final List<VolumeRow> mRows = new ArrayList<VolumeRow>(); + private final SpTexts mSpTexts; + private final SparseBooleanArray mDynamic = new SparseBooleanArray(); + private final KeyguardManager mKeyguard; + private final int mExpandButtonAnimationDuration; + private final View mTextFooter; + private final ZenFooter mZenFooter; + private final LayoutTransition mLayoutTransition; + private final Object mSafetyWarningLock = new Object(); + + private boolean mShowing; + private boolean mExpanded; + private int mActiveStream; + private boolean mShowHeaders = VolumePrefs.DEFAULT_SHOW_HEADERS; + private boolean mShowFooter = VolumePrefs.DEFAULT_SHOW_FOOTER; + private boolean mShowZenFooter = VolumePrefs.DEFAULT_ZEN_FOOTER; + private boolean mAutomute = VolumePrefs.DEFAULT_ENABLE_AUTOMUTE; + private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE; + private State mState; + private int mExpandButtonRes; + private boolean mExpanding; + private SafetyWarningDialog mSafetyWarning; + private Callback mCallback; + + public VolumeDialog(Context context, VolumeDialogController controller, + ZenModeController zenModeController, Callback callback) { + mContext = context; + mController = controller; + mCallback = callback; + mSpTexts = new SpTexts(mContext); + mKeyguard = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); + + mDialog = new CustomDialog(mContext); + + final Window window = mDialog.getWindow(); + window.requestFeature(Window.FEATURE_NO_TITLE); + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH + | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); + mDialog.setCanceledOnTouchOutside(true); + final Resources res = mContext.getResources(); + final WindowManager.LayoutParams lp = window.getAttributes(); + lp.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; + lp.format = PixelFormat.TRANSLUCENT; + lp.setTitle(VolumeDialog.class.getSimpleName()); + lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; + lp.windowAnimations = R.style.VolumeDialogAnimations; + lp.y = res.getDimensionPixelSize(R.dimen.volume_offset_top); + lp.gravity = Gravity.TOP; + window.setAttributes(lp); + + mDialog.setContentView(R.layout.volume_dialog); + mDialogView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog); + mDialogContentView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog_content); + mExpandButton = (ImageButton) mDialogView.findViewById(R.id.volume_expand_button); + mExpandButton.setOnClickListener(mClickExpand); + updateWindowWidthH(); + updateExpandButtonH(); + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.setDuration(new ValueAnimator().getDuration() / 2); + mLayoutTransition.disableTransitionType(LayoutTransition.DISAPPEARING); + mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + mDialogContentView.setLayoutTransition(mLayoutTransition); + + addRow(AudioManager.STREAM_RING, + R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true); + addRow(AudioManager.STREAM_MUSIC, + R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true); + addRow(AudioManager.STREAM_ALARM, + R.drawable.ic_volume_alarm, R.drawable.ic_volume_alarm_mute, false); + addRow(AudioManager.STREAM_VOICE_CALL, + R.drawable.ic_volume_voice, R.drawable.ic_volume_voice, false); + addRow(AudioManager.STREAM_BLUETOOTH_SCO, + R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false); + addRow(AudioManager.STREAM_SYSTEM, + R.drawable.ic_volume_system, R.drawable.ic_volume_system_mute, false); + + mTextFooter = mDialog.findViewById(R.id.volume_text_footer); + mFootlineText = (TextView) mDialog.findViewById(R.id.volume_footline_text); + mSpTexts.add(mFootlineText); + mFootlineAction = (Button) mDialog.findViewById(R.id.volume_footline_action_button); + mSpTexts.add(mFootlineAction); + mFooter = mDialog.findViewById(R.id.volume_footer); + mSettingsButton = mDialog.findViewById(R.id.volume_settings_button); + mSettingsButton.setOnClickListener(mClickSettings); + mExpandButtonAnimationDuration = res.getInteger(R.integer.volume_expand_animation_duration); + mZenFooter = (ZenFooter) mDialog.findViewById(R.id.volume_zen_footer); + mZenFooter.init(zenModeController, mZenFooterCallback); + + controller.addCallback(mControllerCallbackH, mHandler); + controller.getState(); + } + + private void updateWindowWidthH() { + final ViewGroup.LayoutParams lp = mDialogView.getLayoutParams(); + final DisplayMetrics dm = mContext.getResources().getDisplayMetrics(); + if (D.BUG) Log.d(TAG, "updateWindowWidth dm.w=" + dm.widthPixels); + int w = dm.widthPixels; + final int max = mContext.getResources() + .getDimensionPixelSize(R.dimen.standard_notification_panel_width); + if (w > max) { + w = max; + } + w -= mContext.getResources().getDimensionPixelSize(R.dimen.notification_side_padding) * 2; + lp.width = w; + mDialogView.setLayoutParams(lp); + } + + public void setStreamImportant(int stream, boolean important) { + mHandler.obtainMessage(H.SET_STREAM_IMPORTANT, stream, important ? 1 : 0).sendToTarget(); + } + + public void setShowHeaders(boolean showHeaders) { + if (showHeaders == mShowHeaders) return; + mShowHeaders = showHeaders; + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + public void setShowFooter(boolean show) { + if (mShowFooter == show) return; + mShowFooter = show; + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + public void setZenFooter(boolean zen) { + if (mShowZenFooter == zen) return; + mShowZenFooter = zen; + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + public void setAutomute(boolean automute) { + if (mAutomute == automute) return; + mAutomute = automute; + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + public void setSilentMode(boolean silentMode) { + if (mSilentMode == silentMode) return; + mSilentMode = silentMode; + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + private void addRow(int stream, int iconRes, int iconMuteRes, boolean important) { + final VolumeRow row = initRow(stream, iconRes, iconMuteRes, important); + if (!mRows.isEmpty()) { + final View v = new View(mContext); + final int h = mContext.getResources() + .getDimensionPixelSize(R.dimen.volume_slider_interspacing); + final LinearLayout.LayoutParams lp = + new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, h); + mDialogContentView.addView(v, mDialogContentView.getChildCount() - 1, lp); + row.space = v; + } + row.settingsButton.addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + if (D.BUG) Log.d(TAG, "onLayoutChange" + + " old=" + new Rect(oldLeft, oldTop, oldRight, oldBottom).toShortString() + + " new=" + new Rect(left,top,right,bottom).toShortString()); + if (oldLeft != left || oldTop != top) { + for (int i = 0; i < mDialogContentView.getChildCount(); i++) { + final View c = mDialogContentView.getChildAt(i); + if (!c.isShown()) continue; + if (c == row.view) { + repositionExpandAnim(row); + } + return; + } + } + } + }); + // add new row just before the footer + mDialogContentView.addView(row.view, mDialogContentView.getChildCount() - 1); + mRows.add(row); + } + + private boolean isAttached() { + return mDialogContentView != null && mDialogContentView.isAttachedToWindow(); + } + + private VolumeRow getActiveRow() { + for (VolumeRow row : mRows) { + if (row.stream == mActiveStream) { + return row; + } + } + return mRows.get(0); + } + + private VolumeRow findRow(int stream) { + for (VolumeRow row : mRows) { + if (row.stream == stream) return row; + } + return null; + } + + private void repositionExpandAnim(VolumeRow row) { + final int[] loc = new int[2]; + row.settingsButton.getLocationInWindow(loc); + final MarginLayoutParams mlp = (MarginLayoutParams) mDialogView.getLayoutParams(); + final int x = loc[0] - mlp.leftMargin; + final int y = loc[1] - mlp.topMargin; + if (D.BUG) Log.d(TAG, "repositionExpandAnim x=" + x + " y=" + y); + mExpandButton.setTranslationX(x); + mExpandButton.setTranslationY(y); + } + + public void dump(PrintWriter writer) { + writer.println(VolumeDialog.class.getSimpleName() + " state:"); + writer.print(" mShowing: "); writer.println(mShowing); + writer.print(" mExpanded: "); writer.println(mExpanded); + writer.print(" mExpanding: "); writer.println(mExpanding); + writer.print(" mActiveStream: "); writer.println(mActiveStream); + writer.print(" mDynamic: "); writer.println(mDynamic); + writer.print(" mShowHeaders: "); writer.println(mShowHeaders); + writer.print(" mShowFooter: "); writer.println(mShowFooter); + writer.print(" mAutomute: "); writer.println(mAutomute); + writer.print(" mSilentMode: "); writer.println(mSilentMode); + } + + private static int getImpliedLevel(SeekBar seekBar, int progress) { + final int m = seekBar.getMax(); + final int n = m / 100 - 1; + final int level = progress == 0 ? 0 + : progress == m ? (m / 100) : (1 + (int)((progress / (float) m) * n)); + return level; + } + + @SuppressLint("InflateParams") + private VolumeRow initRow(final int stream, int iconRes, int iconMuteRes, boolean important) { + final VolumeRow row = new VolumeRow(); + row.stream = stream; + row.iconRes = iconRes; + row.iconMuteRes = iconMuteRes; + row.important = important; + row.view = mDialog.getLayoutInflater().inflate(R.layout.volume_dialog_row, null); + row.view.setTag(row); + row.header = (TextView) row.view.findViewById(R.id.volume_row_header); + mSpTexts.add(row.header); + row.slider = (SeekBar) row.view.findViewById(R.id.volume_row_slider); + row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row)); + + // forward events above the slider into the slider + row.view.setOnTouchListener(new OnTouchListener() { + private final Rect mSliderHitRect = new Rect(); + private boolean mDragging; + + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouch(View v, MotionEvent event) { + row.slider.getHitRect(mSliderHitRect); + if (!mDragging && event.getActionMasked() == MotionEvent.ACTION_DOWN + && event.getY() < mSliderHitRect.top) { + mDragging = true; + } + if (mDragging) { + event.offsetLocation(-mSliderHitRect.left, -mSliderHitRect.top); + row.slider.dispatchTouchEvent(event); + if (event.getActionMasked() == MotionEvent.ACTION_UP + || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { + mDragging = false; + } + return true; + } + return false; + } + }); + row.icon = (ImageButton) row.view.findViewById(R.id.volume_row_icon); + row.icon.setImageResource(iconRes); + row.icon.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Events.writeEvent(Events.EVENT_ICON_CLICK, row.stream, row.iconState); + mController.setActiveStream(row.stream); + if (row.stream == AudioManager.STREAM_RING) { + final boolean hasVibrator = mController.hasVibrator(); + if (mState.ringerModeInternal == AudioManager.RINGER_MODE_NORMAL) { + if (hasVibrator) { + mController.setRingerMode(AudioManager.RINGER_MODE_VIBRATE, false); + } else { + final boolean wasZero = row.ss.level == 0; + mController.setStreamVolume(stream, wasZero ? row.lastAudibleLevel : 0); + } + } else { + mController.setRingerMode(AudioManager.RINGER_MODE_NORMAL, false); + if (row.ss.level == 0) { + mController.setStreamVolume(stream, 1); + } + } + } else { + if (mAutomute && !row.ss.muteSupported) { + final boolean vmute = row.ss.level == 0; + mController.setStreamVolume(stream, vmute ? row.lastAudibleLevel : 0); + } else { + final boolean mute = !row.ss.muted; + mController.setStreamMute(stream, mute); + if (mAutomute) { + if (!mute && row.ss.level == 0) { + mController.setStreamVolume(stream, 1); + } + } + } + } + row.userAttempt = 0; // reset the grace period, slider should update immediately + } + }); + row.settingsButton = (ImageButton) row.view.findViewById(R.id.volume_settings_button); + row.settingsButton.setOnClickListener(mClickSettings); + return row; + } + + public void destroy() { + mController.removeCallback(mControllerCallbackH); + } + + public void show(int reason) { + mHandler.obtainMessage(H.SHOW, reason, 0).sendToTarget(); + } + + public void dismiss(int reason) { + mHandler.obtainMessage(H.DISMISS, reason, 0).sendToTarget(); + } + + private void showH(int reason) { + mHandler.removeMessages(H.SHOW); + mHandler.removeMessages(H.DISMISS); + rescheduleTimeoutH(); + if (mShowing) return; + mShowing = true; + mDialog.show(); + Events.writeEvent(Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); + mController.notifyVisible(true); + } + + protected void rescheduleTimeoutH() { + mHandler.removeMessages(H.DISMISS); + final int timeout = computeTimeoutH(); + if (D.BUG) Log.d(TAG, "rescheduleTimeout " + timeout); + mHandler.sendMessageDelayed(mHandler + .obtainMessage(H.DISMISS, Events.DISMISS_REASON_TIMEOUT, 0), timeout); + mController.userActivity(); + } + + private int computeTimeoutH() { + if (mZenFooter != null && mZenFooter.isFooterExpanded()) return 10000; + if (mSafetyWarning != null) return 5000; + if (mExpanded || mExpanding) return 5000; + if (mActiveStream == AudioManager.STREAM_MUSIC) return 1500; + return 3000; + } + + protected void dismissH(int reason) { + mHandler.removeMessages(H.DISMISS); + mHandler.removeMessages(H.SHOW); + if (!mShowing) return; + mShowing = false; + mDialog.dismiss(); + Events.writeEvent(Events.EVENT_DISMISS_DIALOG, reason); + setExpandedH(false); + mController.notifyVisible(false); + synchronized (mSafetyWarningLock) { + if (mSafetyWarning != null) { + if (D.BUG) Log.d(TAG, "SafetyWarning dismissed"); + mSafetyWarning.dismiss(); + } + } + } + + private void setExpandedH(boolean expanded) { + if (mExpanded == expanded) return; + mExpanded = expanded; + mExpanding = isAttached(); + if (D.BUG) Log.d(TAG, "setExpandedH " + expanded); + updateRowsH(); + if (mExpanding) { + final Drawable d = mExpandButton.getDrawable(); + if (d instanceof AnimatedVectorDrawable) { + // workaround to reset drawable + final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) d.getConstantState() + .newDrawable(); + mExpandButton.setImageDrawable(avd); + avd.start(); + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + mExpanding = false; + updateExpandButtonH(); + rescheduleTimeoutH(); + } + }, mExpandButtonAnimationDuration); + } + } + rescheduleTimeoutH(); + } + + private void updateExpandButtonH() { + mExpandButton.setClickable(!mExpanding); + if (mExpanding && isAttached()) return; + final int res = mExpanded ? R.drawable.ic_volume_collapse_animation + : R.drawable.ic_volume_expand_animation; + if (res == mExpandButtonRes) return; + mExpandButtonRes = res; + mExpandButton.setImageResource(res); + } + + private boolean isVisibleH(VolumeRow row, boolean isActive) { + return mExpanded && row.view.getVisibility() == View.VISIBLE + || (mExpanded && (row.important || isActive)) + || !mExpanded && isActive; + } + + private void updateRowsH() { + final VolumeRow activeRow = getActiveRow(); + updateFooterH(); + updateExpandButtonH(); + final boolean footerVisible = mFooter.getVisibility() == View.VISIBLE; + if (!mShowing) { + trimObsoleteH(); + } + // first, find the last visible row + VolumeRow lastVisible = null; + for (VolumeRow row : mRows) { + final boolean isActive = row == activeRow; + if (isVisibleH(row, isActive)) { + lastVisible = row; + } + } + // apply changes to all rows + for (VolumeRow row : mRows) { + final boolean isActive = row == activeRow; + final boolean visible = isVisibleH(row, isActive); + Util.setVisOrGone(row.view, visible); + Util.setVisOrGone(row.space, visible && mExpanded); + final int expandButtonRes = mExpanded ? R.drawable.ic_volume_settings : 0; + if (expandButtonRes != row.cachedExpandButtonRes) { + row.cachedExpandButtonRes = expandButtonRes; + if (expandButtonRes == 0) { + row.settingsButton.setImageDrawable(null); + } else { + row.settingsButton.setImageResource(expandButtonRes); + } + } + Util.setVisOrInvis(row.settingsButton, + mExpanded && (!footerVisible && row == lastVisible)); + row.header.setAlpha(mExpanded && isActive ? 1 : 0.5f); + } + } + + private void trimObsoleteH() { + for (int i = mRows.size() -1; i >= 0; i--) { + final VolumeRow row = mRows.get(i); + if (row.ss == null || !row.ss.dynamic) continue; + if (!mDynamic.get(row.stream)) { + mRows.remove(i); + mDialogContentView.removeView(row.view); + mDialogContentView.removeView(row.space); + } + } + } + + private void onStateChangedH(State state) { + mState = state; + mDynamic.clear(); + // add any new dynamic rows + for (int i = 0; i < state.states.size(); i++) { + final int stream = state.states.keyAt(i); + final StreamState ss = state.states.valueAt(i); + if (!ss.dynamic) continue; + mDynamic.put(stream, true); + if (findRow(stream) == null) { + addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true); + } + } + + if (mActiveStream != state.activeStream) { + mActiveStream = state.activeStream; + updateRowsH(); + rescheduleTimeoutH(); + } + for (VolumeRow row : mRows) { + updateVolumeRowH(row); + } + updateFooterH(); + } + + private void updateTextFooterH() { + final boolean zen = mState.zenMode != Global.ZEN_MODE_OFF; + final boolean wasVisible = mFooter.getVisibility() == View.VISIBLE; + Util.setVisOrGone(mTextFooter, mExpanded && mShowFooter && (zen || mShowing && wasVisible)); + if (mTextFooter.getVisibility() == View.VISIBLE) { + String text = null; + String action = null; + if (mState.exitCondition != null) { + final long countdown = ZenModeConfig.tryParseCountdownConditionId(mState + .exitCondition.id); + if (countdown != 0) { + text = mContext.getString(R.string.volume_dnd_ends_at, + Util.getShortTime(countdown)); + action = mContext.getString(R.string.volume_end_now); + } + } + if (text == null) { + text = mContext.getString(R.string.volume_dnd_is_on); + } + if (action == null) { + action = mContext.getString(R.string.volume_turn_off); + } + Util.setText(mFootlineText, text); + Util.setText(mFootlineAction, action); + mFootlineAction.setOnClickListener(mTurnOffDnd); + } + Util.setVisOrGone(mFootlineText, zen); + Util.setVisOrGone(mFootlineAction, zen); + } + + private void updateFooterH() { + if (!mShowFooter) { + Util.setVisOrGone(mFooter, false); + return; + } + if (mShowZenFooter) { + Util.setVisOrGone(mTextFooter, false); + final boolean ringActive = mActiveStream == AudioManager.STREAM_RING; + Util.setVisOrGone(mZenFooter, mZenFooter.isZen() && ringActive + || mShowing && (mExpanded || mZenFooter.getVisibility() == View.VISIBLE)); + mZenFooter.update(); + } else { + Util.setVisOrGone(mZenFooter, false); + updateTextFooterH(); + } + } + + private void updateVolumeRowH(VolumeRow row) { + if (mState == null) return; + final StreamState ss = mState.states.get(row.stream); + if (ss == null) return; + row.ss = ss; + if (ss.level > 0) { + row.lastAudibleLevel = ss.level; + } + final boolean isRingStream = row.stream == AudioManager.STREAM_RING; + final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM; + final boolean isRingVibrate = isRingStream + && mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE; + final boolean isNoned = (isRingStream || isSystemStream) + && mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS; + final boolean isLimited = isRingStream + && mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + + // update slider max + final int max = ss.levelMax * 100; + if (max != row.slider.getMax()) { + row.slider.setMax(max); + } + + // update header visible + if (row.cachedShowHeaders != mShowHeaders) { + row.cachedShowHeaders = mShowHeaders; + Util.setVisOrGone(row.header, mShowHeaders); + } + + // update header text + final String text; + if (isNoned) { + text = mContext.getString(R.string.volume_stream_muted_dnd, ss.name); + } else if (isRingVibrate && isLimited) { + text = mContext.getString(R.string.volume_stream_vibrate_dnd, ss.name); + } else if (isRingVibrate) { + text = mContext.getString(R.string.volume_stream_vibrate, ss.name); + } else if (ss.muted || mAutomute && ss.level == 0) { + text = mContext.getString(R.string.volume_stream_muted, ss.name); + } else if (isLimited) { + text = mContext.getString(R.string.volume_stream_limited_dnd, ss.name); + } else { + text = ss.name; + } + Util.setText(row.header, text); + + // update icon + final boolean iconEnabled = mAutomute || ss.muteSupported; + row.icon.setEnabled(iconEnabled); + row.icon.setAlpha(iconEnabled ? 1 : 0.5f); + final int iconRes = + isRingVibrate ? R.drawable.ic_volume_ringer_vibrate + : ss.routedToBluetooth ? + (ss.muted ? R.drawable.ic_volume_media_bt_mute + : R.drawable.ic_volume_media_bt) + : mAutomute && ss.level == 0 ? row.iconMuteRes + : (ss.muted ? row.iconMuteRes : row.iconRes); + if (iconRes != row.cachedIconRes) { + if (row.cachedIconRes != 0 && isRingVibrate) { + mController.vibrate(); + } + row.cachedIconRes = iconRes; + row.icon.setImageResource(iconRes); + } + row.iconState = + iconRes == R.drawable.ic_volume_ringer_vibrate ? Events.ICON_STATE_VIBRATE + : (iconRes == R.drawable.ic_volume_media_bt_mute || iconRes == row.iconMuteRes) + ? Events.ICON_STATE_MUTE + : (iconRes == R.drawable.ic_volume_media_bt || iconRes == row.iconRes) + ? Events.ICON_STATE_UNMUTE + : Events.ICON_STATE_UNKNOWN; + + // update slider + updateVolumeRowSliderH(row); + } + + private void updateVolumeRowSliderH(VolumeRow row) { + if (row.tracking) { + return; // don't update if user is sliding + } + final int progress = row.slider.getProgress(); + final int level = getImpliedLevel(row.slider, progress); + final boolean rowVisible = row.view.getVisibility() == View.VISIBLE; + final boolean inGracePeriod = (SystemClock.uptimeMillis() - row.userAttempt) + < USER_ATTEMPT_GRACE_PERIOD; + mHandler.removeMessages(H.RECHECK, row); + if (mShowing && rowVisible && inGracePeriod) { + if (D.BUG) Log.d(TAG, "inGracePeriod"); + mHandler.sendMessageAtTime(mHandler.obtainMessage(H.RECHECK, row), + row.userAttempt + USER_ATTEMPT_GRACE_PERIOD); + return; // don't update if visible and in grace period + } + final int vlevel = row.ss.muted ? 0 : row.ss.level; + if (vlevel == level) { + if (mShowing && rowVisible) { + return; // don't clamp if visible + } + } + final int newProgress = vlevel * 100; + if (progress != newProgress) { + if (mShowing && rowVisible) { + // animate! + if (row.anim != null && row.anim.isRunning() + && row.animTargetProgress == newProgress) { + return; // already animating to the target progress + } + // start/update animation + if (row.anim == null) { + row.anim = ObjectAnimator.ofInt(row.slider, "progress", progress, newProgress); + row.anim.setInterpolator(new DecelerateInterpolator()); + } else { + row.anim.cancel(); + row.anim.setIntValues(progress, newProgress); + } + row.animTargetProgress = newProgress; + row.anim.setDuration(UPDATE_ANIMATION_DURATION); + row.anim.start(); + } else { + // update slider directly to clamped value + if (row.anim != null) { + row.anim.cancel(); + } + row.slider.setProgress(newProgress); + } + if (mAutomute) { + if (vlevel == 0 && !row.ss.muted && row.stream == AudioManager.STREAM_MUSIC) { + mController.setStreamMute(row.stream, true); + } + } + } + } + + private void recheckH(VolumeRow row) { + if (row == null) { + if (D.BUG) Log.d(TAG, "recheckH ALL"); + trimObsoleteH(); + for (VolumeRow r : mRows) { + updateVolumeRowH(r); + } + } else { + if (D.BUG) Log.d(TAG, "recheckH " + row.stream); + updateVolumeRowH(row); + } + } + + private void setStreamImportantH(int stream, boolean important) { + for (VolumeRow row : mRows) { + if (row.stream == stream) { + row.important = important; + return; + } + } + } + + private void showSafetyWarningH(int flags) { + if ((flags & (AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_SHOW_UI_WARNINGS)) != 0 + || mShowing) { + synchronized (mSafetyWarningLock) { + if (mSafetyWarning != null) { + return; + } + mSafetyWarning = new SafetyWarningDialog(mContext, mController.getAudioManager()) { + @Override + protected void cleanUp() { + synchronized (mSafetyWarningLock) { + mSafetyWarning = null; + } + recheckH(null); + } + }; + mSafetyWarning.show(); + } + recheckH(null); + } + rescheduleTimeoutH(); + } + + private final VolumeDialogController.Callbacks mControllerCallbackH + = new VolumeDialogController.Callbacks() { + @Override + public void onShowRequested(int reason) { + showH(reason); + } + + @Override + public void onDismissRequested(int reason) { + dismissH(reason); + } + + @Override + public void onScreenOff() { + dismissH(Events.DISMISS_REASON_SCREEN_OFF); + } + + @Override + public void onStateChanged(State state) { + onStateChangedH(state); + } + + @Override + public void onLayoutDirectionChanged(int layoutDirection) { + mDialogView.setLayoutDirection(layoutDirection); + } + + @Override + public void onConfigurationChanged() { + updateWindowWidthH(); + mSpTexts.update(); + } + + @Override + public void onShowVibrateHint() { + if (mSilentMode) { + mController.setRingerMode(AudioManager.RINGER_MODE_SILENT, false); + } + } + + @Override + public void onShowSilentHint() { + if (mSilentMode) { + mController.setRingerMode(AudioManager.RINGER_MODE_NORMAL, false); + } + } + + @Override + public void onShowSafetyWarning(int flags) { + showSafetyWarningH(flags); + } + }; + + private final OnClickListener mClickExpand = new OnClickListener() { + @Override + public void onClick(View v) { + if (mExpanding) return; + final boolean newExpand = !mExpanded; + Events.writeEvent(Events.EVENT_EXPAND, v); + setExpandedH(newExpand); + } + }; + + private final OnClickListener mClickSettings = new OnClickListener() { + @Override + public void onClick(View v) { + mSettingsButton.postDelayed(new Runnable() { + @Override + public void run() { + Events.writeEvent(Events.EVENT_SETTINGS_CLICK); + if (mCallback != null) { + mCallback.onSettingsClicked(); + } + } + }, WAIT_FOR_RIPPLE); + } + }; + + private final View.OnClickListener mTurnOffDnd = new View.OnClickListener() { + @Override + public void onClick(View v) { + mSettingsButton.postDelayed(new Runnable() { + @Override + public void run() { + mController.setZenMode(Global.ZEN_MODE_OFF); + } + }, WAIT_FOR_RIPPLE); + } + }; + + private final ZenFooter.Callback mZenFooterCallback = new ZenFooter.Callback() { + @Override + public void onFooterExpanded() { + mHandler.sendEmptyMessage(H.RESCHEDULE_TIMEOUT); + } + + @Override + public void onSettingsClicked() { + dismiss(Events.DISMISS_REASON_SETTINGS_CLICKED); + if (mCallback != null) { + mCallback.onZenSettingsClicked(); + } + } + + @Override + public void onDoneClicked() { + dismiss(Events.DISMISS_REASON_DONE_CLICKED); + } + + @Override + public void onPrioritySettingsClicked() { + dismiss(Events.DISMISS_REASON_SETTINGS_CLICKED); + if (mCallback != null) { + mCallback.onZenPrioritySettingsClicked(); + } + } + }; + + private final class H extends Handler { + private static final int SHOW = 1; + private static final int DISMISS = 2; + private static final int RECHECK = 3; + private static final int RECHECK_ALL = 4; + private static final int SET_STREAM_IMPORTANT = 5; + private static final int RESCHEDULE_TIMEOUT = 6; + + public H() { + super(Looper.getMainLooper()); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case SHOW: showH(msg.arg1); break; + case DISMISS: dismissH(msg.arg1); break; + case RECHECK: recheckH((VolumeRow) msg.obj); break; + case RECHECK_ALL: recheckH(null); break; + case SET_STREAM_IMPORTANT: setStreamImportantH(msg.arg1, msg.arg2 != 0); break; + case RESCHEDULE_TIMEOUT: rescheduleTimeoutH(); break; + } + } + } + + private final class CustomDialog extends Dialog { + public CustomDialog(Context context) { + super(context); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + rescheduleTimeoutH(); + return super.dispatchTouchEvent(ev); + } + + @Override + protected void onStop() { + super.onStop(); + mHandler.sendEmptyMessage(H.RECHECK_ALL); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (isShowing()) { + if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { + dismissH(Events.DISMISS_REASON_TOUCH_OUTSIDE); + return true; + } + } + return false; + } + } + + private final class VolumeSeekBarChangeListener implements OnSeekBarChangeListener { + private final VolumeRow mRow; + + private VolumeSeekBarChangeListener(VolumeRow row) { + mRow = row; + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (mRow.ss == null) return; + if (D.BUG) Log.d(TAG, AudioSystem.streamToString(mRow.stream) + + " onProgressChanged " + progress + " fromUser=" + fromUser); + if (!fromUser) return; + if (mRow.ss.levelMin > 0) { + final int minProgress = mRow.ss.levelMin * 100; + if (progress < minProgress) { + seekBar.setProgress(minProgress); + } + } + final int userLevel = getImpliedLevel(seekBar, progress); + if (mRow.ss.level != userLevel || mRow.ss.muted && userLevel > 0) { + mRow.userAttempt = SystemClock.uptimeMillis(); + if (mAutomute) { + if (mRow.stream != AudioManager.STREAM_RING) { + if (userLevel > 0 && mRow.ss.muted) { + mController.setStreamMute(mRow.stream, false); + } + if (userLevel == 0 && mRow.ss.muteSupported && !mRow.ss.muted) { + mController.setStreamMute(mRow.stream, true); + } + } + } + if (mRow.requestedLevel != userLevel) { + mController.setStreamVolume(mRow.stream, userLevel); + mRow.requestedLevel = userLevel; + Events.writeEvent(Events.EVENT_TOUCH_LEVEL_CHANGED, mRow.stream, userLevel); + } + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + if (D.BUG) Log.d(TAG, "onStartTrackingTouch"+ " " + mRow.stream); + mController.setActiveStream(mRow.stream); + mRow.tracking = true; + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + if (D.BUG) Log.d(TAG, "onStopTrackingTouch"+ " " + mRow.stream); + mRow.tracking = false; + mRow.userAttempt = SystemClock.uptimeMillis(); + int userLevel = getImpliedLevel(seekBar, seekBar.getProgress()); + if (mRow.ss.level != userLevel) { + mHandler.sendMessageDelayed(mHandler.obtainMessage(H.RECHECK, mRow), + USER_ATTEMPT_GRACE_PERIOD); + } + } + } + + private static class VolumeRow { + private View view; + private View space; + private TextView header; + private ImageButton icon; + private SeekBar slider; + private ImageButton settingsButton; + private int stream; + private StreamState ss; + private long userAttempt; // last user-driven slider change + private boolean tracking; // tracking slider touch + private int requestedLevel; + private int iconRes; + private int iconMuteRes; + private boolean important; + private int cachedIconRes; + private int iconState; // from Events + private boolean cachedShowHeaders = VolumePrefs.DEFAULT_SHOW_HEADERS; + private int cachedExpandButtonRes; + private ObjectAnimator anim; // slider progress animation for non-touch-related updates + private int animTargetProgress; + private int lastAudibleLevel = 1; + } + + public interface Callback { + void onSettingsClicked(); + void onZenSettingsClicked(); + void onZenPrioritySettingsClicked(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java new file mode 100644 index 0000000..86abfcc --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.media.AudioManager; +import android.media.VolumePolicy; +import android.os.Bundle; +import android.os.Handler; +import android.provider.Settings; + +import com.android.systemui.SystemUI; +import com.android.systemui.keyguard.KeyguardViewMediator; +import com.android.systemui.qs.tiles.DndTile; +import com.android.systemui.statusbar.phone.PhoneStatusBar; +import com.android.systemui.statusbar.policy.ZenModeController; + +import java.io.FileDescriptor; +import java.io.PrintWriter; + +/** + * Implementation of VolumeComponent backed by the new volume dialog. + */ +public class VolumeDialogComponent implements VolumeComponent { + private final SystemUI mSysui; + private final Context mContext; + private final VolumeDialogController mController; + private final ZenModeController mZenModeController; + private final VolumeDialog mDialog; + private final VolumePolicy mVolumePolicy = new VolumePolicy( + true, // volumeDownToEnterSilent + true, // volumeUpToExitSilent + true, // doNotDisturbWhenSilent + 400 // vibrateToSilentDebounce + ); + + public VolumeDialogComponent(SystemUI sysui, Context context, Handler handler, + ZenModeController zen) { + mSysui = sysui; + mContext = context; + mController = new VolumeDialogController(context, null) { + @Override + protected void onUserActivityW() { + sendUserActivity(); + } + }; + mZenModeController = zen; + mDialog = new VolumeDialog(context, mController, zen, mVolumeDialogCallback); + applyConfiguration(); + } + + private void sendUserActivity() { + final KeyguardViewMediator kvm = mSysui.getComponent(KeyguardViewMediator.class); + if (kvm != null) { + kvm.userActivity(); + } + } + + private void applyConfiguration() { + mDialog.setStreamImportant(AudioManager.STREAM_ALARM, true); + mDialog.setStreamImportant(AudioManager.STREAM_SYSTEM, false); + mDialog.setShowHeaders(false); + mDialog.setShowFooter(true); + mDialog.setZenFooter(true); + mDialog.setAutomute(true); + mDialog.setSilentMode(false); + mController.setVolumePolicy(mVolumePolicy); + mController.showDndTile(false); + } + + @Override + public ZenModeController getZenController() { + return mZenModeController; + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + // noop + } + + @Override + public void dismissNow() { + mController.dismiss(); + } + + @Override + public void dispatchDemoCommand(String command, Bundle args) { + // noop + } + + @Override + public void register() { + mController.register(); + DndTile.setCombinedIcon(mContext, true); + } + + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + mController.dump(fd, pw, args); + mDialog.dump(pw); + } + + private void startSettings(Intent intent) { + mSysui.getComponent(PhoneStatusBar.class).startActivityDismissingKeyguard(intent, + true /* onlyProvisioned */, true /* dismissShade */); + } + + private final VolumeDialog.Callback mVolumeDialogCallback = new VolumeDialog.Callback() { + @Override + public void onSettingsClicked() { + startSettings(new Intent(Settings.ACTION_NOTIFICATION_SETTINGS)); + } + + @Override + public void onZenSettingsClicked() { + startSettings(ZenModePanel.ZEN_SETTINGS); + } + + @Override + public void onZenPrioritySettingsClicked() { + startSettings(ZenModePanel.ZEN_PRIORITY_SETTINGS); + } + }; + +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java new file mode 100644 index 0000000..012eb41 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java @@ -0,0 +1,997 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.app.NotificationManager; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.database.ContentObserver; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.media.IVolumeController; +import android.media.VolumePolicy; +import android.media.session.MediaController.PlaybackInfo; +import android.media.session.MediaSession.Token; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.RemoteException; +import android.os.Vibrator; +import android.provider.Settings; +import android.service.notification.Condition; +import android.service.notification.ZenModeConfig; +import android.util.Log; +import android.util.SparseArray; + +import com.android.systemui.R; +import com.android.systemui.qs.tiles.DndTile; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * Source of truth for all state / events related to the volume dialog. No presentation. + * + * All work done on a dedicated background worker thread & associated worker. + * + * Methods ending in "W" must be called on the worker thread. + */ +public class VolumeDialogController { + private static final String TAG = Util.logTag(VolumeDialogController.class); + + private static final int DYNAMIC_STREAM_START_INDEX = 100; + private static final int VIBRATE_HINT_DURATION = 50; + + private static final int[] STREAMS = { + AudioSystem.STREAM_ALARM, + AudioSystem.STREAM_BLUETOOTH_SCO, + AudioSystem.STREAM_DTMF, + AudioSystem.STREAM_MUSIC, + AudioSystem.STREAM_NOTIFICATION, + AudioSystem.STREAM_RING, + AudioSystem.STREAM_SYSTEM, + AudioSystem.STREAM_SYSTEM_ENFORCED, + AudioSystem.STREAM_TTS, + AudioSystem.STREAM_VOICE_CALL, + }; + + private final HandlerThread mWorkerThread; + private final W mWorker; + private final Context mContext; + private final AudioManager mAudio; + private final NotificationManager mNoMan; + private final ComponentName mComponent; + private final SettingObserver mObserver; + private final Receiver mReceiver = new Receiver(); + private final MediaSessions mMediaSessions; + private final VC mVolumeController = new VC(); + private final C mCallbacks = new C(); + private final State mState = new State(); + private final String[] mStreamTitles; + private final MediaSessionsCallbacks mMediaSessionsCallbacksW = new MediaSessionsCallbacks(); + private final Vibrator mVibrator; + private final boolean mHasVibrator; + + private boolean mEnabled; + private boolean mDestroyed; + private VolumePolicy mVolumePolicy; + private boolean mShowDndTile = false; + + public VolumeDialogController(Context context, ComponentName component) { + mContext = context.getApplicationContext(); + Events.writeEvent(Events.EVENT_COLLECTION_STARTED); + mComponent = component; + mWorkerThread = new HandlerThread(VolumeDialogController.class.getSimpleName()); + mWorkerThread.start(); + mWorker = new W(mWorkerThread.getLooper()); + mMediaSessions = createMediaSessions(mContext, mWorkerThread.getLooper(), + mMediaSessionsCallbacksW); + mAudio = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); + mNoMan = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + mObserver = new SettingObserver(mWorker); + mObserver.init(); + mReceiver.init(); + mStreamTitles = mContext.getResources().getStringArray(R.array.volume_stream_titles); + mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); + mHasVibrator = mVibrator != null && mVibrator.hasVibrator(); + } + + public AudioManager getAudioManager() { + return mAudio; + } + + public void dismiss() { + mCallbacks.onDismissRequested(Events.DISMISS_REASON_VOLUME_CONTROLLER); + } + + public void register() { + try { + mAudio.setVolumeController(mVolumeController); + } catch (SecurityException e) { + Log.w(TAG, "Unable to set the volume controller", e); + return; + } + setVolumePolicy(mVolumePolicy); + showDndTile(mShowDndTile); + try { + mMediaSessions.init(); + } catch (SecurityException e) { + Log.w(TAG, "No access to media sessions", e); + } + } + + public void setVolumePolicy(VolumePolicy policy) { + mVolumePolicy = policy; + if (mVolumePolicy == null) return; + try { + mAudio.setVolumePolicy(mVolumePolicy); + } catch (NoSuchMethodError e) { + Log.w(TAG, "No volume policy api"); + } + } + + protected MediaSessions createMediaSessions(Context context, Looper looper, + MediaSessions.Callbacks callbacks) { + return new MediaSessions(context, looper, callbacks); + } + + public void destroy() { + if (D.BUG) Log.d(TAG, "destroy"); + if (mDestroyed) return; + mDestroyed = true; + Events.writeEvent(Events.EVENT_COLLECTION_STOPPED); + mMediaSessions.destroy(); + mObserver.destroy(); + mReceiver.destroy(); + mWorkerThread.quitSafely(); + } + + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println(VolumeDialogController.class.getSimpleName() + " state:"); + pw.print(" mEnabled: "); pw.println(mEnabled); + pw.print(" mDestroyed: "); pw.println(mDestroyed); + pw.print(" mVolumePolicy: "); pw.println(mVolumePolicy); + pw.print(" mEnabled: "); pw.println(mEnabled); + pw.print(" mShowDndTile: "); pw.println(mShowDndTile); + pw.print(" mHasVibrator: "); pw.println(mHasVibrator); + pw.print(" mRemoteStreams: "); pw.println(mMediaSessionsCallbacksW.mRemoteStreams + .values()); + pw.println(); + mMediaSessions.dump(pw); + } + + public void addCallback(Callbacks callback, Handler handler) { + mCallbacks.add(callback, handler); + } + + public void removeCallback(Callbacks callback) { + mCallbacks.remove(callback); + } + + public void getState() { + if (mDestroyed) return; + mWorker.sendEmptyMessage(W.GET_STATE); + } + + public void notifyVisible(boolean visible) { + if (mDestroyed) return; + mWorker.obtainMessage(W.NOTIFY_VISIBLE, visible ? 1 : 0, 0).sendToTarget(); + } + + public void userActivity() { + if (mDestroyed) return; + mWorker.removeMessages(W.USER_ACTIVITY); + mWorker.sendEmptyMessage(W.USER_ACTIVITY); + } + + public void setRingerMode(int value, boolean external) { + if (mDestroyed) return; + mWorker.obtainMessage(W.SET_RINGER_MODE, value, external ? 1 : 0).sendToTarget(); + } + + public void setZenMode(int value) { + if (mDestroyed) return; + mWorker.obtainMessage(W.SET_ZEN_MODE, value, 0).sendToTarget(); + } + + public void setExitCondition(Condition condition) { + if (mDestroyed) return; + mWorker.obtainMessage(W.SET_EXIT_CONDITION, condition).sendToTarget(); + } + + public void setStreamMute(int stream, boolean mute) { + if (mDestroyed) return; + mWorker.obtainMessage(W.SET_STREAM_MUTE, stream, mute ? 1 : 0).sendToTarget(); + } + + public void setStreamVolume(int stream, int level) { + if (mDestroyed) return; + mWorker.obtainMessage(W.SET_STREAM_VOLUME, stream, level).sendToTarget(); + } + + public void setActiveStream(int stream) { + if (mDestroyed) return; + mWorker.obtainMessage(W.SET_ACTIVE_STREAM, stream, 0).sendToTarget(); + } + + public void vibrate() { + if (mHasVibrator) { + mVibrator.vibrate(VIBRATE_HINT_DURATION); + } + } + + public boolean hasVibrator() { + return mHasVibrator; + } + + private void onNotifyVisibleW(boolean visible) { + if (mDestroyed) return; + mAudio.notifyVolumeControllerVisible(mVolumeController, visible); + if (!visible) { + if (updateActiveStreamW(-1)) { + mCallbacks.onStateChanged(mState); + } + } + } + + protected void onUserActivityW() { + // hook for subclasses + } + + private void onShowSafetyWarningW(int flags) { + mCallbacks.onShowSafetyWarning(flags); + } + + private boolean checkRoutedToBluetoothW(int stream) { + boolean changed = false; + if (stream == AudioManager.STREAM_MUSIC) { + final boolean routedToBluetooth = + (mAudio.getDevicesForStream(AudioManager.STREAM_MUSIC) & + (AudioManager.DEVICE_OUT_BLUETOOTH_A2DP | + AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | + AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)) != 0; + changed |= updateStreamRoutedToBluetoothW(stream, routedToBluetooth); + } + return changed; + } + + private void onVolumeChangedW(int stream, int flags) { + final boolean showUI = (flags & AudioManager.FLAG_SHOW_UI) != 0; + final boolean fromKey = (flags & AudioManager.FLAG_FROM_KEY) != 0; + final boolean showVibrateHint = (flags & AudioManager.FLAG_SHOW_VIBRATE_HINT) != 0; + final boolean showSilentHint = (flags & AudioManager.FLAG_SHOW_SILENT_HINT) != 0; + boolean changed = false; + if (showUI) { + changed |= updateActiveStreamW(stream); + } + changed |= updateStreamLevelW(stream, mAudio.getLastAudibleStreamVolume(stream)); + changed |= checkRoutedToBluetoothW(showUI ? AudioManager.STREAM_MUSIC : stream); + if (changed) { + mCallbacks.onStateChanged(mState); + } + if (showUI) { + mCallbacks.onShowRequested(Events.SHOW_REASON_VOLUME_CHANGED); + } + if (showVibrateHint) { + mCallbacks.onShowVibrateHint(); + } + if (showSilentHint) { + mCallbacks.onShowSilentHint(); + } + if (changed && fromKey) { + Events.writeEvent(Events.EVENT_KEY); + } + } + + private boolean updateActiveStreamW(int activeStream) { + if (activeStream == mState.activeStream) return false; + mState.activeStream = activeStream; + Events.writeEvent(Events.EVENT_ACTIVE_STREAM_CHANGED, activeStream); + if (D.BUG) Log.d(TAG, "updateActiveStreamW " + activeStream); + final int s = activeStream < DYNAMIC_STREAM_START_INDEX ? activeStream : -1; + if (D.BUG) Log.d(TAG, "forceVolumeControlStream " + s); + mAudio.forceVolumeControlStream(s); + return true; + } + + private StreamState streamStateW(int stream) { + StreamState ss = mState.states.get(stream); + if (ss == null) { + ss = new StreamState(); + mState.states.put(stream, ss); + } + return ss; + } + + private void onGetStateW() { + for (int stream : STREAMS) { + updateStreamLevelW(stream, mAudio.getLastAudibleStreamVolume(stream)); + streamStateW(stream).levelMin = mAudio.getStreamMinVolume(stream); + streamStateW(stream).levelMax = mAudio.getStreamMaxVolume(stream); + updateStreamMuteW(stream, mAudio.isStreamMute(stream)); + final StreamState ss = streamStateW(stream); + ss.muteSupported = mAudio.isStreamAffectedByMute(stream); + ss.name = mStreamTitles[stream]; + checkRoutedToBluetoothW(stream); + } + updateRingerModeExternalW(mAudio.getRingerMode()); + updateZenModeW(); + updateEffectsSuppressorW(mNoMan.getEffectsSuppressor()); + updateExitConditionW(); + mCallbacks.onStateChanged(mState); + } + + private boolean updateStreamRoutedToBluetoothW(int stream, boolean routedToBluetooth) { + final StreamState ss = streamStateW(stream); + if (ss.routedToBluetooth == routedToBluetooth) return false; + ss.routedToBluetooth = routedToBluetooth; + if (D.BUG) Log.d(TAG, "updateStreamRoutedToBluetoothW stream=" + stream + + " routedToBluetooth=" + routedToBluetooth); + return true; + } + + private boolean updateStreamLevelW(int stream, int level) { + final StreamState ss = streamStateW(stream); + if (ss.level == level) return false; + ss.level = level; + if (isLogWorthy(stream)) { + Events.writeEvent(Events.EVENT_LEVEL_CHANGED, stream, level); + } + return true; + } + + private static boolean isLogWorthy(int stream) { + switch (stream) { + case AudioSystem.STREAM_ALARM: + case AudioSystem.STREAM_BLUETOOTH_SCO: + case AudioSystem.STREAM_MUSIC: + case AudioSystem.STREAM_RING: + case AudioSystem.STREAM_SYSTEM: + case AudioSystem.STREAM_VOICE_CALL: + return true; + } + return false; + } + + private boolean updateStreamMuteW(int stream, boolean muted) { + final StreamState ss = streamStateW(stream); + if (ss.muted == muted) return false; + ss.muted = muted; + if (isLogWorthy(stream)) { + Events.writeEvent(Events.EVENT_MUTE_CHANGED, stream, muted); + } + if (muted && isRinger(stream)) { + updateRingerModeInternalW(mAudio.getRingerModeInternal()); + } + return true; + } + + private static boolean isRinger(int stream) { + return stream == AudioManager.STREAM_RING || stream == AudioManager.STREAM_NOTIFICATION; + } + + private Condition getExitCondition() { + final ZenModeConfig config = mNoMan.getZenModeConfig(); + return config == null ? null + : config.manualRule == null ? null + : config.manualRule.condition; + } + + private boolean updateExitConditionW() { + final Condition exitCondition = getExitCondition(); + if (Objects.equals(mState.exitCondition, exitCondition)) return false; + mState.exitCondition = exitCondition; + return true; + } + + private boolean updateEffectsSuppressorW(ComponentName effectsSuppressor) { + if (Objects.equals(mState.effectsSuppressor, effectsSuppressor)) return false; + mState.effectsSuppressor = effectsSuppressor; + mState.effectsSuppressorName = getApplicationName(mContext, mState.effectsSuppressor); + Events.writeEvent(Events.EVENT_SUPPRESSOR_CHANGED, mState.effectsSuppressor, + mState.effectsSuppressorName); + return true; + } + + private static String getApplicationName(Context context, ComponentName component) { + if (component == null) return null; + final PackageManager pm = context.getPackageManager(); + final String pkg = component.getPackageName(); + try { + final ApplicationInfo ai = pm.getApplicationInfo(pkg, 0); + final String rt = Objects.toString(ai.loadLabel(pm), "").trim(); + if (rt.length() > 0) { + return rt; + } + } catch (NameNotFoundException e) {} + return pkg; + } + + private boolean updateZenModeW() { + final int zen = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF); + if (mState.zenMode == zen) return false; + mState.zenMode = zen; + Events.writeEvent(Events.EVENT_ZEN_MODE_CHANGED, zen); + return true; + } + + private boolean updateRingerModeExternalW(int rm) { + if (rm == mState.ringerModeExternal) return false; + mState.ringerModeExternal = rm; + Events.writeEvent(Events.EVENT_EXTERNAL_RINGER_MODE_CHANGED, rm); + return true; + } + + private boolean updateRingerModeInternalW(int rm) { + if (rm == mState.ringerModeInternal) return false; + mState.ringerModeInternal = rm; + Events.writeEvent(Events.EVENT_INTERNAL_RINGER_MODE_CHANGED, rm); + return true; + } + + private void onSetRingerModeW(int mode, boolean external) { + if (external) { + mAudio.setRingerMode(mode); + } else { + mAudio.setRingerModeInternal(mode); + } + } + + private void onSetStreamMuteW(int stream, boolean mute) { + mAudio.adjustStreamVolume(stream, mute ? AudioManager.ADJUST_MUTE + : AudioManager.ADJUST_UNMUTE, 0); + } + + private void onSetStreamVolumeW(int stream, int level) { + if (D.BUG) Log.d(TAG, "onSetStreamVolume " + stream + " level=" + level); + if (stream >= DYNAMIC_STREAM_START_INDEX) { + mMediaSessionsCallbacksW.setStreamVolume(stream, level); + return; + } + mAudio.setStreamVolume(stream, level, 0); + } + + private void onSetActiveStreamW(int stream) { + boolean changed = updateActiveStreamW(stream); + if (changed) { + mCallbacks.onStateChanged(mState); + } + } + + private void onSetExitConditionW(Condition condition) { + mNoMan.setZenMode(mState.zenMode, condition != null ? condition.id : null, TAG); + } + + private void onSetZenModeW(int mode) { + if (D.BUG) Log.d(TAG, "onSetZenModeW " + mode); + mNoMan.setZenMode(mode, null, TAG); + } + + private void onDismissRequestedW(int reason) { + mCallbacks.onDismissRequested(reason); + } + + public void showDndTile(boolean visible) { + if (D.BUG) Log.d(TAG, "showDndTile"); + DndTile.setVisible(mContext, visible); + } + + private final class VC extends IVolumeController.Stub { + private final String TAG = VolumeDialogController.TAG + ".VC"; + + @Override + public void displaySafeVolumeWarning(int flags) throws RemoteException { + if (D.BUG) Log.d(TAG, "displaySafeVolumeWarning " + + Util.audioManagerFlagsToString(flags)); + if (mDestroyed) return; + mWorker.obtainMessage(W.SHOW_SAFETY_WARNING, flags, 0).sendToTarget(); + } + + @Override + public void volumeChanged(int streamType, int flags) throws RemoteException { + if (D.BUG) Log.d(TAG, "volumeChanged " + AudioSystem.streamToString(streamType) + + " " + Util.audioManagerFlagsToString(flags)); + if (mDestroyed) return; + mWorker.obtainMessage(W.VOLUME_CHANGED, streamType, flags).sendToTarget(); + } + + @Override + public void masterMuteChanged(int flags) throws RemoteException { + if (D.BUG) Log.d(TAG, "masterMuteChanged"); + } + + @Override + public void setLayoutDirection(int layoutDirection) throws RemoteException { + if (D.BUG) Log.d(TAG, "setLayoutDirection"); + if (mDestroyed) return; + mWorker.obtainMessage(W.LAYOUT_DIRECTION_CHANGED, layoutDirection, 0).sendToTarget(); + } + + @Override + public void dismiss() throws RemoteException { + if (D.BUG) Log.d(TAG, "dismiss requested"); + if (mDestroyed) return; + mWorker.obtainMessage(W.DISMISS_REQUESTED, Events.DISMISS_REASON_VOLUME_CONTROLLER, 0) + .sendToTarget(); + mWorker.sendEmptyMessage(W.DISMISS_REQUESTED); + } + } + + private final class W extends Handler { + private static final int VOLUME_CHANGED = 1; + private static final int DISMISS_REQUESTED = 2; + private static final int GET_STATE = 3; + private static final int SET_RINGER_MODE = 4; + private static final int SET_ZEN_MODE = 5; + private static final int SET_EXIT_CONDITION = 6; + private static final int SET_STREAM_MUTE = 7; + private static final int LAYOUT_DIRECTION_CHANGED = 8; + private static final int CONFIGURATION_CHANGED = 9; + private static final int SET_STREAM_VOLUME = 10; + private static final int SET_ACTIVE_STREAM = 11; + private static final int NOTIFY_VISIBLE = 12; + private static final int USER_ACTIVITY = 13; + private static final int SHOW_SAFETY_WARNING = 14; + + W(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case VOLUME_CHANGED: onVolumeChangedW(msg.arg1, msg.arg2); break; + case DISMISS_REQUESTED: onDismissRequestedW(msg.arg1); break; + case GET_STATE: onGetStateW(); break; + case SET_RINGER_MODE: onSetRingerModeW(msg.arg1, msg.arg2 != 0); break; + case SET_ZEN_MODE: onSetZenModeW(msg.arg1); break; + case SET_EXIT_CONDITION: onSetExitConditionW((Condition) msg.obj); break; + case SET_STREAM_MUTE: onSetStreamMuteW(msg.arg1, msg.arg2 != 0); break; + case LAYOUT_DIRECTION_CHANGED: mCallbacks.onLayoutDirectionChanged(msg.arg1); break; + case CONFIGURATION_CHANGED: mCallbacks.onConfigurationChanged(); break; + case SET_STREAM_VOLUME: onSetStreamVolumeW(msg.arg1, msg.arg2); break; + case SET_ACTIVE_STREAM: onSetActiveStreamW(msg.arg1); break; + case NOTIFY_VISIBLE: onNotifyVisibleW(msg.arg1 != 0); break; + case USER_ACTIVITY: onUserActivityW(); break; + case SHOW_SAFETY_WARNING: onShowSafetyWarningW(msg.arg1); break; + } + } + } + + private final class C implements Callbacks { + private final HashMap<Callbacks, Handler> mCallbackMap = new HashMap<>(); + + public void add(Callbacks callback, Handler handler) { + if (callback == null || handler == null) throw new IllegalArgumentException(); + mCallbackMap.put(callback, handler); + } + + public void remove(Callbacks callback) { + mCallbackMap.remove(callback); + } + + @Override + public void onShowRequested(final int reason) { + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onShowRequested(reason); + } + }); + } + } + + @Override + public void onDismissRequested(final int reason) { + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onDismissRequested(reason); + } + }); + } + } + + @Override + public void onStateChanged(final State state) { + final long time = System.currentTimeMillis(); + final State copy = state.copy(); + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onStateChanged(copy); + } + }); + } + Events.writeState(time, copy); + } + + @Override + public void onLayoutDirectionChanged(final int layoutDirection) { + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onLayoutDirectionChanged(layoutDirection); + } + }); + } + } + + @Override + public void onConfigurationChanged() { + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onConfigurationChanged(); + } + }); + } + } + + @Override + public void onShowVibrateHint() { + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onShowVibrateHint(); + } + }); + } + } + + @Override + public void onShowSilentHint() { + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onShowSilentHint(); + } + }); + } + } + + @Override + public void onScreenOff() { + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onScreenOff(); + } + }); + } + } + + @Override + public void onShowSafetyWarning(final int flags) { + for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { + entry.getValue().post(new Runnable() { + @Override + public void run() { + entry.getKey().onShowSafetyWarning(flags); + } + }); + } + } + } + + + private final class SettingObserver extends ContentObserver { + private final Uri SERVICE_URI = Settings.Secure.getUriFor( + Settings.Secure.VOLUME_CONTROLLER_SERVICE_COMPONENT); + private final Uri ZEN_MODE_URI = + Settings.Global.getUriFor(Settings.Global.ZEN_MODE); + private final Uri ZEN_MODE_CONFIG_URI = + Settings.Global.getUriFor(Settings.Global.ZEN_MODE_CONFIG_ETAG); + + public SettingObserver(Handler handler) { + super(handler); + } + + public void init() { + mContext.getContentResolver().registerContentObserver(SERVICE_URI, false, this); + mContext.getContentResolver().registerContentObserver(ZEN_MODE_URI, false, this); + mContext.getContentResolver().registerContentObserver(ZEN_MODE_CONFIG_URI, false, this); + onChange(true, SERVICE_URI); + } + + public void destroy() { + mContext.getContentResolver().unregisterContentObserver(this); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + boolean changed = false; + if (SERVICE_URI.equals(uri)) { + final String setting = Settings.Secure.getString(mContext.getContentResolver(), + Settings.Secure.VOLUME_CONTROLLER_SERVICE_COMPONENT); + final boolean enabled = setting != null && mComponent != null + && mComponent.equals(ComponentName.unflattenFromString(setting)); + if (enabled == mEnabled) return; + if (enabled) { + register(); + } + mEnabled = enabled; + } + if (ZEN_MODE_URI.equals(uri)) { + changed = updateZenModeW(); + } + if (ZEN_MODE_CONFIG_URI.equals(uri)) { + changed = updateExitConditionW(); + } + if (changed) { + mCallbacks.onStateChanged(mState); + } + } + } + + private final class Receiver extends BroadcastReceiver { + + public void init() { + final IntentFilter filter = new IntentFilter(); + filter.addAction(AudioManager.VOLUME_CHANGED_ACTION); + filter.addAction(AudioManager.STREAM_DEVICES_CHANGED_ACTION); + filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); + filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION); + filter.addAction(AudioManager.STREAM_MUTE_CHANGED_ACTION); + filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED); + filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + filter.addAction(Intent.ACTION_SCREEN_OFF); + mContext.registerReceiver(this, filter, null, mWorker); + } + + public void destroy() { + mContext.unregisterReceiver(this); + } + + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + boolean changed = false; + if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) { + final int stream = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); + final int level = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); + final int oldLevel = intent + .getIntExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, -1); + if (D.BUG) Log.d(TAG, "onReceive VOLUME_CHANGED_ACTION stream=" + stream + + " level=" + level + " oldLevel=" + oldLevel); + changed = updateStreamLevelW(stream, level); + } else if (action.equals(AudioManager.STREAM_DEVICES_CHANGED_ACTION)) { + final int stream = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); + final int devices = intent + .getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_DEVICES, -1); + final int oldDevices = intent + .getIntExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_DEVICES, -1); + if (D.BUG) Log.d(TAG, "onReceive STREAM_DEVICES_CHANGED_ACTION stream=" + + stream + " devices=" + devices + " oldDevices=" + oldDevices); + changed = checkRoutedToBluetoothW(stream); + } else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) { + final int rm = intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1); + if (D.BUG) Log.d(TAG, "onReceive RINGER_MODE_CHANGED_ACTION rm=" + + Util.ringerModeToString(rm)); + changed = updateRingerModeExternalW(rm); + } else if (action.equals(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)) { + final int rm = intent.getIntExtra(AudioManager.EXTRA_RINGER_MODE, -1); + if (D.BUG) Log.d(TAG, "onReceive INTERNAL_RINGER_MODE_CHANGED_ACTION rm=" + + Util.ringerModeToString(rm)); + changed = updateRingerModeInternalW(rm); + } else if (action.equals(AudioManager.STREAM_MUTE_CHANGED_ACTION)) { + final int stream = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); + final boolean muted = intent + .getBooleanExtra(AudioManager.EXTRA_STREAM_VOLUME_MUTED, false); + if (D.BUG) Log.d(TAG, "onReceive STREAM_MUTE_CHANGED_ACTION stream=" + stream + + " muted=" + muted); + changed = updateStreamMuteW(stream, muted); + } else if (action.equals(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED)) { + if (D.BUG) Log.d(TAG, "onReceive ACTION_EFFECTS_SUPPRESSOR_CHANGED"); + changed = updateEffectsSuppressorW(mNoMan.getEffectsSuppressor()); + } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) { + if (D.BUG) Log.d(TAG, "onReceive ACTION_CONFIGURATION_CHANGED"); + mCallbacks.onConfigurationChanged(); + } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { + if (D.BUG) Log.d(TAG, "onReceive ACTION_SCREEN_OFF"); + mCallbacks.onScreenOff(); + } + if (changed) { + mCallbacks.onStateChanged(mState); + } + } + } + + private final class MediaSessionsCallbacks implements MediaSessions.Callbacks { + private final HashMap<Token, Integer> mRemoteStreams = new HashMap<>(); + + private int mNextStream = DYNAMIC_STREAM_START_INDEX; + + @Override + public void onRemoteUpdate(Token token, String name, PlaybackInfo pi) { + if (!mRemoteStreams.containsKey(token)) { + mRemoteStreams.put(token, mNextStream); + if (D.BUG) Log.d(TAG, "onRemoteUpdate: " + name + " is stream " + mNextStream); + mNextStream++; + } + final int stream = mRemoteStreams.get(token); + boolean changed = mState.states.indexOfKey(stream) < 0; + final StreamState ss = streamStateW(stream); + ss.dynamic = true; + ss.levelMin = 0; + ss.levelMax = pi.getMaxVolume(); + if (ss.level != pi.getCurrentVolume()) { + ss.level = pi.getCurrentVolume(); + changed = true; + } + if (!Objects.equals(ss.name, name)) { + ss.name = name; + changed = true; + } + if (changed) { + if (D.BUG) Log.d(TAG, "onRemoteUpdate: " + name + ": " + ss.level + + " of " + ss.levelMax); + mCallbacks.onStateChanged(mState); + } + } + + @Override + public void onRemoteVolumeChanged(Token token, int flags) { + final int stream = mRemoteStreams.get(token); + final boolean showUI = (flags & AudioManager.FLAG_SHOW_UI) != 0; + boolean changed = updateActiveStreamW(stream); + if (showUI) { + changed |= checkRoutedToBluetoothW(AudioManager.STREAM_MUSIC); + } + if (changed) { + mCallbacks.onStateChanged(mState); + } + if (showUI) { + mCallbacks.onShowRequested(Events.SHOW_REASON_REMOTE_VOLUME_CHANGED); + } + } + + @Override + public void onRemoteRemoved(Token token) { + final int stream = mRemoteStreams.get(token); + mState.states.remove(stream); + if (mState.activeStream == stream) { + updateActiveStreamW(-1); + } + mCallbacks.onStateChanged(mState); + } + + public void setStreamVolume(int stream, int level) { + final Token t = findToken(stream); + if (t == null) { + Log.w(TAG, "setStreamVolume: No token found for stream: " + stream); + return; + } + mMediaSessions.setVolume(t, level); + } + + private Token findToken(int stream) { + for (Map.Entry<Token, Integer> entry : mRemoteStreams.entrySet()) { + if (entry.getValue().equals(stream)) { + return entry.getKey(); + } + } + return null; + } + } + + public static final class StreamState { + public boolean dynamic; + public int level; + public int levelMin; + public int levelMax; + public boolean muted; + public boolean muteSupported; + public String name; + public boolean routedToBluetooth; + + public StreamState copy() { + final StreamState rt = new StreamState(); + rt.dynamic = dynamic; + rt.level = level; + rt.levelMin = levelMin; + rt.levelMax = levelMax; + rt.muted = muted; + rt.muteSupported = muteSupported; + rt.name = name; + rt.routedToBluetooth = routedToBluetooth; + return rt; + } + } + + public static final class State { + public static int NO_ACTIVE_STREAM = -1; + + public final SparseArray<StreamState> states = new SparseArray<StreamState>(); + + public int ringerModeInternal; + public int ringerModeExternal; + public int zenMode; + public ComponentName effectsSuppressor; + public String effectsSuppressorName; + public Condition exitCondition; + public int activeStream = NO_ACTIVE_STREAM; + + public State copy() { + final State rt = new State(); + for (int i = 0; i < states.size(); i++) { + rt.states.put(states.keyAt(i), states.valueAt(i).copy()); + } + rt.ringerModeExternal = ringerModeExternal; + rt.ringerModeInternal = ringerModeInternal; + rt.zenMode = zenMode; + if (effectsSuppressor != null) rt.effectsSuppressor = effectsSuppressor.clone(); + rt.effectsSuppressorName = effectsSuppressorName; + if (exitCondition != null) rt.exitCondition = exitCondition.copy(); + rt.activeStream = activeStream; + return rt; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + for (int i = 0; i < states.size(); i++) { + if (i > 0) sb.append(','); + final int stream = states.keyAt(i); + final StreamState ss = states.valueAt(i); + sb.append(AudioSystem.streamToString(stream)).append(":").append(ss.level) + .append("[").append(ss.levelMin).append("..").append(ss.levelMax); + if (ss.muted) sb.append(" [MUTED]"); + } + sb.append(",ringerModeExternal:").append(ringerModeExternal); + sb.append(",ringerModeInternal:").append(ringerModeInternal); + sb.append(",zenMode:").append(zenMode); + sb.append(",effectsSuppressor:").append(effectsSuppressor); + sb.append(",effectsSuppressorName:").append(effectsSuppressorName); + sb.append(",exitCondition:").append(exitCondition); + sb.append(",activeStream:").append(activeStream); + return sb.append('}').toString(); + } + } + + public interface Callbacks { + void onShowRequested(int reason); + void onDismissRequested(int reason); + void onStateChanged(State state); + void onLayoutDirectionChanged(int layoutDirection); + void onConfigurationChanged(); + void onShowVibrateHint(); + void onShowSilentHint(); + void onScreenOff(); + void onShowSafetyWarning(int flags); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java deleted file mode 100644 index d16b818..0000000 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java +++ /dev/null @@ -1,1597 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.volume; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnDismissListener; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.pm.ServiceInfo; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.PixelFormat; -import android.graphics.drawable.ColorDrawable; -import android.media.AudioAttributes; -import android.media.AudioManager; -import android.media.AudioSystem; -import android.media.RingtoneManager; -import android.media.ToneGenerator; -import android.media.VolumeProvider; -import android.media.session.MediaController; -import android.media.session.MediaController.PlaybackInfo; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Debug; -import android.os.Handler; -import android.os.Message; -import android.os.Vibrator; -import android.util.Log; -import android.util.SparseArray; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.view.WindowManager.LayoutParams; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityManager; -import android.view.animation.AnimationUtils; -import android.view.animation.Interpolator; -import android.widget.ImageView; -import android.widget.SeekBar; -import android.widget.SeekBar.OnSeekBarChangeListener; -import android.widget.TextView; - -import com.android.internal.R; -import com.android.systemui.DemoMode; -import com.android.systemui.statusbar.phone.SystemUIDialog; -import com.android.systemui.statusbar.policy.ZenModeController; - -import java.io.FileDescriptor; -import java.io.PrintWriter; - -/** - * Handles the user interface for the volume keys. - * - * @hide - */ -public class VolumePanel extends Handler implements DemoMode { - private static final String TAG = "VolumePanel"; - private static boolean LOGD = Log.isLoggable(TAG, Log.DEBUG); - - private static final int PLAY_SOUND_DELAY = AudioSystem.PLAY_SOUND_DELAY; - - /** - * The delay before vibrating. This small period exists so if the user is - * moving to silent mode, it will not emit a short vibrate (it normally - * would since vibrate is between normal mode and silent mode using hardware - * keys). - */ - public static final int VIBRATE_DELAY = 300; - - private static final int VIBRATE_DURATION = 300; - private static final int BEEP_DURATION = 150; - private static final int MAX_VOLUME = 100; - private static final int FREE_DELAY = 10000; - private static final int TIMEOUT_DELAY = 3000; - private static final int TIMEOUT_DELAY_SHORT = 1500; - private static final int TIMEOUT_DELAY_COLLAPSED = 4500; - private static final int TIMEOUT_DELAY_SAFETY_WARNING = 5000; - private static final int TIMEOUT_DELAY_EXPANDED = 10000; - - private static final int MSG_VOLUME_CHANGED = 0; - private static final int MSG_FREE_RESOURCES = 1; - private static final int MSG_PLAY_SOUND = 2; - private static final int MSG_STOP_SOUNDS = 3; - private static final int MSG_VIBRATE = 4; - private static final int MSG_TIMEOUT = 5; - private static final int MSG_RINGER_MODE_CHANGED = 6; - private static final int MSG_MUTE_CHANGED = 7; - private static final int MSG_REMOTE_VOLUME_CHANGED = 8; - private static final int MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN = 9; - private static final int MSG_SLIDER_VISIBILITY_CHANGED = 10; - private static final int MSG_DISPLAY_SAFE_VOLUME_WARNING = 11; - private static final int MSG_LAYOUT_DIRECTION = 12; - private static final int MSG_ZEN_MODE_AVAILABLE_CHANGED = 13; - private static final int MSG_USER_ACTIVITY = 14; - private static final int MSG_NOTIFICATION_EFFECTS_SUPPRESSOR_CHANGED = 15; - private static final int MSG_INTERNAL_RINGER_MODE_CHANGED = 16; - - // Pseudo stream type for remote volume - private static final int STREAM_REMOTE_MUSIC = -200; - - private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) - .build(); - - private static final int IC_AUDIO_VOL = com.android.systemui.R.drawable.ic_audio_vol; - private static final int IC_AUDIO_VOL_MUTE = com.android.systemui.R.drawable.ic_audio_vol_mute; - private static final int IC_AUDIO_BT = com.android.systemui.R.drawable.ic_audio_bt; - private static final int IC_AUDIO_BT_MUTE = com.android.systemui.R.drawable.ic_audio_bt_mute; - - private final String mTag; - protected final Context mContext; - private final AudioManager mAudioManager; - private final ZenModeController mZenController; - private boolean mRingIsSilent; - private boolean mVoiceCapable; - private boolean mZenModeAvailable; - private boolean mZenPanelExpanded; - private int mTimeoutDelay = TIMEOUT_DELAY; - private float mDisabledAlpha; - private int mLastRingerMode = AudioManager.RINGER_MODE_NORMAL; - private int mLastRingerProgress = 0; - private int mDemoIcon; - - /** Volume panel content view */ - private final View mView; - /** Dialog hosting the panel */ - private final Dialog mDialog; - - /** The visible portion of the volume overlay */ - private final ViewGroup mPanel; - /** Contains the slider and its touchable icons */ - private final ViewGroup mSliderPanel; - /** The zen mode configuration panel view */ - private ZenModePanel mZenPanel; - /** The component currently suppressing notification stream effects */ - private ComponentName mNotificationEffectsSuppressor; - - private Callback mCallback; - - /** Currently active stream that shows up at the top of the list of sliders */ - private int mActiveStreamType = -1; - /** All the slider controls mapped by stream type */ - private SparseArray<StreamControl> mStreamControls; - private final AccessibilityManager mAccessibilityManager; - private final SecondaryIconTransition mSecondaryIconTransition; - private final IconPulser mIconPulser; - - private enum StreamResources { - BluetoothSCOStream(AudioManager.STREAM_BLUETOOTH_SCO, - R.string.volume_icon_description_bluetooth, - IC_AUDIO_BT, - IC_AUDIO_BT_MUTE, - false), - RingerStream(AudioManager.STREAM_RING, - R.string.volume_icon_description_ringer, - com.android.systemui.R.drawable.ic_ringer_audible, - com.android.systemui.R.drawable.ic_ringer_mute, - false), - VoiceStream(AudioManager.STREAM_VOICE_CALL, - R.string.volume_icon_description_incall, - com.android.systemui.R.drawable.ic_audio_phone, - com.android.systemui.R.drawable.ic_audio_phone, - false), - AlarmStream(AudioManager.STREAM_ALARM, - R.string.volume_alarm, - com.android.systemui.R.drawable.ic_audio_alarm, - com.android.systemui.R.drawable.ic_audio_alarm_mute, - false), - MediaStream(AudioManager.STREAM_MUSIC, - R.string.volume_icon_description_media, - IC_AUDIO_VOL, - IC_AUDIO_VOL_MUTE, - true), - NotificationStream(AudioManager.STREAM_NOTIFICATION, - R.string.volume_icon_description_notification, - com.android.systemui.R.drawable.ic_ringer_audible, - com.android.systemui.R.drawable.ic_ringer_mute, - true), - RemoteStream(STREAM_REMOTE_MUSIC, - R.string.volume_icon_description_media, //FIXME should have its own description - com.android.systemui.R.drawable.ic_audio_remote, - com.android.systemui.R.drawable.ic_audio_remote, - false);// will be dynamically updated - - int streamType; - int descRes; - int iconRes; - int iconMuteRes; - // RING, VOICE_CALL & BLUETOOTH_SCO are hidden unless explicitly requested - boolean show; - - StreamResources(int streamType, int descRes, int iconRes, int iconMuteRes, boolean show) { - this.streamType = streamType; - this.descRes = descRes; - this.iconRes = iconRes; - this.iconMuteRes = iconMuteRes; - this.show = show; - } - } - - // List of stream types and their order - private static final StreamResources[] STREAMS = { - StreamResources.BluetoothSCOStream, - StreamResources.RingerStream, - StreamResources.VoiceStream, - StreamResources.MediaStream, - StreamResources.NotificationStream, - StreamResources.AlarmStream, - StreamResources.RemoteStream - }; - - /** Object that contains data for each slider */ - private class StreamControl { - int streamType; - MediaController controller; - ViewGroup group; - ImageView icon; - SeekBar seekbarView; - TextView suppressorView; - View divider; - ImageView secondaryIcon; - int iconRes; - int iconMuteRes; - int iconSuppressedRes; - int minVolume; - } - - // Synchronize when accessing this - private ToneGenerator mToneGenerators[]; - private Vibrator mVibrator; - private boolean mHasVibrator; - - private static AlertDialog sSafetyWarning; - private static Object sSafetyWarningLock = new Object(); - - private static class SafetyWarning extends SystemUIDialog - implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener { - private final Context mContext; - private final VolumePanel mVolumePanel; - private final AudioManager mAudioManager; - - private boolean mNewVolumeUp; - - SafetyWarning(Context context, VolumePanel volumePanel, AudioManager audioManager) { - super(context); - mContext = context; - mVolumePanel = volumePanel; - mAudioManager = audioManager; - - setMessage(mContext.getString(com.android.internal.R.string.safe_media_volume_warning)); - setButton(DialogInterface.BUTTON_POSITIVE, - mContext.getString(com.android.internal.R.string.yes), this); - setButton(DialogInterface.BUTTON_NEGATIVE, - mContext.getString(com.android.internal.R.string.no), (OnClickListener) null); - setOnDismissListener(this); - - IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); - context.registerReceiver(mReceiver, filter); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getRepeatCount() == 0) { - mNewVolumeUp = true; - } - return super.onKeyDown(keyCode, event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mNewVolumeUp) { - if (LOGD) Log.d(TAG, "Confirmed warning via VOLUME_UP"); - mAudioManager.disableSafeMediaVolume(); - dismiss(); - } - return super.onKeyUp(keyCode, event); - } - - @Override - public void onClick(DialogInterface dialog, int which) { - mAudioManager.disableSafeMediaVolume(); - } - - @Override - public void onDismiss(DialogInterface unused) { - mContext.unregisterReceiver(mReceiver); - cleanUp(); - } - - private void cleanUp() { - synchronized (sSafetyWarningLock) { - sSafetyWarning = null; - } - mVolumePanel.forceTimeout(0); - mVolumePanel.updateStates(); - } - - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { - if (LOGD) Log.d(TAG, "Received ACTION_CLOSE_SYSTEM_DIALOGS"); - cancel(); - cleanUp(); - } - } - }; - } - - protected LayoutParams getDialogLayoutParams(Window window, Resources res) { - final LayoutParams lp = window.getAttributes(); - lp.token = null; - lp.y = res.getDimensionPixelOffset(com.android.systemui.R.dimen.volume_panel_top); - lp.type = LayoutParams.TYPE_STATUS_BAR_PANEL; - lp.format = PixelFormat.TRANSLUCENT; - lp.windowAnimations = com.android.systemui.R.style.VolumePanelAnimation; - lp.setTitle(TAG); - return lp; - } - - public VolumePanel(Context context, ZenModeController zenController) { - mTag = String.format("%s.%08x", TAG, hashCode()); - mContext = context; - mZenController = zenController; - mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - mAccessibilityManager = (AccessibilityManager) context.getSystemService( - Context.ACCESSIBILITY_SERVICE); - mSecondaryIconTransition = new SecondaryIconTransition(); - mIconPulser = new IconPulser(context); - - if (LOGD) Log.d(mTag, "new VolumePanel"); - - mDisabledAlpha = 0.5f; - if (mContext.getTheme() != null) { - final TypedArray arr = mContext.getTheme().obtainStyledAttributes( - new int[] { android.R.attr.disabledAlpha }); - mDisabledAlpha = arr.getFloat(0, mDisabledAlpha); - arr.recycle(); - } - - mDialog = new Dialog(context) { - @Override - public boolean onTouchEvent(MotionEvent event) { - if (isShowing() && event.getAction() == MotionEvent.ACTION_OUTSIDE && - sSafetyWarning == null) { - forceTimeout(0); - return true; - } - return false; - } - }; - - final Window window = mDialog.getWindow(); - window.requestFeature(Window.FEATURE_NO_TITLE); - mDialog.setCanceledOnTouchOutside(true); - mDialog.setContentView(com.android.systemui.R.layout.volume_dialog); - mDialog.setOnDismissListener(new OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - mActiveStreamType = -1; - mAudioManager.forceVolumeControlStream(mActiveStreamType); - setZenPanelVisible(false); - mDemoIcon = 0; - mSecondaryIconTransition.cancel(); - } - }); - - mDialog.create(); - - final Resources res = context.getResources(); - window.setAttributes(getDialogLayoutParams(window, res)); - - updateWidth(); - - window.setBackgroundDrawable(new ColorDrawable(0x00000000)); - window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); - window.addFlags(LayoutParams.FLAG_NOT_FOCUSABLE - | LayoutParams.FLAG_NOT_TOUCH_MODAL - | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH - | LayoutParams.FLAG_HARDWARE_ACCELERATED); - mView = window.findViewById(R.id.content); - Interaction.register(mView, new Interaction.Callback() { - @Override - public void onInteraction() { - resetTimeout(); - } - }); - - mPanel = (ViewGroup) mView.findViewById(com.android.systemui.R.id.visible_panel); - mSliderPanel = (ViewGroup) mView.findViewById(com.android.systemui.R.id.slider_panel); - mZenPanel = (ZenModePanel) mView.findViewById(com.android.systemui.R.id.zen_mode_panel); - initZenModePanel(); - - mToneGenerators = new ToneGenerator[AudioSystem.getNumStreamTypes()]; - mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - mHasVibrator = mVibrator != null && mVibrator.hasVibrator(); - mVoiceCapable = context.getResources().getBoolean(R.bool.config_voice_capable); - - if (mZenController != null) { - mZenModeAvailable = mZenController.isZenAvailable(); - mNotificationEffectsSuppressor = mZenController.getEffectsSuppressor(); - mZenController.addCallback(mZenCallback); - } - - registerReceiver(); - } - - public void onConfigurationChanged(Configuration newConfig) { - updateWidth(); - if (mZenPanel != null) { - mZenPanel.updateLocale(); - } - } - - private void updateWidth() { - final Resources res = mContext.getResources(); - final LayoutParams lp = mDialog.getWindow().getAttributes(); - lp.width = res.getDimensionPixelSize(com.android.systemui.R.dimen.notification_panel_width); - lp.gravity = - res.getInteger(com.android.systemui.R.integer.notification_panel_layout_gravity); - mDialog.getWindow().setAttributes(lp); - } - - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println("VolumePanel state:"); - pw.print(" mTag="); pw.println(mTag); - pw.print(" mRingIsSilent="); pw.println(mRingIsSilent); - pw.print(" mVoiceCapable="); pw.println(mVoiceCapable); - pw.print(" mHasVibrator="); pw.println(mHasVibrator); - pw.print(" mZenModeAvailable="); pw.println(mZenModeAvailable); - pw.print(" mZenPanelExpanded="); pw.println(mZenPanelExpanded); - pw.print(" mNotificationEffectsSuppressor="); pw.println(mNotificationEffectsSuppressor); - pw.print(" mTimeoutDelay="); pw.println(mTimeoutDelay); - pw.print(" mDisabledAlpha="); pw.println(mDisabledAlpha); - pw.print(" mLastRingerMode="); pw.println(mLastRingerMode); - pw.print(" mLastRingerProgress="); pw.println(mLastRingerProgress); - pw.print(" isShowing()="); pw.println(isShowing()); - pw.print(" mCallback="); pw.println(mCallback); - pw.print(" sConfirmSafeVolumeDialog="); - pw.println(sSafetyWarning != null ? "<not null>" : null); - pw.print(" mActiveStreamType="); pw.println(mActiveStreamType); - pw.print(" mStreamControls="); - if (mStreamControls == null) { - pw.println("null"); - } else { - final int N = mStreamControls.size(); - pw.print("<size "); pw.print(N); pw.println('>'); - for (int i = 0; i < N; i++) { - final StreamControl sc = mStreamControls.valueAt(i); - pw.print(" stream "); pw.print(sc.streamType); pw.print(":"); - if (sc.seekbarView != null) { - pw.print(" progress="); pw.print(sc.seekbarView.getProgress()); - pw.print(" of "); pw.print(sc.seekbarView.getMax()); - if (!sc.seekbarView.isEnabled()) pw.print(" (disabled)"); - } - if (sc.icon != null && sc.icon.isClickable()) pw.print(" (clickable)"); - pw.println(); - } - } - if (mZenPanel != null) { - mZenPanel.dump(fd, pw, args); - } - } - - private void initZenModePanel() { - mZenPanel.init(mZenController); - mZenPanel.setCallback(new ZenModePanel.Callback() { - @Override - public void onMoreSettings() { - if (mCallback != null) { - mCallback.onZenSettings(); - } - } - - @Override - public void onInteraction() { - resetTimeout(); - } - - @Override - public void onExpanded(boolean expanded) { - if (mZenPanelExpanded == expanded) return; - mZenPanelExpanded = expanded; - updateTimeoutDelay(); - resetTimeout(); - } - }); - } - - private void setLayoutDirection(int layoutDirection) { - mPanel.setLayoutDirection(layoutDirection); - updateStates(); - } - - private void registerReceiver() { - final IntentFilter filter = new IntentFilter(); - filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); - filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION); - filter.addAction(Intent.ACTION_SCREEN_OFF); - mContext.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - - if (AudioManager.RINGER_MODE_CHANGED_ACTION.equals(action)) { - removeMessages(MSG_RINGER_MODE_CHANGED); - sendEmptyMessage(MSG_RINGER_MODE_CHANGED); - } - - if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) { - removeMessages(MSG_INTERNAL_RINGER_MODE_CHANGED); - sendEmptyMessage(MSG_INTERNAL_RINGER_MODE_CHANGED); - } - - if (Intent.ACTION_SCREEN_OFF.equals(action)) { - postDismiss(0); - } - } - }, filter); - } - - private boolean isMuted(int streamType) { - if (streamType == STREAM_REMOTE_MUSIC) { - // TODO do we need to support a distinct mute property for remote? - return false; - } else { - return mAudioManager.isStreamMute(streamType); - } - } - - private int getStreamMinVolume(int streamType) { - if (streamType == STREAM_REMOTE_MUSIC) { - return 0; - } else { - return mAudioManager.getStreamMinVolume(streamType); - } - } - - private int getStreamMaxVolume(int streamType) { - if (streamType == STREAM_REMOTE_MUSIC) { - if (mStreamControls != null) { - StreamControl sc = mStreamControls.get(streamType); - if (sc != null && sc.controller != null) { - PlaybackInfo ai = sc.controller.getPlaybackInfo(); - return ai.getMaxVolume(); - } - } - return -1; - } else { - return mAudioManager.getStreamMaxVolume(streamType); - } - } - - private int getStreamVolume(int streamType) { - if (streamType == STREAM_REMOTE_MUSIC) { - if (mStreamControls != null) { - StreamControl sc = mStreamControls.get(streamType); - if (sc != null && sc.controller != null) { - PlaybackInfo ai = sc.controller.getPlaybackInfo(); - return ai.getCurrentVolume(); - } - } - return -1; - } else { - return mAudioManager.getLastAudibleStreamVolume(streamType); - } - } - - private void setStreamVolume(StreamControl sc, int index, int flags) { - if (sc.streamType == STREAM_REMOTE_MUSIC) { - if (sc.controller != null) { - sc.controller.setVolumeTo(index, flags); - } else { - Log.w(mTag, "Adjusting remote volume without a controller!"); - } - } else if (getStreamVolume(sc.streamType) != index) { - mAudioManager.setStreamVolume(sc.streamType, index, flags); - } - } - - private void createSliders() { - final Resources res = mContext.getResources(); - final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - - mStreamControls = new SparseArray<StreamControl>(STREAMS.length); - - final StreamResources notificationStream = StreamResources.NotificationStream; - for (int i = 0; i < STREAMS.length; i++) { - StreamResources streamRes = STREAMS[i]; - - final int streamType = streamRes.streamType; - final boolean isNotification = isNotificationOrRing(streamType); - - final StreamControl sc = new StreamControl(); - sc.streamType = streamType; - sc.group = (ViewGroup) inflater.inflate( - com.android.systemui.R.layout.volume_panel_item, null); - sc.group.setTag(sc); - sc.icon = (ImageView) sc.group.findViewById(com.android.systemui.R.id.stream_icon); - sc.icon.setTag(sc); - sc.icon.setContentDescription(res.getString(streamRes.descRes)); - sc.iconRes = streamRes.iconRes; - sc.iconMuteRes = streamRes.iconMuteRes; - sc.icon.setImageResource(sc.iconRes); - sc.icon.setClickable(isNotification && mHasVibrator); - if (isNotification) { - if (mHasVibrator) { - sc.icon.setSoundEffectsEnabled(false); - sc.iconMuteRes = com.android.systemui.R.drawable.ic_ringer_vibrate; - sc.icon.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - resetTimeout(); - toggleRinger(sc); - } - }); - } - sc.iconSuppressedRes = com.android.systemui.R.drawable.ic_ringer_mute; - } - sc.seekbarView = (SeekBar) sc.group.findViewById(com.android.systemui.R.id.seekbar); - sc.suppressorView = - (TextView) sc.group.findViewById(com.android.systemui.R.id.suppressor); - sc.suppressorView.setVisibility(View.GONE); - final boolean showSecondary = !isNotification && notificationStream.show; - sc.divider = sc.group.findViewById(com.android.systemui.R.id.divider); - sc.secondaryIcon = (ImageView) sc.group - .findViewById(com.android.systemui.R.id.secondary_icon); - sc.secondaryIcon.setImageResource(com.android.systemui.R.drawable.ic_ringer_audible); - sc.secondaryIcon.setContentDescription(res.getString(notificationStream.descRes)); - sc.secondaryIcon.setClickable(showSecondary); - sc.divider.setVisibility(showSecondary ? View.VISIBLE : View.GONE); - sc.secondaryIcon.setVisibility(showSecondary ? View.VISIBLE : View.GONE); - if (showSecondary) { - sc.secondaryIcon.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - mSecondaryIconTransition.start(sc); - } - }); - } - sc.minVolume = getStreamMinVolume(streamType); - sc.seekbarView.setMax(getStreamMaxVolume(streamType) - sc.minVolume); - sc.seekbarView.setOnSeekBarChangeListener(mSeekListener); - sc.seekbarView.setTag(sc); - mStreamControls.put(streamType, sc); - } - } - - private void toggleRinger(StreamControl sc) { - if (!mHasVibrator) return; - if (mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_NORMAL) { - mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_VIBRATE); - postVolumeChanged(sc.streamType, AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE); - } else { - mAudioManager.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL); - postVolumeChanged(sc.streamType, AudioManager.FLAG_PLAY_SOUND); - } - } - - private void reorderSliders(int activeStreamType) { - mSliderPanel.removeAllViews(); - - final StreamControl active = mStreamControls.get(activeStreamType); - if (active == null) { - Log.e(TAG, "Missing stream type! - " + activeStreamType); - mActiveStreamType = -1; - } else { - mSliderPanel.addView(active.group); - mActiveStreamType = activeStreamType; - active.group.setVisibility(View.VISIBLE); - updateSlider(active, true /*forceReloadIcon*/); - updateTimeoutDelay(); - updateZenPanelVisible(); - } - } - - private void updateSliderProgress(StreamControl sc, int progress) { - final boolean isRinger = isNotificationOrRing(sc.streamType); - if (isRinger && mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) { - progress = mLastRingerProgress; - } - if (progress < 0) { - progress = getStreamVolume(sc.streamType); - } - sc.seekbarView.setProgress(progress - sc.minVolume); - if (isRinger) { - mLastRingerProgress = progress; - } - } - - private void updateSliderIcon(StreamControl sc, boolean muted) { - ComponentName suppressor = null; - if (isNotificationOrRing(sc.streamType)) { - suppressor = mNotificationEffectsSuppressor; - int ringerMode = mAudioManager.getRingerModeInternal(); - if (ringerMode == AudioManager.RINGER_MODE_SILENT) { - ringerMode = mLastRingerMode; - } else { - mLastRingerMode = ringerMode; - } - if (mHasVibrator) { - muted = ringerMode == AudioManager.RINGER_MODE_VIBRATE; - } else { - muted = false; - } - } - sc.icon.setImageResource(mDemoIcon != 0 ? mDemoIcon - : suppressor != null ? sc.iconSuppressedRes - : muted ? sc.iconMuteRes - : sc.iconRes); - } - - private void updateSliderSuppressor(StreamControl sc) { - final ComponentName suppressor = isNotificationOrRing(sc.streamType) - ? mNotificationEffectsSuppressor : null; - if (suppressor == null) { - sc.seekbarView.setVisibility(View.VISIBLE); - sc.suppressorView.setVisibility(View.GONE); - } else { - sc.seekbarView.setVisibility(View.GONE); - sc.suppressorView.setVisibility(View.VISIBLE); - sc.suppressorView.setText(mContext.getString(R.string.muted_by, - getSuppressorCaption(suppressor))); - } - } - - private String getSuppressorCaption(ComponentName suppressor) { - final PackageManager pm = mContext.getPackageManager(); - try { - final ServiceInfo info = pm.getServiceInfo(suppressor, 0); - if (info != null) { - final CharSequence seq = info.loadLabel(pm); - if (seq != null) { - final String str = seq.toString().trim(); - if (str.length() > 0) { - return str; - } - } - } - } catch (Throwable e) { - Log.w(TAG, "Error loading suppressor caption", e); - } - return suppressor.getPackageName(); - } - - /** Update the mute and progress state of a slider */ - private void updateSlider(StreamControl sc, boolean forceReloadIcon) { - updateSliderProgress(sc, -1); - final boolean muted = isMuted(sc.streamType); - if (forceReloadIcon) { - sc.icon.setImageDrawable(null); - } - updateSliderIcon(sc, muted); - updateSliderEnabled(sc, muted, false); - updateSliderSuppressor(sc); - } - - private void updateSliderEnabled(final StreamControl sc, boolean muted, boolean fixedVolume) { - final boolean wasEnabled = sc.seekbarView.isEnabled(); - final boolean isRinger = isNotificationOrRing(sc.streamType); - if (sc.streamType == STREAM_REMOTE_MUSIC) { - // never disable touch interactions for remote playback, the muting is not tied to - // the state of the phone. - sc.seekbarView.setEnabled(!fixedVolume); - } else if (isRinger && mNotificationEffectsSuppressor != null) { - sc.icon.setEnabled(true); - sc.icon.setAlpha(1f); - sc.icon.setClickable(false); - } else if (isRinger - && mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) { - sc.seekbarView.setEnabled(false); - sc.icon.setEnabled(false); - sc.icon.setAlpha(mDisabledAlpha); - sc.icon.setClickable(false); - } else if (fixedVolume || - (sc.streamType != mAudioManager.getUiSoundsStreamType() && !isRinger && muted) || - (sSafetyWarning != null)) { - sc.seekbarView.setEnabled(false); - } else { - sc.seekbarView.setEnabled(true); - sc.icon.setEnabled(true); - sc.icon.setAlpha(1f); - } - // show the silent hint when the disabled slider is touched in silent mode - if (isRinger && wasEnabled != sc.seekbarView.isEnabled()) { - if (sc.seekbarView.isEnabled()) { - sc.group.setOnTouchListener(null); - sc.icon.setClickable(mHasVibrator); - } else { - final View.OnTouchListener showHintOnTouch = new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - resetTimeout(); - showSilentHint(); - return false; - } - }; - sc.group.setOnTouchListener(showHintOnTouch); - } - } - } - - private void showSilentHint() { - if (mZenPanel != null) { - mZenPanel.showSilentHint(); - } - } - - private void showVibrateHint() { - final StreamControl active = mStreamControls.get(mActiveStreamType); - if (active != null) { - mIconPulser.start(active.icon); - if (!hasMessages(MSG_VIBRATE)) { - sendEmptyMessageDelayed(MSG_VIBRATE, VIBRATE_DELAY); - } - } - } - - private static boolean isNotificationOrRing(int streamType) { - return streamType == AudioManager.STREAM_RING - || streamType == AudioManager.STREAM_NOTIFICATION; - } - - public void setCallback(Callback callback) { - mCallback = callback; - } - - private void updateTimeoutDelay() { - mTimeoutDelay = mDemoIcon != 0 ? TIMEOUT_DELAY_EXPANDED - : sSafetyWarning != null ? TIMEOUT_DELAY_SAFETY_WARNING - : mActiveStreamType == AudioManager.STREAM_MUSIC ? TIMEOUT_DELAY_SHORT - : mZenPanelExpanded ? TIMEOUT_DELAY_EXPANDED - : isZenPanelVisible() ? TIMEOUT_DELAY_COLLAPSED - : TIMEOUT_DELAY; - } - - private boolean isZenPanelVisible() { - return mZenPanel != null && mZenPanel.getVisibility() == View.VISIBLE; - } - - private void setZenPanelVisible(boolean visible) { - if (LOGD) Log.d(mTag, "setZenPanelVisible " + visible + " mZenPanel=" + mZenPanel); - final boolean changing = visible != isZenPanelVisible(); - if (visible) { - mZenPanel.setHidden(false); - resetTimeout(); - } else { - mZenPanel.setHidden(true); - } - if (changing) { - updateTimeoutDelay(); - resetTimeout(); - } - } - - private void updateStates() { - final int count = mSliderPanel.getChildCount(); - for (int i = 0; i < count; i++) { - StreamControl sc = (StreamControl) mSliderPanel.getChildAt(i).getTag(); - updateSlider(sc, true /*forceReloadIcon*/); - } - } - - private void updateActiveSlider() { - final StreamControl active = mStreamControls.get(mActiveStreamType); - if (active != null) { - updateSlider(active, false /*forceReloadIcon*/); - } - } - - private void updateZenPanelVisible() { - setZenPanelVisible(mZenModeAvailable && isNotificationOrRing(mActiveStreamType)); - } - - public void postVolumeChanged(int streamType, int flags) { - if (hasMessages(MSG_VOLUME_CHANGED)) return; - synchronized (this) { - if (mStreamControls == null) { - createSliders(); - } - } - removeMessages(MSG_FREE_RESOURCES); - obtainMessage(MSG_VOLUME_CHANGED, streamType, flags).sendToTarget(); - } - - public void postRemoteVolumeChanged(MediaController controller, int flags) { - if (hasMessages(MSG_REMOTE_VOLUME_CHANGED)) return; - synchronized (this) { - if (mStreamControls == null) { - createSliders(); - } - } - removeMessages(MSG_FREE_RESOURCES); - obtainMessage(MSG_REMOTE_VOLUME_CHANGED, flags, 0, controller).sendToTarget(); - } - - public void postRemoteSliderVisibility(boolean visible) { - obtainMessage(MSG_SLIDER_VISIBILITY_CHANGED, - STREAM_REMOTE_MUSIC, visible ? 1 : 0).sendToTarget(); - } - - /** - * Called by AudioService when it has received new remote playback information that - * would affect the VolumePanel display (mainly volumes). The difference with - * {@link #postRemoteVolumeChanged(int, int)} is that the handling of the posted message - * (MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN) will only update the volume slider if it is being - * displayed. - * This special code path is due to the fact that remote volume updates arrive to AudioService - * asynchronously. So after AudioService has sent the volume update (which should be treated - * as a request to update the volume), the application will likely set a new volume. If the UI - * is still up, we need to refresh the display to show this new value. - */ - public void postHasNewRemotePlaybackInfo() { - if (hasMessages(MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN)) return; - // don't create or prevent resources to be freed, if they disappear, this update came too - // late and shouldn't warrant the panel to be displayed longer - obtainMessage(MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN).sendToTarget(); - } - - public void postMuteChanged(int streamType, int flags) { - if (hasMessages(MSG_VOLUME_CHANGED)) return; - synchronized (this) { - if (mStreamControls == null) { - createSliders(); - } - } - removeMessages(MSG_FREE_RESOURCES); - obtainMessage(MSG_MUTE_CHANGED, streamType, flags).sendToTarget(); - } - - public void postDisplaySafeVolumeWarning(int flags) { - if (hasMessages(MSG_DISPLAY_SAFE_VOLUME_WARNING)) return; - obtainMessage(MSG_DISPLAY_SAFE_VOLUME_WARNING, flags, 0).sendToTarget(); - } - - public void postDismiss(long delay) { - forceTimeout(delay); - } - - public void postLayoutDirection(int layoutDirection) { - removeMessages(MSG_LAYOUT_DIRECTION); - obtainMessage(MSG_LAYOUT_DIRECTION, layoutDirection, 0).sendToTarget(); - } - - private static String flagsToString(int flags) { - return flags == 0 ? "0" : (flags + "=" + AudioManager.flagsToString(flags)); - } - - private static String streamToString(int stream) { - return AudioSystem.streamToString(stream); - } - - /** - * Override this if you have other work to do when the volume changes (for - * example, vibrating, playing a sound, etc.). Make sure to call through to - * the superclass implementation. - */ - protected void onVolumeChanged(int streamType, int flags) { - - if (LOGD) Log.d(mTag, "onVolumeChanged(streamType: " + streamToString(streamType) - + ", flags: " + flagsToString(flags) + ")"); - - if ((flags & AudioManager.FLAG_SHOW_UI) != 0) { - synchronized (this) { - if (mActiveStreamType != streamType) { - reorderSliders(streamType); - } - onShowVolumeChanged(streamType, flags, null); - } - } - - if ((flags & AudioManager.FLAG_PLAY_SOUND) != 0 && ! mRingIsSilent) { - removeMessages(MSG_PLAY_SOUND); - sendMessageDelayed(obtainMessage(MSG_PLAY_SOUND, streamType, flags), PLAY_SOUND_DELAY); - } - - if ((flags & AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE) != 0) { - removeMessages(MSG_PLAY_SOUND); - removeMessages(MSG_VIBRATE); - onStopSounds(); - } - - removeMessages(MSG_FREE_RESOURCES); - sendMessageDelayed(obtainMessage(MSG_FREE_RESOURCES), FREE_DELAY); - resetTimeout(); - } - - protected void onMuteChanged(int streamType, int flags) { - - if (LOGD) Log.d(mTag, "onMuteChanged(streamType: " + streamToString(streamType) - + ", flags: " + flagsToString(flags) + ")"); - - StreamControl sc = mStreamControls.get(streamType); - if (sc != null) { - updateSliderIcon(sc, isMuted(sc.streamType)); - } - - onVolumeChanged(streamType, flags); - } - - protected void onShowVolumeChanged(int streamType, int flags, MediaController controller) { - int index = getStreamVolume(streamType); - - mRingIsSilent = false; - - if (LOGD) { - Log.d(mTag, "onShowVolumeChanged(streamType: " + streamToString(streamType) - + ", flags: " + flagsToString(flags) + "), index: " + index); - } - - // get max volume for progress bar - - int max = getStreamMaxVolume(streamType) - getStreamMinVolume(streamType); - StreamControl sc = mStreamControls.get(streamType); - - switch (streamType) { - - case AudioManager.STREAM_RING: { - Uri ringuri = RingtoneManager.getActualDefaultRingtoneUri( - mContext, RingtoneManager.TYPE_RINGTONE); - if (ringuri == null) { - mRingIsSilent = true; - } - break; - } - - case AudioManager.STREAM_MUSIC: { - // Special case for when Bluetooth is active for music - if ((mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC) & - (AudioManager.DEVICE_OUT_BLUETOOTH_A2DP | - AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES | - AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)) != 0) { - setMusicIcon(IC_AUDIO_BT, IC_AUDIO_BT_MUTE); - } else { - setMusicIcon(IC_AUDIO_VOL, IC_AUDIO_VOL_MUTE); - } - break; - } - - case AudioManager.STREAM_ALARM: { - break; - } - - case AudioManager.STREAM_NOTIFICATION: { - Uri ringuri = RingtoneManager.getActualDefaultRingtoneUri( - mContext, RingtoneManager.TYPE_NOTIFICATION); - if (ringuri == null) { - mRingIsSilent = true; - } - break; - } - - case STREAM_REMOTE_MUSIC: { - if (controller == null && sc != null) { - // If we weren't passed one try using the last one set. - controller = sc.controller; - } - if (controller == null) { - // We still don't have one, ignore the command. - Log.w(mTag, "sent remote volume change without a controller!"); - } else { - PlaybackInfo vi = controller.getPlaybackInfo(); - index = vi.getCurrentVolume(); - max = vi.getMaxVolume(); - if ((vi.getVolumeControl() & VolumeProvider.VOLUME_CONTROL_FIXED) != 0) { - // if the remote volume is fixed add the flag for the UI - flags |= AudioManager.FLAG_FIXED_VOLUME; - } - } - if (LOGD) { Log.d(mTag, "showing remote volume "+index+" over "+ max); } - break; - } - } - - if (sc != null) { - if (streamType == STREAM_REMOTE_MUSIC && controller != sc.controller) { - if (sc.controller != null) { - sc.controller.unregisterCallback(mMediaControllerCb); - } - sc.controller = controller; - if (controller != null) { - sc.controller.registerCallback(mMediaControllerCb); - } - } - if (sc.seekbarView.getMax() != max) { - sc.seekbarView.setMax(max); - } - updateSliderProgress(sc, index); - final boolean muted = isMuted(streamType); - updateSliderEnabled(sc, muted, (flags & AudioManager.FLAG_FIXED_VOLUME) != 0); - if (isNotificationOrRing(streamType)) { - // check for secondary-icon transition completion - if (mSecondaryIconTransition.isRunning()) { - mSecondaryIconTransition.cancel(); // safe to reset - sc.seekbarView.setAlpha(0); sc.seekbarView.animate().alpha(1); - mZenPanel.setAlpha(0); mZenPanel.animate().alpha(1); - } - updateSliderIcon(sc, muted); - } - } - - if (!isShowing()) { - int stream = (streamType == STREAM_REMOTE_MUSIC) ? -1 : streamType; - // when the stream is for remote playback, use -1 to reset the stream type evaluation - mAudioManager.forceVolumeControlStream(stream); - mDialog.show(); - if (mCallback != null) { - mCallback.onVisible(true); - } - announceDialogShown(); - } - - // Do a little vibrate if applicable (only when going into vibrate mode) - if ((streamType != STREAM_REMOTE_MUSIC) && - ((flags & AudioManager.FLAG_VIBRATE) != 0) && - isNotificationOrRing(streamType) && - mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_VIBRATE) { - sendMessageDelayed(obtainMessage(MSG_VIBRATE), VIBRATE_DELAY); - } - - // Pulse the zen icon if an adjustment was suppressed due to silent mode. - if ((flags & AudioManager.FLAG_SHOW_SILENT_HINT) != 0) { - showSilentHint(); - } - - // Pulse the slider icon & vibrate if an adjustment down was suppressed due to vibrate mode. - if ((flags & AudioManager.FLAG_SHOW_VIBRATE_HINT) != 0) { - showVibrateHint(); - } - } - - private void announceDialogShown() { - mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); - } - - private boolean isShowing() { - return mDialog.isShowing(); - } - - protected void onPlaySound(int streamType, int flags) { - - if (hasMessages(MSG_STOP_SOUNDS)) { - removeMessages(MSG_STOP_SOUNDS); - // Force stop right now - onStopSounds(); - } - - synchronized (this) { - ToneGenerator toneGen = getOrCreateToneGenerator(streamType); - if (toneGen != null) { - toneGen.startTone(ToneGenerator.TONE_PROP_BEEP); - sendMessageDelayed(obtainMessage(MSG_STOP_SOUNDS), BEEP_DURATION); - } - } - } - - protected void onStopSounds() { - - synchronized (this) { - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int i = numStreamTypes - 1; i >= 0; i--) { - ToneGenerator toneGen = mToneGenerators[i]; - if (toneGen != null) { - toneGen.stopTone(); - } - } - } - } - - protected void onVibrate() { - - // Make sure we ended up in vibrate ringer mode - if (mAudioManager.getRingerModeInternal() != AudioManager.RINGER_MODE_VIBRATE) { - return; - } - if (mVibrator != null) { - mVibrator.vibrate(VIBRATE_DURATION, VIBRATION_ATTRIBUTES); - } - } - - protected void onRemoteVolumeChanged(MediaController controller, int flags) { - if (LOGD) Log.d(mTag, "onRemoteVolumeChanged(controller:" + controller + ", flags: " - + flagsToString(flags) + ")"); - - if (((flags & AudioManager.FLAG_SHOW_UI) != 0) || isShowing()) { - synchronized (this) { - if (mActiveStreamType != STREAM_REMOTE_MUSIC) { - reorderSliders(STREAM_REMOTE_MUSIC); - } - onShowVolumeChanged(STREAM_REMOTE_MUSIC, flags, controller); - } - } else { - if (LOGD) Log.d(mTag, "not calling onShowVolumeChanged(), no FLAG_SHOW_UI or no UI"); - } - - removeMessages(MSG_FREE_RESOURCES); - sendMessageDelayed(obtainMessage(MSG_FREE_RESOURCES), FREE_DELAY); - resetTimeout(); - } - - protected void onRemoteVolumeUpdateIfShown() { - if (LOGD) Log.d(mTag, "onRemoteVolumeUpdateIfShown()"); - if (isShowing() - && (mActiveStreamType == STREAM_REMOTE_MUSIC) - && (mStreamControls != null)) { - onShowVolumeChanged(STREAM_REMOTE_MUSIC, 0, null); - } - } - - /** - * Clear the current remote stream controller. - */ - private void clearRemoteStreamController() { - if (mStreamControls != null) { - StreamControl sc = mStreamControls.get(STREAM_REMOTE_MUSIC); - if (sc != null) { - if (sc.controller != null) { - sc.controller.unregisterCallback(mMediaControllerCb); - sc.controller = null; - } - } - } - } - - /** - * Handler for MSG_SLIDER_VISIBILITY_CHANGED Hide or show a slider - * - * @param streamType can be a valid stream type value, or - * VolumePanel.STREAM_MASTER, or VolumePanel.STREAM_REMOTE_MUSIC - * @param visible - */ - synchronized protected void onSliderVisibilityChanged(int streamType, int visible) { - if (LOGD) Log.d(mTag, "onSliderVisibilityChanged(stream="+streamType+", visi="+visible+")"); - boolean isVisible = (visible == 1); - for (int i = STREAMS.length - 1 ; i >= 0 ; i--) { - StreamResources streamRes = STREAMS[i]; - if (streamRes.streamType == streamType) { - streamRes.show = isVisible; - if (!isVisible && (mActiveStreamType == streamType)) { - mActiveStreamType = -1; - } - break; - } - } - } - - protected void onDisplaySafeVolumeWarning(int flags) { - if ((flags & (AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_SHOW_UI_WARNINGS)) != 0 - || isShowing()) { - synchronized (sSafetyWarningLock) { - if (sSafetyWarning != null) { - return; - } - sSafetyWarning = new SafetyWarning(mContext, this, mAudioManager); - sSafetyWarning.show(); - } - updateStates(); - } - if (mAccessibilityManager.isTouchExplorationEnabled()) { - removeMessages(MSG_TIMEOUT); - } else { - updateTimeoutDelay(); - resetTimeout(); - } - } - - /** - * Lock on this VolumePanel instance as long as you use the returned ToneGenerator. - */ - private ToneGenerator getOrCreateToneGenerator(int streamType) { - synchronized (this) { - if (mToneGenerators[streamType] == null) { - try { - mToneGenerators[streamType] = new ToneGenerator(streamType, MAX_VOLUME); - } catch (RuntimeException e) { - if (LOGD) { - Log.d(mTag, "ToneGenerator constructor failed with " - + "RuntimeException: " + e); - } - } - } - return mToneGenerators[streamType]; - } - } - - - /** - * Switch between icons because Bluetooth music is same as music volume, but with - * different icons. - */ - private void setMusicIcon(int resId, int resMuteId) { - StreamControl sc = mStreamControls.get(AudioManager.STREAM_MUSIC); - if (sc != null) { - sc.iconRes = resId; - sc.iconMuteRes = resMuteId; - updateSliderIcon(sc, isMuted(sc.streamType)); - } - } - - protected void onFreeResources() { - synchronized (this) { - for (int i = mToneGenerators.length - 1; i >= 0; i--) { - if (mToneGenerators[i] != null) { - mToneGenerators[i].release(); - } - mToneGenerators[i] = null; - } - } - } - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - - case MSG_VOLUME_CHANGED: { - onVolumeChanged(msg.arg1, msg.arg2); - break; - } - - case MSG_MUTE_CHANGED: { - onMuteChanged(msg.arg1, msg.arg2); - break; - } - - case MSG_FREE_RESOURCES: { - onFreeResources(); - break; - } - - case MSG_STOP_SOUNDS: { - onStopSounds(); - break; - } - - case MSG_PLAY_SOUND: { - onPlaySound(msg.arg1, msg.arg2); - break; - } - - case MSG_VIBRATE: { - onVibrate(); - break; - } - - case MSG_TIMEOUT: { - if (isShowing()) { - mDialog.dismiss(); - clearRemoteStreamController(); - mActiveStreamType = -1; - if (mCallback != null) { - mCallback.onVisible(false); - } - } - synchronized (sSafetyWarningLock) { - if (sSafetyWarning != null) { - if (LOGD) Log.d(mTag, "SafetyWarning timeout"); - sSafetyWarning.dismiss(); - } - } - break; - } - - case MSG_RINGER_MODE_CHANGED: - case MSG_INTERNAL_RINGER_MODE_CHANGED: - case MSG_NOTIFICATION_EFFECTS_SUPPRESSOR_CHANGED: { - if (isShowing()) { - updateActiveSlider(); - } - break; - } - - case MSG_REMOTE_VOLUME_CHANGED: { - onRemoteVolumeChanged((MediaController) msg.obj, msg.arg1); - break; - } - - case MSG_REMOTE_VOLUME_UPDATE_IF_SHOWN: - onRemoteVolumeUpdateIfShown(); - break; - - case MSG_SLIDER_VISIBILITY_CHANGED: - onSliderVisibilityChanged(msg.arg1, msg.arg2); - break; - - case MSG_DISPLAY_SAFE_VOLUME_WARNING: - onDisplaySafeVolumeWarning(msg.arg1); - break; - - case MSG_LAYOUT_DIRECTION: - setLayoutDirection(msg.arg1); - break; - - case MSG_ZEN_MODE_AVAILABLE_CHANGED: - mZenModeAvailable = msg.arg1 != 0; - updateZenPanelVisible(); - break; - - case MSG_USER_ACTIVITY: - if (mCallback != null) { - mCallback.onInteraction(); - } - break; - } - } - - private void resetTimeout() { - final boolean touchExploration = mAccessibilityManager.isTouchExplorationEnabled(); - if (LOGD) Log.d(mTag, "resetTimeout at " + System.currentTimeMillis() - + " delay=" + mTimeoutDelay + " touchExploration=" + touchExploration); - if (sSafetyWarning == null || !touchExploration) { - removeMessages(MSG_TIMEOUT); - sendEmptyMessageDelayed(MSG_TIMEOUT, mTimeoutDelay); - removeMessages(MSG_USER_ACTIVITY); - sendEmptyMessage(MSG_USER_ACTIVITY); - } - } - - private void forceTimeout(long delay) { - if (LOGD) Log.d(mTag, "forceTimeout delay=" + delay + " callers=" + Debug.getCallers(3)); - removeMessages(MSG_TIMEOUT); - sendEmptyMessageDelayed(MSG_TIMEOUT, delay); - } - - public ZenModeController getZenController() { - return mZenController; - } - - @Override - public void dispatchDemoCommand(String command, Bundle args) { - if (!COMMAND_VOLUME.equals(command)) return; - String icon = args.getString("icon"); - final String iconMute = args.getString("iconmute"); - final boolean mute = iconMute != null; - icon = mute ? iconMute : icon; - icon = icon.endsWith("Stream") ? icon : (icon + "Stream"); - final StreamResources sr = StreamResources.valueOf(icon); - mDemoIcon = mute ? sr.iconMuteRes : sr.iconRes; - final int forcedStreamType = StreamResources.MediaStream.streamType; - mAudioManager.forceVolumeControlStream(forcedStreamType); - mAudioManager.adjustStreamVolume(forcedStreamType, AudioManager.ADJUST_SAME, - AudioManager.FLAG_SHOW_UI); - } - - private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - final Object tag = seekBar.getTag(); - if (fromUser && tag instanceof StreamControl) { - StreamControl sc = (StreamControl) tag; - setStreamVolume(sc, progress + sc.minVolume, - AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_VIBRATE); - } - resetTimeout(); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }; - - private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() { - @Override - public void onZenAvailableChanged(boolean available) { - obtainMessage(MSG_ZEN_MODE_AVAILABLE_CHANGED, available ? 1 : 0, 0).sendToTarget(); - } - - @Override - public void onEffectsSupressorChanged() { - mNotificationEffectsSuppressor = mZenController.getEffectsSuppressor(); - sendEmptyMessage(MSG_NOTIFICATION_EFFECTS_SUPPRESSOR_CHANGED); - } - }; - - private final MediaController.Callback mMediaControllerCb = new MediaController.Callback() { - public void onAudioInfoChanged(PlaybackInfo info) { - onRemoteVolumeUpdateIfShown(); - } - }; - - private final class SecondaryIconTransition extends AnimatorListenerAdapter - implements Runnable { - private static final int ANIMATION_TIME = 400; - private static final int WAIT_FOR_SWITCH_TIME = 1000; - - private final int mAnimationTime = (int)(ANIMATION_TIME * ValueAnimator.getDurationScale()); - private final int mFadeOutTime = mAnimationTime / 2; - private final int mDelayTime = mAnimationTime / 3; - - private final Interpolator mIconInterpolator = - AnimationUtils.loadInterpolator(mContext, android.R.interpolator.fast_out_slow_in); - - private StreamControl mTarget; - - public void start(StreamControl sc) { - if (sc == null) throw new IllegalArgumentException(); - if (LOGD) Log.d(mTag, "Secondary icon animation start"); - if (mTarget != null) { - cancel(); - } - mTarget = sc; - mTimeoutDelay = mAnimationTime + WAIT_FOR_SWITCH_TIME; - resetTimeout(); - mTarget.secondaryIcon.setClickable(false); - final int N = mTarget.group.getChildCount(); - for (int i = 0; i < N; i++) { - final View child = mTarget.group.getChildAt(i); - if (child != mTarget.secondaryIcon) { - child.animate().alpha(0).setDuration(mFadeOutTime).start(); - } - } - mTarget.secondaryIcon.animate() - .translationXBy(mTarget.icon.getX() - mTarget.secondaryIcon.getX()) - .setInterpolator(mIconInterpolator) - .setStartDelay(mDelayTime) - .setDuration(mAnimationTime - mDelayTime) - .setListener(this) - .start(); - } - - public boolean isRunning() { - return mTarget != null; - } - - public void cancel() { - if (mTarget == null) return; - mTarget.secondaryIcon.setClickable(true); - final int N = mTarget.group.getChildCount(); - for (int i = 0; i < N; i++) { - final View child = mTarget.group.getChildAt(i); - if (child != mTarget.secondaryIcon) { - child.animate().cancel(); - child.setAlpha(1); - } - } - mTarget.secondaryIcon.animate().cancel(); - mTarget.secondaryIcon.setTranslationX(0); - mTarget = null; - } - - @Override - public void onAnimationEnd(Animator animation) { - if (mTarget == null) return; - AsyncTask.execute(this); - } - - @Override - public void run() { - if (mTarget == null) return; - if (LOGD) Log.d(mTag, "Secondary icon animation complete, show notification slider"); - mAudioManager.forceVolumeControlStream(StreamResources.NotificationStream.streamType); - mAudioManager.adjustStreamVolume(StreamResources.NotificationStream.streamType, - AudioManager.ADJUST_SAME, AudioManager.FLAG_SHOW_UI); - } - } - - public interface Callback { - void onZenSettings(); - void onInteraction(); - void onVisible(boolean visible); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java new file mode 100644 index 0000000..915e998 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.volume; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.preference.PreferenceManager; + +/** + * Configuration for the volume dialog + related policy. + */ +public class VolumePrefs { + + public static final String PREF_ENABLE_PROTOTYPE = "pref_enable_prototype"; // not persistent + public static final String PREF_SHOW_ALARMS = "pref_show_alarms"; + public static final String PREF_SHOW_SYSTEM = "pref_show_system"; + public static final String PREF_SHOW_HEADERS = "pref_show_headers"; + public static final String PREF_SHOW_FAKE_REMOTE_1 = "pref_show_fake_remote_1"; + public static final String PREF_SHOW_FAKE_REMOTE_2 = "pref_show_fake_remote_2"; + public static final String PREF_SHOW_FOOTER = "pref_show_footer"; + public static final String PREF_ZEN_FOOTER = "pref_zen_footer"; + public static final String PREF_ENABLE_AUTOMUTE = "pref_enable_automute"; + public static final String PREF_ENABLE_SILENT_MODE = "pref_enable_silent_mode"; + public static final String PREF_DEBUG_LOGGING = "pref_debug_logging"; + public static final String PREF_SEND_LOGS = "pref_send_logs"; + public static final String PREF_ADJUST_SYSTEM = "pref_adjust_system"; + public static final String PREF_ADJUST_VOICE_CALLS = "pref_adjust_voice_calls"; + public static final String PREF_ADJUST_BLUETOOTH_SCO = "pref_adjust_bluetooth_sco"; + public static final String PREF_ADJUST_MEDIA = "pref_adjust_media"; + public static final String PREF_ADJUST_ALARMS = "pref_adjust_alarms"; + public static final String PREF_ADJUST_NOTIFICATION = "pref_adjust_notification"; + + public static final boolean DEFAULT_SHOW_HEADERS = true; + public static final boolean DEFAULT_SHOW_FOOTER = true; + public static final boolean DEFAULT_ENABLE_AUTOMUTE = true; + public static final boolean DEFAULT_ENABLE_SILENT_MODE = true; + public static final boolean DEFAULT_ZEN_FOOTER = true; + + public static void unregisterCallbacks(Context c, OnSharedPreferenceChangeListener listener) { + prefs(c).unregisterOnSharedPreferenceChangeListener(listener); + } + + public static void registerCallbacks(Context c, OnSharedPreferenceChangeListener listener) { + prefs(c).registerOnSharedPreferenceChangeListener(listener); + } + + private static SharedPreferences prefs(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context); + } + + public static boolean get(Context context, String key, boolean def) { + return prefs(context).getBoolean(key, def); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java index ac08904..5f04aaf 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java @@ -29,25 +29,17 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.res.Configuration; import android.media.AudioManager; -import android.media.IRemoteVolumeController; -import android.media.IVolumeController; -import android.media.VolumePolicy; -import android.media.session.ISessionController; -import android.media.session.MediaController; import android.media.session.MediaSessionManager; -import android.os.Bundle; import android.os.Handler; -import android.os.RemoteException; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.SystemUI; -import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.qs.tiles.DndTile; import com.android.systemui.statusbar.ServiceMonitor; -import com.android.systemui.statusbar.phone.PhoneStatusBar; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.policy.ZenModeControllerImpl; @@ -67,12 +59,9 @@ public class VolumeUI extends SystemUI { private AudioManager mAudioManager; private NotificationManager mNotificationManager; private MediaSessionManager mMediaSessionManager; - private VolumeController mVolumeController; - private RemoteVolumeController mRemoteVolumeController; private ServiceMonitor mVolumeControllerService; - private VolumePanel mPanel; - private int mDismissDelay; + private VolumeDialogComponent mVolumeComponent; @Override public void start() { @@ -83,10 +72,9 @@ public class VolumeUI extends SystemUI { (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mMediaSessionManager = (MediaSessionManager) mContext .getSystemService(Context.MEDIA_SESSION_SERVICE); - initPanel(); - mVolumeController = new VolumeController(); - mRemoteVolumeController = new RemoteVolumeController(); - putComponent(VolumeComponent.class, mVolumeController); + final ZenModeController zenController = new ZenModeControllerImpl(mContext, mHandler); + mVolumeComponent = new VolumeDialogComponent(this, mContext, null, zenController); + putComponent(VolumeComponent.class, getVolumeComponent()); mReceiver.start(); mVolumeControllerService = new ServiceMonitor(TAG, LOGD, mContext, Settings.Secure.VOLUME_CONTROLLER_SERVICE_COMPONENT, @@ -94,30 +82,30 @@ public class VolumeUI extends SystemUI { mVolumeControllerService.start(); } + private VolumeComponent getVolumeComponent() { + return mVolumeComponent; + } + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - if (mPanel != null) { - mPanel.onConfigurationChanged(newConfig); - } + if (!mEnabled) return; + getVolumeComponent().onConfigurationChanged(newConfig); } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.print("mEnabled="); pw.println(mEnabled); + if (!mEnabled) return; pw.print("mVolumeControllerService="); pw.println(mVolumeControllerService.getComponent()); - if (mPanel != null) { - mPanel.dump(fd, pw, args); - } + getVolumeComponent().dump(fd, pw, args); } - private void setVolumeController(boolean register) { + private void setDefaultVolumeController(boolean register) { if (register) { - if (LOGD) Log.d(TAG, "Registering default volume controller"); - mAudioManager.setVolumeController(mVolumeController); - mAudioManager.setVolumePolicy(VolumePolicy.DEFAULT); - mMediaSessionManager.setRemoteVolumeController(mRemoteVolumeController); DndTile.setVisible(mContext, false); + if (LOGD) Log.d(TAG, "Registering default volume controller"); + getVolumeComponent().register(); } else { if (LOGD) Log.d(TAG, "Unregistering default volume controller"); mAudioManager.setVolumeController(null); @@ -125,33 +113,6 @@ public class VolumeUI extends SystemUI { } } - private void initPanel() { - mDismissDelay = mContext.getResources().getInteger(R.integer.volume_panel_dismiss_delay); - mPanel = new VolumePanel(mContext, new ZenModeControllerImpl(mContext, mHandler)); - mPanel.setCallback(new VolumePanel.Callback() { - @Override - public void onZenSettings() { - mHandler.removeCallbacks(mStartZenSettings); - mHandler.post(mStartZenSettings); - } - - @Override - public void onInteraction() { - final KeyguardViewMediator kvm = getComponent(KeyguardViewMediator.class); - if (kvm != null) { - kvm.userActivity(); - } - } - - @Override - public void onVisible(boolean visible) { - if (mAudioManager != null && mVolumeController != null) { - mAudioManager.notifyVolumeControllerVisible(mVolumeController, visible); - } - } - }); - } - private String getAppLabel(ComponentName component) { final String pkg = component.getPackageName(); try { @@ -179,83 +140,11 @@ public class VolumeUI extends SystemUI { d.show(); } - private final Runnable mStartZenSettings = new Runnable() { - @Override - public void run() { - getComponent(PhoneStatusBar.class).startActivityDismissingKeyguard( - ZenModePanel.ZEN_SETTINGS, true /* onlyProvisioned */, true /* dismissShade */); - mPanel.postDismiss(mDismissDelay); - } - }; - - /** For now, simply host an unmodified base volume panel in this process. */ - private final class VolumeController extends IVolumeController.Stub implements VolumeComponent { - - @Override - public void displaySafeVolumeWarning(int flags) throws RemoteException { - mPanel.postDisplaySafeVolumeWarning(flags); - } - - @Override - public void volumeChanged(int streamType, int flags) - throws RemoteException { - mPanel.postVolumeChanged(streamType, flags); - } - - @Override - public void masterMuteChanged(int flags) throws RemoteException { - // no-op - } - - @Override - public void setLayoutDirection(int layoutDirection) - throws RemoteException { - mPanel.postLayoutDirection(layoutDirection); - } - - @Override - public void dismiss() throws RemoteException { - dismissNow(); - } - - @Override - public ZenModeController getZenController() { - return mPanel.getZenController(); - } - - @Override - public void dispatchDemoCommand(String command, Bundle args) { - mPanel.dispatchDemoCommand(command, args); - } - - @Override - public void dismissNow() { - mPanel.postDismiss(0); - } - } - - private final class RemoteVolumeController extends IRemoteVolumeController.Stub { - - @Override - public void remoteVolumeChanged(ISessionController binder, int flags) - throws RemoteException { - MediaController controller = new MediaController(mContext, binder); - mPanel.postRemoteVolumeChanged(controller, flags); - } - - @Override - public void updateRemoteController(ISessionController session) throws RemoteException { - mPanel.postRemoteSliderVisibility(session != null); - // TODO stash default session in case the slider can be opened other - // than by remoteVolumeChanged. - } - } - private final class ServiceMonitorCallbacks implements ServiceMonitor.Callbacks { @Override public void onNoService() { if (LOGD) Log.d(TAG, "onNoService"); - setVolumeController(true); + setDefaultVolumeController(true); mRestorationNotification.hide(); if (!mVolumeControllerService.isPackageAvailable()) { mVolumeControllerService.setComponent(null); @@ -267,8 +156,8 @@ public class VolumeUI extends SystemUI { if (LOGD) Log.d(TAG, "onServiceStartAttempt"); // poke the setting to update the uid mVolumeControllerService.setComponent(mVolumeControllerService.getComponent()); - setVolumeController(false); - mVolumeController.dismissNow(); + setDefaultVolumeController(false); + getVolumeComponent().dismissNow(); mRestorationNotification.show(); return 0; } @@ -279,18 +168,40 @@ public class VolumeUI extends SystemUI { private static final String DISABLE = "com.android.systemui.vui.DISABLE"; private static final String EXTRA_COMPONENT = "component"; + private static final String PREF = "com.android.systemui.PREF"; + private static final String EXTRA_KEY = "key"; + private static final String EXTRA_VALUE = "value"; + public void start() { final IntentFilter filter = new IntentFilter(); filter.addAction(ENABLE); filter.addAction(DISABLE); + filter.addAction(PREF); mContext.registerReceiver(this, filter, null, mHandler); } @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); + if (PREF.equals(action)) { + final String key = intent.getStringExtra(EXTRA_KEY); + if (key != null && intent.getExtras() != null) { + final Object value = intent.getExtras().get(EXTRA_VALUE); + if (value == null) { + Prefs.remove(mContext, key); + } else if (value instanceof Boolean) { + Prefs.putBoolean(mContext, key, (Boolean) value); + } else if (value instanceof Integer) { + Prefs.putInt(mContext, key, (Integer) value); + } else if (value instanceof Long) { + Prefs.putLong(mContext, key, (Long) value); + } + } + return; + } final ComponentName component = intent.getParcelableExtra(EXTRA_COMPONENT); - final boolean current = component.equals(mVolumeControllerService.getComponent()); + final boolean current = component != null + && component.equals(mVolumeControllerService.getComponent()); if (ENABLE.equals(action) && component != null) { if (!current) { showServiceActivationDialog(component); @@ -319,7 +230,7 @@ public class VolumeUI extends SystemUI { .putExtra(Receiver.EXTRA_COMPONENT, component); mNotificationManager.notify(R.id.notification_volumeui, new Notification.Builder(mContext) - .setSmallIcon(R.drawable.ic_ringer_audible) + .setSmallIcon(R.drawable.ic_volume_media) .setWhen(0) .setShowWhen(false) .setOngoing(true) diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java new file mode 100644 index 0000000..775c87d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.volume; + +import android.animation.LayoutTransition; +import android.animation.ValueAnimator; +import android.app.ActivityManager; +import android.content.Context; +import android.content.res.Resources; +import android.provider.Settings.Global; +import android.service.notification.ZenModeConfig; +import android.util.AttributeSet; +import android.util.Log; +import android.util.TypedValue; +import android.view.View; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.LinearLayout; +import android.widget.Switch; +import android.widget.TextView; + +import com.android.systemui.R; +import com.android.systemui.statusbar.policy.ZenModeController; + +import java.util.Objects; + +/** + * Switch bar + zen mode panel (conditions) attached to the bottom of the volume dialog. + */ +public class ZenFooter extends LinearLayout { + private static final String TAG = Util.logTag(ZenFooter.class); + + private final Context mContext; + private final float mSecondaryAlpha; + private final LayoutTransition mLayoutTransition; + + private ZenModeController mController; + private Switch mSwitch; + private ZenModePanel mZenModePanel; + private View mZenModePanelButtons; + private View mZenModePanelMoreButton; + private View mZenModePanelDoneButton; + private View mSwitchBar; + private View mSwitchBarIcon; + private View mSummary; + private TextView mSummaryLine1; + private TextView mSummaryLine2; + private boolean mFooterExpanded; + private int mZen = -1; + private ZenModeConfig mConfig; + private Callback mCallback; + + public ZenFooter(Context context, AttributeSet attrs) { + super(context, attrs); + mContext = context; + mSecondaryAlpha = getFloat(context.getResources(), R.dimen.volume_secondary_alpha); + mLayoutTransition = new LayoutTransition(); + mLayoutTransition.setDuration(new ValueAnimator().getDuration() / 2); + mLayoutTransition.disableTransitionType(LayoutTransition.DISAPPEARING); + mLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + } + + private static float getFloat(Resources r, int resId) { + final TypedValue tv = new TypedValue(); + r.getValue(resId, tv, true); + return tv.getFloat(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mSwitchBar = findViewById(R.id.volume_zen_switch_bar); + mSwitchBarIcon = findViewById(R.id.volume_zen_switch_bar_icon); + mSwitch = (Switch) findViewById(R.id.volume_zen_switch); + mZenModePanel = (ZenModePanel) findViewById(R.id.zen_mode_panel); + mZenModePanelButtons = findViewById(R.id.volume_zen_mode_panel_buttons); + mZenModePanelMoreButton = findViewById(R.id.volume_zen_mode_panel_more); + mZenModePanelDoneButton = findViewById(R.id.volume_zen_mode_panel_done); + mSummary = findViewById(R.id.volume_zen_panel_summary); + mSummaryLine1 = (TextView) findViewById(R.id.volume_zen_panel_summary_line_1); + mSummaryLine2 = (TextView) findViewById(R.id.volume_zen_panel_summary_line_2); + } + + public void init(ZenModeController controller, Callback callback) { + mCallback = callback; + mController = controller; + mZenModePanel.init(controller); + mZenModePanel.setEmbedded(true); + mZenModePanel.setCallback(mZenModePanelCallback); + mSwitch.setOnCheckedChangeListener(mCheckedListener); + mController.addCallback(new ZenModeController.Callback() { + @Override + public void onZenChanged(int zen) { + setZen(zen); + } + @Override + public void onConfigChanged(ZenModeConfig config) { + setConfig(config); + } + }); + mSwitchBar.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + mSwitch.setChecked(!mSwitch.isChecked()); + } + }); + mZenModePanelMoreButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (mCallback != null) { + mCallback.onSettingsClicked(); + } + } + }); + mZenModePanelDoneButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (mCallback != null) { + mCallback.onDoneClicked(); + } + } + }); + mZen = mController.getZen(); + mConfig = mController.getConfig(); + update(); + } + + private void setZen(int zen) { + if (mZen == zen) return; + mZen = zen; + update(); + } + + private void setConfig(ZenModeConfig config) { + if (Objects.equals(mConfig, config)) return; + mConfig = config; + update(); + } + + public boolean isZen() { + return isZenPriority() || isZenAlarms() || isZenNone(); + } + + private boolean isZenPriority() { + return mZen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + } + + private boolean isZenAlarms() { + return mZen == Global.ZEN_MODE_ALARMS; + } + + private boolean isZenNone() { + return mZen == Global.ZEN_MODE_NO_INTERRUPTIONS; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + setLayoutTransition(null); + setFooterExpanded(false); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + setLayoutTransition(mLayoutTransition); + } + + private boolean setFooterExpanded(boolean expanded) { + if (mFooterExpanded == expanded) return false; + mFooterExpanded = expanded; + update(); + if (mCallback != null) { + mCallback.onFooterExpanded(); + } + return true; + } + + public boolean isFooterExpanded() { + return mFooterExpanded; + } + + public void update() { + final boolean isZen = isZen(); + mSwitch.setOnCheckedChangeListener(null); + mSwitch.setChecked(isZen); + mSwitch.setOnCheckedChangeListener(mCheckedListener); + Util.setVisOrGone(mZenModePanel, isZen && mFooterExpanded); + Util.setVisOrGone(mZenModePanelButtons, isZen && mFooterExpanded); + Util.setVisOrGone(mSummary, isZen && !mFooterExpanded); + mSwitchBarIcon.setAlpha(isZen ? 1 : mSecondaryAlpha); + final String line1 = + isZenPriority() ? mContext.getString(R.string.interruption_level_priority) + : isZenAlarms() ? mContext.getString(R.string.interruption_level_alarms) + : isZenNone() ? mContext.getString(R.string.interruption_level_none) + : null; + Util.setText(mSummaryLine1, line1); + final String line2 = ZenModeConfig.getConditionSummary(mContext, mConfig, + ActivityManager.getCurrentUser()); + Util.setText(mSummaryLine2, line2); + } + + private final ZenModePanel.Callback mZenModePanelCallback = new ZenModePanel.Callback() { + @Override + public void onMoreSettings() { + if (mCallback != null) { + mCallback.onSettingsClicked(); + } + } + + @Override + public void onPrioritySettings() { + if (mCallback != null) { + mCallback.onPrioritySettingsClicked(); + } + } + + @Override + public void onInteraction() { + // noop + } + + @Override + public void onExpanded(boolean expanded) { + // noop + } + }; + + private final OnCheckedChangeListener mCheckedListener = new OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (D.BUG) Log.d(TAG, "onCheckedChanged " + isChecked); + if (isChecked != isZen()) { + final int newZen = isChecked ? Global.ZEN_MODE_ALARMS : Global.ZEN_MODE_OFF; + mZen = newZen; // this one's optimistic + setFooterExpanded(isChecked); + mController.setZen(newZen, null, TAG); + } + } + }; + + public interface Callback { + void onFooterExpanded(); + void onSettingsClicked(); + void onDoneClicked(); + void onPrioritySettingsClicked(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index 878ab712..1b563dc 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -23,7 +23,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.content.res.Resources; import android.net.Uri; import android.os.AsyncTask; import android.os.Handler; @@ -33,6 +32,7 @@ import android.provider.Settings; import android.provider.Settings.Global; import android.service.notification.Condition; import android.service.notification.ZenModeConfig; +import android.service.notification.ZenModeConfig.ZenRule; import android.text.TextUtils; import android.util.ArraySet; import android.util.AttributeSet; @@ -50,6 +50,7 @@ import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.TextView; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.statusbar.policy.ZenModeController; @@ -74,12 +75,15 @@ public class ZenModePanel extends LinearLayout { private static final int FOREVER_CONDITION_INDEX = 0; private static final int COUNTDOWN_CONDITION_INDEX = 1; - public static final Intent ZEN_SETTINGS = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS); + public static final Intent ZEN_SETTINGS + = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS); + public static final Intent ZEN_PRIORITY_SETTINGS + = new Intent(Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS); private final Context mContext; private final LayoutInflater mInflater; private final H mHandler = new H(); - private final Prefs mPrefs; + private final ZenPrefs mPrefs; private final IconPulser mIconPulser; private final int mSubheadWarningColor; private final int mSubheadColor; @@ -96,6 +100,9 @@ public class ZenModePanel extends LinearLayout { private TextView mZenSubheadExpanded; private View mZenEmbeddedDivider; private View mMoreSettings; + private View mZenIntroduction; + private View mZenIntroductionConfirm; + private View mZenIntroductionCustomize; private LinearLayout mZenConditions; private Callback mCallback; @@ -121,7 +128,7 @@ public class ZenModePanel extends LinearLayout { public ZenModePanel(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; - mPrefs = new Prefs(); + mPrefs = new ZenPrefs(); mInflater = LayoutInflater.from(mContext.getApplicationContext()); mIconPulser = new IconPulser(mContext); mSubheadWarningColor = context.getColor(R.color.system_warning_color); @@ -150,14 +157,14 @@ public class ZenModePanel extends LinearLayout { if (mEmbedded == embedded) return; mEmbedded = embedded; mZenButtonsContainer.setLayoutTransition(mEmbedded ? null : newLayoutTransition(null)); + setLayoutTransition(mEmbedded ? null : newLayoutTransition(null)); if (mEmbedded) { mZenButtonsContainer.setBackground(null); } else { mZenButtonsContainer.setBackgroundResource(R.drawable.qs_background_secondary); } - mZenButtons.getChildAt(2).setVisibility(mEmbedded ? GONE : VISIBLE); + mZenButtons.getChildAt(3).setVisibility(mEmbedded ? GONE : VISIBLE); mZenEmbeddedDivider.setVisibility(mEmbedded ? VISIBLE : GONE); - setExpanded(mEmbedded); updateWidgets(); } @@ -166,12 +173,13 @@ public class ZenModePanel extends LinearLayout { super.onFinishInflate(); mZenButtons = (SegmentedButtons) findViewById(R.id.zen_buttons); - mZenButtons.addButton(R.string.interruption_level_none, R.drawable.ic_zen_none, + mZenButtons.addButton(R.string.interruption_level_none_twoline, Global.ZEN_MODE_NO_INTERRUPTIONS); - mZenButtons.addButton(R.string.interruption_level_priority, R.drawable.ic_zen_important, + mZenButtons.addButton(R.string.interruption_level_alarms_twoline, + Global.ZEN_MODE_ALARMS); + mZenButtons.addButton(R.string.interruption_level_priority_twoline, Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS); - mZenButtons.addButton(R.string.interruption_level_all, R.drawable.ic_zen_all, - Global.ZEN_MODE_OFF); + mZenButtons.addButton(R.string.interruption_level_all, Global.ZEN_MODE_OFF); mZenButtons.setCallback(mZenButtonsCallback); mZenButtonsContainer = (ViewGroup) findViewById(R.id.zen_buttons_container); @@ -201,11 +209,36 @@ public class ZenModePanel extends LinearLayout { }); Interaction.register(mMoreSettings, mInteractionCallback); + mZenIntroduction = findViewById(R.id.zen_introduction); + mZenIntroductionConfirm = findViewById(R.id.zen_introduction_confirm); + mZenIntroductionConfirm.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + confirmZenIntroduction(); + } + }); + mZenIntroductionCustomize = findViewById(R.id.zen_introduction_customize); + mZenIntroductionCustomize.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + confirmZenIntroduction(); + if (mCallback != null) { + mCallback.onPrioritySettings(); + } + } + }); + mZenConditions = (LinearLayout) findViewById(R.id.zen_conditions); setLayoutTransition(newLayoutTransition(mTransitionHelper)); } + private void confirmZenIntroduction() { + if (DEBUG) Log.d(TAG, "confirmZenIntroduction"); + Prefs.putBoolean(mContext, Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, true); + mHandler.sendEmptyMessage(H.UPDATE_WIDGETS); + } + private LayoutTransition newLayoutTransition(TransitionListener listener) { final LayoutTransition transition = new LayoutTransition(); transition.disableTransitionType(LayoutTransition.DISAPPEARING); @@ -275,8 +308,9 @@ public class ZenModePanel extends LinearLayout { private void setExpanded(boolean expanded) { if (expanded == mExpanded) return; + if (DEBUG) Log.d(mTag, "setExpanded " + expanded); mExpanded = expanded; - if (mExpanded) { + if (mExpanded && isShown()) { ensureSelection(); } updateWidgets(); @@ -297,7 +331,7 @@ public class ZenModePanel extends LinearLayout { }); } if (mRequestingConditions) { - mTimeCondition = parseExistingTimeCondition(mExitCondition); + mTimeCondition = parseExistingTimeCondition(mContext, mExitCondition); if (mTimeCondition != null) { mBucketIndex = -1; } else { @@ -325,10 +359,9 @@ public class ZenModePanel extends LinearLayout { for (int i = 0; i < mMaxConditions; i++) { mZenConditions.addView(mInflater.inflate(R.layout.zen_mode_condition, this, false)); } - setExitCondition(mController.getExitCondition()); refreshExitConditionText(); mSessionZen = getSelectedZen(-1); - handleUpdateZen(mController.getZen()); + handleUpdateManualRule(mController.getManualRule()); if (DEBUG) Log.d(mTag, "init mExitCondition=" + mExitCondition); hideAllConditions(); mController.addCallback(mZenCallback); @@ -350,6 +383,10 @@ public class ZenModePanel extends LinearLayout { return condition != null ? condition.id : null; } + private Uri getRealConditionId(Condition condition) { + return isForever(condition) ? null : getConditionId(condition); + } + private static boolean sameConditionId(Condition lhs, Condition rhs) { return lhs == null ? rhs == null : rhs != null && lhs.id.equals(rhs.id); } @@ -359,13 +396,17 @@ public class ZenModePanel extends LinearLayout { } private void refreshExitConditionText() { - if (mExitCondition == null) { - mExitConditionText = foreverSummary(); - } else if (isCountdown(mExitCondition)) { - final Condition condition = parseExistingTimeCondition(mExitCondition); - mExitConditionText = condition != null ? condition.summary : foreverSummary(); + mExitConditionText = getExitConditionText(mContext, mExitCondition); + } + + public static String getExitConditionText(Context context, Condition exitCondition) { + if (exitCondition == null) { + return foreverSummary(context); + } else if (isCountdown(exitCondition)) { + final Condition condition = parseExistingTimeCondition(context, exitCondition); + return condition != null ? condition.summary : foreverSummary(context); } else { - mExitConditionText = mExitCondition.summary; + return exitCondition.summary; } } @@ -380,9 +421,16 @@ public class ZenModePanel extends LinearLayout { mIconPulser.start(noneButton); } + private void handleUpdateManualRule(ZenRule rule) { + final int zen = rule != null ? rule.zenMode : Global.ZEN_MODE_OFF; + handleUpdateZen(zen); + final Condition c = rule != null ? rule.condition : null; + handleExitConditionChanged(c); + } + private void handleUpdateZen(int zen) { if (mSessionZen != -1 && mSessionZen != zen) { - setExpanded(mEmbedded || zen != Global.ZEN_MODE_OFF); + setExpanded(mEmbedded && isShown() || !mEmbedded && zen != Global.ZEN_MODE_OFF); mSessionZen = zen; } mZenButtons.setSelectedValue(zen); @@ -396,6 +444,20 @@ public class ZenModePanel extends LinearLayout { } } + private void handleExitConditionChanged(Condition exitCondition) { + setExitCondition(exitCondition); + if (DEBUG) Log.d(mTag, "handleExitConditionChanged " + mExitCondition); + final int N = getVisibleConditions(); + for (int i = 0; i < N; i++) { + final ConditionTag tag = getConditionTagAt(i); + if (tag != null) { + if (sameConditionId(tag.condition, mExitCondition)) { + bind(exitCondition, mZenConditions.getChildAt(i)); + } + } + } + } + private Condition getSelectedCondition() { final int N = getVisibleConditions(); for (int i = 0; i < N; i++) { @@ -422,13 +484,15 @@ public class ZenModePanel extends LinearLayout { final boolean zenImportant = zen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; final boolean zenNone = zen == Global.ZEN_MODE_NO_INTERRUPTIONS; final boolean expanded = !mHidden && mExpanded; + final boolean conditions = mEmbedded || !zenOff && expanded; + final boolean introduction = conditions && zenImportant && !mPrefs.mConfirmedIntroduction; mZenButtons.setVisibility(mHidden ? GONE : VISIBLE); mZenSubhead.setVisibility(!mHidden && !zenOff && !mEmbedded ? VISIBLE : GONE); mZenSubheadExpanded.setVisibility(expanded ? VISIBLE : GONE); mZenSubheadCollapsed.setVisibility(!expanded ? VISIBLE : GONE); mMoreSettings.setVisibility(zenImportant && expanded ? VISIBLE : GONE); - mZenConditions.setVisibility(!zenOff && expanded ? VISIBLE : GONE); + mZenConditions.setVisibility(conditions ? VISIBLE : GONE); if (zenNone) { mZenSubheadExpanded.setText(R.string.zen_no_interruptions_with_warning); @@ -439,16 +503,17 @@ public class ZenModePanel extends LinearLayout { } mZenSubheadExpanded.setTextColor(zenNone && mPrefs.isNoneDangerous() ? mSubheadWarningColor : mSubheadColor); + mZenIntroduction.setVisibility(introduction ? VISIBLE : GONE); } - private Condition parseExistingTimeCondition(Condition condition) { + private static Condition parseExistingTimeCondition(Context context, Condition condition) { if (condition == null) return null; final long time = ZenModeConfig.tryParseCountdownConditionId(condition.id); if (time == 0) return null; final long now = System.currentTimeMillis(); final long span = time - now; if (span <= 0 || span > MAX_BUCKET_MINUTES * MINUTES_MS) return null; - return ZenModeConfig.toTimeCondition(mContext, + return ZenModeConfig.toTimeCondition(context, time, Math.round(span / (float) MINUTES_MS), now, ActivityManager.getCurrentUser()); } @@ -508,18 +573,18 @@ public class ZenModePanel extends LinearLayout { mZenConditions.getChildAt(i).setVisibility(GONE); } // ensure something is selected - if (mExpanded) { + if (mExpanded && isShown()) { ensureSelection(); } } private Condition forever() { - return new Condition(mForeverId, foreverSummary(), "", "", 0 /*icon*/, Condition.STATE_TRUE, - 0 /*flags*/); + return new Condition(mForeverId, foreverSummary(mContext), "", "", 0 /*icon*/, + Condition.STATE_TRUE, 0 /*flags*/); } - private String foreverSummary() { - return mContext.getString(com.android.internal.R.string.zen_mode_forever); + private static String foreverSummary(Context context) { + return context.getString(com.android.internal.R.string.zen_mode_forever); } private ConditionTag getConditionTagAt(int index) { @@ -568,21 +633,7 @@ public class ZenModePanel extends LinearLayout { } } - private void handleExitConditionChanged(Condition exitCondition) { - setExitCondition(exitCondition); - if (DEBUG) Log.d(mTag, "handleExitConditionChanged " + mExitCondition); - final int N = getVisibleConditions(); - for (int i = 0; i < N; i++) { - final ConditionTag tag = getConditionTagAt(i); - if (tag != null) { - if (sameConditionId(tag.condition, mExitCondition)) { - bind(exitCondition, mZenConditions.getChildAt(i)); - } - } - } - } - - private boolean isCountdown(Condition c) { + private static boolean isCountdown(Condition c) { return c != null && ZenModeConfig.isValidCountdownConditionId(c.id); } @@ -715,7 +766,10 @@ public class ZenModePanel extends LinearLayout { case Global.ZEN_MODE_NO_INTERRUPTIONS: modeText = mContext.getString(R.string.zen_no_interruptions); break; - default: + case Global.ZEN_MODE_ALARMS: + modeText = mContext.getString(R.string.zen_alarms); + break; + default: return; } announceForAccessibility(mContext.getString(R.string.zen_mode_and_condition, modeText, @@ -761,17 +815,21 @@ public class ZenModePanel extends LinearLayout { private void select(final Condition condition) { if (DEBUG) Log.d(mTag, "select " + condition); - final boolean isForever = isForever(condition); + if (mSessionZen == -1 || mSessionZen == Global.ZEN_MODE_OFF) { + if (DEBUG) Log.d(mTag, "Ignoring condition selection outside of manual zen"); + return; + } + final Uri realConditionId = getRealConditionId(condition); if (mController != null) { AsyncTask.execute(new Runnable() { @Override public void run() { - mController.setExitCondition(isForever ? null : condition); + mController.setZen(mSessionZen, realConditionId, TAG + ".selectCondition"); } }); } setExitCondition(condition); - if (isForever) { + if (realConditionId == null) { mPrefs.setMinuteIndex(-1); } else if (isCountdown(condition) && mBucketIndex != -1) { mPrefs.setMinuteIndex(mBucketIndex); @@ -799,24 +857,20 @@ public class ZenModePanel extends LinearLayout { private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() { @Override - public void onZenChanged(int zen) { - mHandler.obtainMessage(H.UPDATE_ZEN, zen, 0).sendToTarget(); - } - @Override public void onConditionsChanged(Condition[] conditions) { mHandler.obtainMessage(H.UPDATE_CONDITIONS, conditions).sendToTarget(); } @Override - public void onExitConditionChanged(Condition exitCondition) { - mHandler.obtainMessage(H.EXIT_CONDITION_CHANGED, exitCondition).sendToTarget(); + public void onManualRuleChanged(ZenRule rule) { + mHandler.obtainMessage(H.MANUAL_RULE_CHANGED, rule).sendToTarget(); } }; private final class H extends Handler { private static final int UPDATE_CONDITIONS = 1; - private static final int EXIT_CONDITION_CHANGED = 2; - private static final int UPDATE_ZEN = 3; + private static final int MANUAL_RULE_CHANGED = 2; + private static final int UPDATE_WIDGETS = 3; private H() { super(Looper.getMainLooper()); @@ -824,18 +878,17 @@ public class ZenModePanel extends LinearLayout { @Override public void handleMessage(Message msg) { - if (msg.what == UPDATE_CONDITIONS) { - handleUpdateConditions((Condition[]) msg.obj); - } else if (msg.what == EXIT_CONDITION_CHANGED) { - handleExitConditionChanged((Condition) msg.obj); - } else if (msg.what == UPDATE_ZEN) { - handleUpdateZen(msg.arg1); + switch (msg.what) { + case UPDATE_CONDITIONS: handleUpdateConditions((Condition[]) msg.obj); break; + case MANUAL_RULE_CHANGED: handleUpdateManualRule((ZenRule) msg.obj); break; + case UPDATE_WIDGETS: updateWidgets(); break; } } } public interface Callback { void onMoreSettings(); + void onPrioritySettings(); void onInteraction(); void onExpanded(boolean expanded); } @@ -849,21 +902,20 @@ public class ZenModePanel extends LinearLayout { Condition condition; } - private final class Prefs implements OnSharedPreferenceChangeListener { - private static final String KEY_MINUTE_INDEX = "minuteIndex"; - private static final String KEY_NONE_SELECTED = "noneSelected"; - + private final class ZenPrefs implements OnSharedPreferenceChangeListener { private final int mNoneDangerousThreshold; private int mMinuteIndex; private int mNoneSelected; + private boolean mConfirmedIntroduction; - private Prefs() { + private ZenPrefs() { mNoneDangerousThreshold = mContext.getResources() .getInteger(R.integer.zen_mode_alarm_warning_threshold); - prefs().registerOnSharedPreferenceChangeListener(this); + Prefs.registerListener(mContext, this); updateMinuteIndex(); updateNoneSelected(); + updateConfirmedIntroduction(); } public boolean isNoneDangerous() { @@ -874,7 +926,7 @@ public class ZenModePanel extends LinearLayout { mNoneSelected = clampNoneSelected(mNoneSelected + 1); if (DEBUG) Log.d(mTag, "Setting none selected: " + mNoneSelected + " threshold=" + mNoneDangerousThreshold); - prefs().edit().putInt(KEY_NONE_SELECTED, mNoneSelected).apply(); + Prefs.putInt(mContext, Prefs.Key.DND_NONE_SELECTED, mNoneSelected); } public int getMinuteIndex() { @@ -886,21 +938,19 @@ public class ZenModePanel extends LinearLayout { if (minuteIndex == mMinuteIndex) return; mMinuteIndex = clampIndex(minuteIndex); if (DEBUG) Log.d(mTag, "Setting favorite minute index: " + mMinuteIndex); - prefs().edit().putInt(KEY_MINUTE_INDEX, mMinuteIndex).apply(); + Prefs.putInt(mContext, Prefs.Key.DND_FAVORITE_BUCKET_INDEX, mMinuteIndex); } @Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { updateMinuteIndex(); updateNoneSelected(); - } - - private SharedPreferences prefs() { - return mContext.getSharedPreferences(mContext.getPackageName(), 0); + updateConfirmedIntroduction(); } private void updateMinuteIndex() { - mMinuteIndex = clampIndex(prefs().getInt(KEY_MINUTE_INDEX, DEFAULT_BUCKET_INDEX)); + mMinuteIndex = clampIndex(Prefs.getInt(mContext, + Prefs.Key.DND_FAVORITE_BUCKET_INDEX, DEFAULT_BUCKET_INDEX)); if (DEBUG) Log.d(mTag, "Favorite minute index: " + mMinuteIndex); } @@ -909,24 +959,34 @@ public class ZenModePanel extends LinearLayout { } private void updateNoneSelected() { - mNoneSelected = clampNoneSelected(prefs().getInt(KEY_NONE_SELECTED, 0)); + mNoneSelected = clampNoneSelected(Prefs.getInt(mContext, + Prefs.Key.DND_NONE_SELECTED, 0)); if (DEBUG) Log.d(mTag, "None selected: " + mNoneSelected); } private int clampNoneSelected(int noneSelected) { return MathUtils.constrain(noneSelected, 0, Integer.MAX_VALUE); } + + private void updateConfirmedIntroduction() { + final boolean confirmed = Prefs.getBoolean(mContext, + Prefs.Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, false); + if (confirmed == mConfirmedIntroduction) return; + mConfirmedIntroduction = confirmed; + if (DEBUG) Log.d(mTag, "Confirmed introduction: " + mConfirmedIntroduction); + } } private final SegmentedButtons.Callback mZenButtonsCallback = new SegmentedButtons.Callback() { @Override public void onSelected(final Object value) { - if (value != null && mZenButtons.isShown()) { + if (value != null && mZenButtons.isShown() && isAttachedToWindow()) { if (DEBUG) Log.d(mTag, "mZenButtonsCallback selected=" + value); + final Uri realConditionId = getRealConditionId(mSessionExitCondition); AsyncTask.execute(new Runnable() { @Override public void run() { - mController.setZen((Integer) value); + mController.setZen((Integer) value, realConditionId, TAG + ".selectZen"); } }); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HeadsUpNotificationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HeadsUpNotificationTest.java deleted file mode 100644 index e8a80d9..0000000 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HeadsUpNotificationTest.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.systemui.statusbar.policy; - -import static org.mockito.Matchers.anyInt; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.when; - -import android.app.Notification; -import android.os.*; -import android.service.notification.StatusBarNotification; -import com.android.systemui.SwipeHelper; -import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.ExpandableNotificationRow; -import com.android.systemui.statusbar.NotificationData; -import com.android.systemui.statusbar.phone.PhoneStatusBar; - -import org.mockito.ArgumentCaptor; -import org.mockito.InOrder; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; - -/** - * Test the Heads Up Notification. - * - * Specifically the policy that a notificaiton must remain visibile for a minimum period of time. - */ -public class HeadsUpNotificationTest extends SysuiTestCase { - private static final String TAG = "HeadsUpNotificationTest"; - - private static int TOUCH_SENSITIVITY = 100; - private static int NOTIFICATION_DECAY = 10000; - private static int MINIMUM_DISPLAY_TIME = 3000; - private static int SNOOZE_TIME = 60000; - private static long TOO_SOON = 1000L; // less than MINIMUM_DISPLAY_TIME - private static long LATER = 5000L; // more than MINIMUM_DISPLAY_TIME - private static long REMAINING_VISIBILITY = MINIMUM_DISPLAY_TIME - TOO_SOON; - - protected HeadsUpNotificationView mHeadsUp; - - @Mock protected PhoneStatusBar mMockStatusBar; - @Mock private HeadsUpNotificationView.Clock mClock; - @Mock private SwipeHelper mMockSwipeHelper; - @Mock private HeadsUpNotificationView.EdgeSwipeHelper mMockEdgeSwipeHelper; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - MockitoAnnotations.initMocks(this); - - mHeadsUp = new HeadsUpNotificationView(mContext, - mClock, mMockSwipeHelper, mMockEdgeSwipeHelper, - NOTIFICATION_DECAY, MINIMUM_DISPLAY_TIME, TOUCH_SENSITIVITY, SNOOZE_TIME); - mHeadsUp.setBar(mMockStatusBar); - } - - private NotificationData.Entry makeNotification(String key) { - StatusBarNotification sbn = mock(StatusBarNotification.class); - when(sbn.getKey()).thenReturn(key); - return new NotificationData.Entry(sbn, null); - } - - public void testPostAndDecay() { - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpOpen(); - ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); - Mockito.verify(mMockStatusBar).scheduleHeadsUpDecay(decayArg.capture()); - // New notification gets a full decay time. - assertEquals(NOTIFICATION_DECAY, (long) decayArg.getValue()); - } - - public void testPostAndDeleteTooSoon() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); - mHeadsUp.removeNotification(a.key); - ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); - Mockito.verify(mMockStatusBar).scheduleHeadsUpDecay(decayArg.capture()); - // Leave the window up for the balance of the minumum time. - assertEquals(REMAINING_VISIBILITY, (long) decayArg.getValue()); - } - - public void testPostAndDeleteLater() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(LATER); - mHeadsUp.removeNotification(a.key); - // Delete closes immediately if the minimum time window is satisfied. - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpClose(); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); - } - - // This is a bad test. It should not care that there is a call to scheduleHeadsUpClose(), - // but it happens that there will be one, so it is important that it happen before the - // call to scheduleHeadsUpOpen(), so that the final state is open. - // Maybe mMockStatusBar should instead be a fake that tracks the open/closed state. - public void testPostAndReplaceTooSoon() { - InOrder callOrder = inOrder(mMockStatusBar); - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); - NotificationData.Entry b = makeNotification("b"); - mHeadsUp.showNotification(b); - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpClose(); - ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); - // New notification gets a full decay time. - assertEquals(NOTIFICATION_DECAY, (long) decayArg.getValue()); - - // Make sure close was called before open, so that the heads up stays open. - callOrder.verify(mMockStatusBar).scheduleHeadsUpClose(); - callOrder.verify(mMockStatusBar).scheduleHeadsUpOpen(); - } - - public void testPostAndUpdateAlertAgain() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); - mHeadsUp.updateNotification(a, true); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); - ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); - // Alert again gets a full decay time. - assertEquals(NOTIFICATION_DECAY, (long) decayArg.getValue()); - } - - public void testPostAndUpdateAlertAgainFastFail() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); - NotificationData.Entry a_prime = makeNotification("a"); - mHeadsUp.updateNotification(a_prime, true); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); - ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); - // Alert again gets a full decay time. - assertEquals(NOTIFICATION_DECAY, (long) decayArg.getValue()); - } - - public void testPostAndUpdateNoAlertAgain() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); - mHeadsUp.updateNotification(a, false); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); - } - - public void testPostAndUpdateNoAlertAgainFastFail() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); - NotificationData.Entry a_prime = makeNotification("a"); - mHeadsUp.updateNotification(a_prime, false); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); - } - - public void testPostAndUpdateLowPriorityTooSoon() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); - mHeadsUp.release(); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); - ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); - // Down grade on update leaves the window up for the balance of the minumum time. - assertEquals(REMAINING_VISIBILITY, (long) decayArg.getValue()); - } - - public void testPostAndUpdateLowPriorityTooSoonFastFail() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(TOO_SOON); - NotificationData.Entry a_prime = makeNotification("a"); - mHeadsUp.updateNotification(a_prime, false); - mHeadsUp.release(); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpClose(); - ArgumentCaptor<Long> decayArg = ArgumentCaptor.forClass(Long.class); - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpDecay(decayArg.capture()); - // Down grade on update leaves the window up for the balance of the minumum time. - assertEquals(REMAINING_VISIBILITY, (long) decayArg.getValue()); - } - - public void testPostAndUpdateLowPriorityLater() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(LATER); - mHeadsUp.release(); - // Down grade on update closes immediately if the minimum time window is satisfied. - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpClose(); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); - } - - public void testPostAndUpdateLowPriorityLaterFastFail() { - when(mClock.currentTimeMillis()).thenReturn(0L); - NotificationData.Entry a = makeNotification("a"); - mHeadsUp.showNotification(a); - reset(mMockStatusBar); - - when(mClock.currentTimeMillis()).thenReturn(LATER); - NotificationData.Entry a_prime = makeNotification("a"); - mHeadsUp.updateNotification(a_prime, false); - mHeadsUp.release(); - // Down grade on update closes immediately if the minimum time window is satisfied. - Mockito.verify(mMockStatusBar, times(1)).scheduleHeadsUpClose(); - Mockito.verify(mMockStatusBar, never()).scheduleHeadsUpDecay(anyInt()); - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 5d88407..5d40eed 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -279,7 +279,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { // TODO: Verify all fields. Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setMobileDataIndicators( - visibleArg.capture(), iconArg.capture(), typeIconArg.capture(), + visibleArg.capture(), iconArg.capture(), iconArg.capture(), typeIconArg.capture(), ArgumentCaptor.forClass(String.class).capture(), ArgumentCaptor.forClass(String.class).capture(), ArgumentCaptor.forClass(Boolean.class).capture(), |