From fb1e987c09d3f812125902371553c02452842102 Mon Sep 17 00:00:00 2001 From: Pranav Vashi Date: Thu, 11 Dec 2025 06:33:26 +0530 Subject: [PATCH 01/13] KeyGestureController: Fix screenshot shortcut crash Signed-off-by: Pranav Vashi --- .../server/input/KeyGestureController.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java index 01f6db63b604a..7292c30732aa5 100644 --- a/services/core/java/com/android/server/input/KeyGestureController.java +++ b/services/core/java/com/android/server/input/KeyGestureController.java @@ -1927,14 +1927,14 @@ public void handleKeyGestureEvent(@NonNull KeyGestureEvent event, break; case KeyGestureEvent.KEY_GESTURE_TYPE_TAKE_SCREENSHOT: if (complete) { - mHandler.sendMessage(mHandler.obtainMessage(MSG_SCREENSHOT_SHORTCUT, - new TakeScreenshotData( - SCREENSHOT_KEY_OTHER, - WindowManager.TAKE_SCREENSHOT_FULLSCREEN, - event.getDisplayId() - ) - ) - ); + mHandler.sendMessage( + mHandler.obtainMessage( + MSG_SCREENSHOT_SHORTCUT, + new TakeScreenshotData( + SCREENSHOT_KEY_OTHER, + WindowManager.TAKE_SCREENSHOT_FULLSCREEN, + event.getDisplayId() + ))); } break; case KeyGestureEvent.KEY_GESTURE_TYPE_SCREENSHOT_CHORD: From bb7756d61b863b036a27b81f855ec686e7de6440 Mon Sep 17 00:00:00 2001 From: DennySPb Date: Fri, 9 Feb 2024 11:31:27 +0300 Subject: [PATCH 02/13] Add some fwb stubs from Oplus This fixes Realme Link crash issue Realme link tries to use reflection api for some oplus methods. Normally the are not presents if it is not oppo phone. They catch exception and all work fine, but on oplus/realme phones with imported oplus fwk for camera this doesn't work because we have these methods in separate boot jar and got denial from system on these hidden api methods. So, just move this harmless crap to FWB and annotate it properly. Change-Id: I5ffecc9be52505371400b0b976c5f14e66bd853d Signed-off-by: Pranav Vashi --- core/java/com/oplus/theme/OplusThemeUtil.java | 9 +++++++++ core/java/com/oplus/util/OplusTypeCastingHelper.java | 3 +++ 2 files changed, 12 insertions(+) create mode 100644 core/java/com/oplus/theme/OplusThemeUtil.java create mode 100644 core/java/com/oplus/util/OplusTypeCastingHelper.java diff --git a/core/java/com/oplus/theme/OplusThemeUtil.java b/core/java/com/oplus/theme/OplusThemeUtil.java new file mode 100644 index 0000000000000..cea1cfd31b834 --- /dev/null +++ b/core/java/com/oplus/theme/OplusThemeUtil.java @@ -0,0 +1,9 @@ +package com.oplus.theme; + +import android.compat.annotation.UnsupportedAppUsage; + +public class OplusThemeUtil { + /** @hide */ + @UnsupportedAppUsage + public static String CUSTOM_THEME_PATH = "/data/theme/com.oplus.camera"; +} diff --git a/core/java/com/oplus/util/OplusTypeCastingHelper.java b/core/java/com/oplus/util/OplusTypeCastingHelper.java new file mode 100644 index 0000000000000..fb89699ee3739 --- /dev/null +++ b/core/java/com/oplus/util/OplusTypeCastingHelper.java @@ -0,0 +1,3 @@ +package com.oplus.util; + +public final class OplusTypeCastingHelper { } From 6acab60b21f7ccb0b6627a6c4dcf9333b9bc2e3b Mon Sep 17 00:00:00 2001 From: arnodorian-r Date: Fri, 8 Nov 2024 10:40:33 -0500 Subject: [PATCH 03/13] OplusTypeCastingHelper: update stub Signed-off-by: Pranav Vashi --- core/java/com/oplus/util/OplusTypeCastingHelper.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/java/com/oplus/util/OplusTypeCastingHelper.java b/core/java/com/oplus/util/OplusTypeCastingHelper.java index fb89699ee3739..4819e9f20b720 100644 --- a/core/java/com/oplus/util/OplusTypeCastingHelper.java +++ b/core/java/com/oplus/util/OplusTypeCastingHelper.java @@ -1,3 +1,10 @@ package com.oplus.util; -public final class OplusTypeCastingHelper { } +public final class OplusTypeCastingHelper { + public static T typeCasting(Class type, Object object) { + if (object != null && type.isInstance(object)) { + return type.cast(object); + } + return null; + } +} From 0c9becdde3793f04b2f78fe960b21c2a20d20b36 Mon Sep 17 00:00:00 2001 From: realahnet Date: Mon, 18 May 2026 08:32:56 -0400 Subject: [PATCH 04/13] core: treat redraws and stretch effects as movement Solves stretch animations not voting high hint. This is the second ARR-focused change to View after b7b6905e1153 Signed-off-by: Pranav Vashi --- core/java/android/view/View.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index b1949cf01f9e1..2294339551a96 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -24117,6 +24117,10 @@ public RenderNode updateDisplayListIfDirty() { mPrivateFlags4 |= PFLAG4_HAS_DRAWN; + // Treat as a move for preferred frame rate purposes + // This solves refresh rate drops during any stretch effects + mPrivateFlags4 |= PFLAG4_HAS_MOVED; + // Fast path for layouts with no backgrounds if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) { dispatchDraw(canvas); From 347c92771fc674dee0fd6c771ada2a5de61a7ad5 Mon Sep 17 00:00:00 2001 From: Lup Gabriel Date: Wed, 3 Jun 2026 22:36:04 +0300 Subject: [PATCH 05/13] New translations (#1311) Signed-off-by: Pranav Vashi --- core/res/res/values-ar-rSA/cr_strings.xml | 8 +- core/res/res/values-az-rAZ/cr_strings.xml | 8 +- core/res/res/values-be-rBY/cr_strings.xml | 8 +- core/res/res/values-bg-rBG/cr_strings.xml | 8 +- core/res/res/values-ca-rES/cr_strings.xml | 8 +- core/res/res/values-cs-rCZ/cr_strings.xml | 8 +- core/res/res/values-de-rDE/cr_strings.xml | 8 +- core/res/res/values-el-rGR/cr_strings.xml | 8 +- core/res/res/values-es-rES/cr_strings.xml | 8 +- core/res/res/values-et-rEE/cr_strings.xml | 8 +- core/res/res/values-fa-rIR/cr_strings.xml | 8 +- core/res/res/values-fi-rFI/cr_strings.xml | 8 +- core/res/res/values-fr-rFR/cr_strings.xml | 8 +- core/res/res/values-hu-rHU/cr_strings.xml | 8 +- core/res/res/values-in-rID/cr_strings.xml | 8 +- core/res/res/values-it-rIT/cr_strings.xml | 8 +- core/res/res/values-iw-rIL/cr_strings.xml | 8 +- core/res/res/values-ja-rJP/cr_strings.xml | 8 +- core/res/res/values-ko-rKR/cr_strings.xml | 8 +- core/res/res/values-ku-rTR/cr_strings.xml | 8 +- core/res/res/values-nl-rNL/cr_strings.xml | 8 +- core/res/res/values-pl-rPL/cr_strings.xml | 8 +- core/res/res/values-pt-rBR/cr_strings.xml | 8 +- core/res/res/values-pt-rPT/cr_strings.xml | 8 +- core/res/res/values-ro-rRO/cr_strings.xml | 8 +- core/res/res/values-ru-rRU/cr_strings.xml | 8 +- core/res/res/values-sat-rIN/cr_strings.xml | 8 +- core/res/res/values-sk-rSK/cr_strings.xml | 8 +- core/res/res/values-tr-rTR/cr_strings.xml | 8 +- core/res/res/values-uk-rUA/cr_strings.xml | 8 +- core/res/res/values-vi-rVN/cr_strings.xml | 8 +- core/res/res/values-zh-rCN/cr_strings.xml | 8 +- core/res/res/values-zh-rTW/cr_strings.xml | 8 +- .../SystemUI/res/values-ar-rSA/cr_strings.xml | 187 +++++++++--------- .../SystemUI/res/values-az-rAZ/cr_strings.xml | 1 - .../SystemUI/res/values-be-rBY/cr_strings.xml | 1 - .../SystemUI/res/values-bg-rBG/cr_strings.xml | 1 - .../SystemUI/res/values-ca-rES/cr_strings.xml | 1 - .../SystemUI/res/values-cs-rCZ/cr_strings.xml | 1 - .../SystemUI/res/values-de-rDE/cr_strings.xml | 1 - .../SystemUI/res/values-el-rGR/cr_strings.xml | 1 - .../SystemUI/res/values-es-rES/cr_strings.xml | 183 +++++++++-------- .../SystemUI/res/values-et-rEE/cr_strings.xml | 1 - .../SystemUI/res/values-fa-rIR/cr_strings.xml | 1 - .../SystemUI/res/values-fi-rFI/cr_strings.xml | 1 - .../SystemUI/res/values-fr-rFR/cr_strings.xml | 1 - .../SystemUI/res/values-hu-rHU/cr_strings.xml | 1 - .../SystemUI/res/values-in-rID/cr_strings.xml | 1 - .../SystemUI/res/values-it-rIT/cr_strings.xml | 1 - .../SystemUI/res/values-iw-rIL/cr_strings.xml | 1 - .../SystemUI/res/values-ja-rJP/cr_strings.xml | 1 - .../SystemUI/res/values-ko-rKR/cr_strings.xml | 7 +- .../SystemUI/res/values-ku-rTR/cr_strings.xml | 1 - .../SystemUI/res/values-nl-rNL/cr_strings.xml | 1 - .../SystemUI/res/values-pl-rPL/cr_strings.xml | 7 +- .../SystemUI/res/values-pt-rBR/cr_strings.xml | 1 - .../SystemUI/res/values-pt-rPT/cr_strings.xml | 11 +- .../SystemUI/res/values-ro-rRO/cr_strings.xml | 1 - .../SystemUI/res/values-ru-rRU/cr_strings.xml | 1 - .../res/values-sat-rIN/cr_strings.xml | 1 - .../SystemUI/res/values-sk-rSK/cr_strings.xml | 1 - .../SystemUI/res/values-tr-rTR/cr_strings.xml | 3 +- .../SystemUI/res/values-uk-rUA/cr_strings.xml | 1 - .../SystemUI/res/values-vi-rVN/cr_strings.xml | 35 ++-- .../SystemUI/res/values-zh-rCN/cr_strings.xml | 7 +- .../SystemUI/res/values-zh-rTW/cr_strings.xml | 9 +- 66 files changed, 418 insertions(+), 319 deletions(-) diff --git a/core/res/res/values-ar-rSA/cr_strings.xml b/core/res/res/values-ar-rSA/cr_strings.xml index becad2ce67d89..89f5fc0a2cddb 100644 --- a/core/res/res/values-ar-rSA/cr_strings.xml +++ b/core/res/res/values-ar-rSA/cr_strings.xml @@ -8,6 +8,12 @@ نسخ رابط سجل العُطل تم نسخ الرابط بنجاح حدث خطأ أثناء نسخ رابط السجل + + مرر مجدداً لفتح الإيماءات + + أضيفت %s إلى GameSpace + + افتح %1$s وضع الجيب نشط رسم توضيحي للهاتف في الجيب @@ -16,6 +22,4 @@ 2. اضغط مع الاستمرار على زر الطاقة للخروج من وضع الجيب. المكالمات والإشعارات ستصدر رنيناً - - أضيفت %s إلى GameSpace diff --git a/core/res/res/values-az-rAZ/cr_strings.xml b/core/res/res/values-az-rAZ/cr_strings.xml index 069398eaa15fb..488a8805c8544 100644 --- a/core/res/res/values-az-rAZ/cr_strings.xml +++ b/core/res/res/values-az-rAZ/cr_strings.xml @@ -8,6 +8,12 @@ Çökmə jurnal URL-sini kopyala URL uğurla kopyalandı An error occured while uploading the log to Pasty + + Swipe again to unlock gestures + + %s added to GameSpace + + Unlock %1$s Pocket mode is active Illustration of phone in pocket @@ -16,6 +22,4 @@ 2. Press and hold the power button to exit pocket mode. Calls and notifications will ring - - %s added to GameSpace diff --git a/core/res/res/values-be-rBY/cr_strings.xml b/core/res/res/values-be-rBY/cr_strings.xml index a45483546f4f8..cdf5839053f90 100644 --- a/core/res/res/values-be-rBY/cr_strings.xml +++ b/core/res/res/values-be-rBY/cr_strings.xml @@ -8,6 +8,12 @@ Капіяваць спасылку журнала памылкі Спасылка паспяхова скапіявана Адбылася памылка падчас загрузкі лога на Pasty + + Правядзіце яшчэ раз, каб разблакіраваць жэсты + + %s added to GameSpace + + Разблакіраваць %1$s Рэжым \"У кішэні\" уключаны Ілюстрацыя тэлефона ў кішэні @@ -16,6 +22,4 @@ 2. Каб выйсці з кішэннага рэжыму, націсніце і ўтрымлівайце кнопку сілкавання. Calls and notifications will ring - - %s added to GameSpace diff --git a/core/res/res/values-bg-rBG/cr_strings.xml b/core/res/res/values-bg-rBG/cr_strings.xml index 9fb1eb5738a72..bb4d8964ac586 100644 --- a/core/res/res/values-bg-rBG/cr_strings.xml +++ b/core/res/res/values-bg-rBG/cr_strings.xml @@ -8,6 +8,12 @@ Копиране на URL адреса на регистъра за сривове URL aдресът е копиран успешно Възникна грешка при качването на лога в Pasty + + Плъзни отново да отключиш жестове + + %s е добавен към GameSpace + + Отключи %1$s Джобен режим е активен Илюстрация на телефон в джоб @@ -16,6 +22,4 @@ 2. Натисни и задържи копчето за захранване да излезеш от джобния режим. Повиквания и известия ще звънят - - %s е добавен към GameSpace diff --git a/core/res/res/values-ca-rES/cr_strings.xml b/core/res/res/values-ca-rES/cr_strings.xml index fc5f1858fcad8..addf3c7d7ce39 100644 --- a/core/res/res/values-ca-rES/cr_strings.xml +++ b/core/res/res/values-ca-rES/cr_strings.xml @@ -8,6 +8,12 @@ Copiar URL del registre d\'errors URL copiada amb èxit Hi ha hagut un error mentre es carregava el registre a Pasty + + Swipe again to unlock gestures + + %s added to GameSpace + + Desbloqueja %1$s Pocket mode is active Illustration of phone in pocket @@ -16,6 +22,4 @@ 2. Press and hold the power button to exit pocket mode. Calls and notifications will ring - - %s added to GameSpace diff --git a/core/res/res/values-cs-rCZ/cr_strings.xml b/core/res/res/values-cs-rCZ/cr_strings.xml index ade81d01d818b..c078620fcae22 100644 --- a/core/res/res/values-cs-rCZ/cr_strings.xml +++ b/core/res/res/values-cs-rCZ/cr_strings.xml @@ -8,6 +8,12 @@ Kopírovat URL protokolu o\u00a0selhání URL byla úspěšně zkopírována Při nahrávání protokolu o\u00a0selhání na Pasty došlo k\u00a0chybě + + Opětovným přejetím odemknete gesta + + Aplikace %s byla přidána do GameSpace + + Odemknout %1$s Režim v kapse je aktivní Ilustrace telefonu v kapse @@ -16,6 +22,4 @@ 2. Chcete-li ukončit režim v kapse, stiskněte a podržte tlačítko napájení. Volání a oznámení budou vyzvánět - - Aplikace %s byla přidána do GameSpace diff --git a/core/res/res/values-de-rDE/cr_strings.xml b/core/res/res/values-de-rDE/cr_strings.xml index 66efbf5fcbff3..ffec92179e701 100644 --- a/core/res/res/values-de-rDE/cr_strings.xml +++ b/core/res/res/values-de-rDE/cr_strings.xml @@ -8,6 +8,12 @@ URL des Absturzberichts kopieren URL erfolgreich kopiert Beim Hochladen des Absturzberichts zu Pasty ist ein Fehler aufgetreten + + Erneut wischen, um Gesten zu verwenden + + %s wurde dem Spielmodus hinzugefügt + + %1$s entsperren Taschenmodus aktiv Abbildung des Telefons in der Tasche @@ -16,6 +22,4 @@ 2. Ein-/Austaste gedrückt halten zum Beenden des Taschenmodus. Bei Anrufen und Benachrichtigungen klingeln - - %s wurde dem Spielmodus hinzugefügt diff --git a/core/res/res/values-el-rGR/cr_strings.xml b/core/res/res/values-el-rGR/cr_strings.xml index 326208455aae4..49b70f276290c 100644 --- a/core/res/res/values-el-rGR/cr_strings.xml +++ b/core/res/res/values-el-rGR/cr_strings.xml @@ -8,6 +8,12 @@ Αντιγραφή διεύθυνσης URL σφάλματος Το URL αντιγράφηκε με επιτυχία Παρουσιάστηκε σφάλμα κατά τη μεταφόρτωση του αρχείου καταγραφής στο Pasty + + Σύρετε ξανά για να ξεκλειδώσετε τις χειρονομίες + + %s προστέθηκε στο Χώρο Παιχνιδιού + + Ξεκλείδωμα %1$s Η λειτουργία τσέπης είναι ενεργή Απεικόνιση του τηλεφώνου στην τσέπη @@ -16,6 +22,4 @@ 2. Πατήστε και κρατήστε πατημένο το κουμπί τροφοδοσίας για να βγείτε από τη λειτουργία τσέπης. Οι κλήσεις και οι ειδοποιήσεις θα ηχούν - - %s προστέθηκε στο Χώρο Παιχνιδιού diff --git a/core/res/res/values-es-rES/cr_strings.xml b/core/res/res/values-es-rES/cr_strings.xml index d0bc0eecf7414..a8973cb1020e4 100644 --- a/core/res/res/values-es-rES/cr_strings.xml +++ b/core/res/res/values-es-rES/cr_strings.xml @@ -8,6 +8,12 @@ Copiar URL del registro de errores URL copiada satisfactoriamente Se ha producido un error cargando el registro a Pasty + + Desliza nuevamente para desbloquear los gestos + + %s añadido a Espacio de Juego + + Desbloquear %1$s Modo juego activado Ilustración del teléfono en el bolsillo @@ -16,6 +22,4 @@ 2. Presiona y mantén el botón de encendido para salir del modo bolsillo. Sonarán las llamadas y las notificaciones - - %s añadido a Espacio de Juego diff --git a/core/res/res/values-et-rEE/cr_strings.xml b/core/res/res/values-et-rEE/cr_strings.xml index fdb03de05dc2a..62cb68741a1a8 100644 --- a/core/res/res/values-et-rEE/cr_strings.xml +++ b/core/res/res/values-et-rEE/cr_strings.xml @@ -8,6 +8,12 @@ Kopeeri rikke logi URL URL kopeeritud Logi Pasty\'sse üleslaadimisel esines viga + + Liigutuste avamiseks pühkige uuesti + + %s added to GameSpace + + Lukusta %1$s lahti Taskurežiim on sees Taskus oleva telefoni illustratsioon @@ -16,6 +22,4 @@ 2. Vajuta ja hoia toitenuppu, et väljuda tasku režiimist. Calls and notifications will ring - - %s added to GameSpace diff --git a/core/res/res/values-fa-rIR/cr_strings.xml b/core/res/res/values-fa-rIR/cr_strings.xml index def8dac433c0a..bfeabb76e7581 100644 --- a/core/res/res/values-fa-rIR/cr_strings.xml +++ b/core/res/res/values-fa-rIR/cr_strings.xml @@ -8,6 +8,12 @@ کپی کردن آدرس گزارش خرابی آدرس با موفقیت کپی شد هنگام بارگزاری گزارش در Pasty خطایی روی داد + + با کشیدن دوباره، حرکات را فعال کنید + + %s به فضای بازی اضافه شد + + بازگشایی %1$s حالت جیب فعال است تصویر گوشی در جیب @@ -16,6 +22,4 @@ 2. دکمه پاور را فشار داده و نگه دارید تا از حالت جیبی خارج شوید. تماس‌ها و اعلان‌ها زنگ خواهند خورد - - %s به فضای بازی اضافه شد diff --git a/core/res/res/values-fi-rFI/cr_strings.xml b/core/res/res/values-fi-rFI/cr_strings.xml index f1d13a8dcc529..3c3788ee2bc83 100644 --- a/core/res/res/values-fi-rFI/cr_strings.xml +++ b/core/res/res/values-fi-rFI/cr_strings.xml @@ -8,6 +8,12 @@ Kopioi kaatumislokin URL-osoite URL-osoite kopioitu onnistuneesti Virhe ladatessa lokia Pasty-palvelimelle + + Swipe again to unlock gestures + + %s added to GameSpace + + Avaa %1$s Pocket mode is active Illustration of phone in pocket @@ -16,6 +22,4 @@ 2. Press and hold the power button to exit pocket mode. Calls and notifications will ring - - %s added to GameSpace diff --git a/core/res/res/values-fr-rFR/cr_strings.xml b/core/res/res/values-fr-rFR/cr_strings.xml index 4091bc1382713..55ef5395097ec 100644 --- a/core/res/res/values-fr-rFR/cr_strings.xml +++ b/core/res/res/values-fr-rFR/cr_strings.xml @@ -8,6 +8,12 @@ Copier l\'URL du rapport d\'erreur URL copiée avec succès Une erreur est survenue pendant l\'envoi du rapport + + Balayez à nouveau pour déverrouiller les gestes + + %s ajouté au mode immersif + + Déverrouiller %1$s Le mode poche est activé Illustration d\'un téléphone dans une poche @@ -16,6 +22,4 @@ 2. Appuyez et maintenez le bouton d\'alimentation pour sortir du mode poche. Les appels et les notifications sonnent - - %s ajouté au mode immersif diff --git a/core/res/res/values-hu-rHU/cr_strings.xml b/core/res/res/values-hu-rHU/cr_strings.xml index 5f7e1192649c7..1657584898410 100644 --- a/core/res/res/values-hu-rHU/cr_strings.xml +++ b/core/res/res/values-hu-rHU/cr_strings.xml @@ -8,6 +8,12 @@ Az összeomlási napló URL-jének másolása Az URL sikeresen másolva Hiba történt a napló Pasty-feltöltése során + + Csúsztasson újból a vezérlések feloldásához + + %s hozzáadva a Játéktérhez + + Feloldja a következőt: %1$s A Zsebmód aktív A zsebben lévő telefon illusztrációja @@ -16,6 +22,4 @@ 2. Tartsa lenyomva a bekapcsológombot a Zsebmódból való lkilépéshez. A hívások és az értesítések rezegni fognak - - %s hozzáadva a Játéktérhez diff --git a/core/res/res/values-in-rID/cr_strings.xml b/core/res/res/values-in-rID/cr_strings.xml index 16e1026a0aff0..c15f24ec3e58f 100644 --- a/core/res/res/values-in-rID/cr_strings.xml +++ b/core/res/res/values-in-rID/cr_strings.xml @@ -8,6 +8,12 @@ Salin URL log kerusakan URL berhasil disalin Terjadi kesalahan pada saat mengunggah log ke Pasty + + Usap lagi untuk membuka kunci gestur + + %s ditambahkan ke Ruang Game + + Buka %1$s Mode saku aktif Ilustrasi telepon di saku @@ -16,6 +22,4 @@ 2. Tekan dan tahan tombol daya untuk keluar dari mode saku. Panggilan dan notifikasi akan berdering - - %s ditambahkan ke Ruang Game diff --git a/core/res/res/values-it-rIT/cr_strings.xml b/core/res/res/values-it-rIT/cr_strings.xml index afb070620b4fb..51d40bed53431 100644 --- a/core/res/res/values-it-rIT/cr_strings.xml +++ b/core/res/res/values-it-rIT/cr_strings.xml @@ -8,6 +8,12 @@ Copia l\'URL del log di crash URL copiato con successo Si è verificato un errore durante il caricamento del log su pasty + + Scorri di nuovo per sbloccare i gesti + + %s aggiunto a GameSpace + + Sblocca %1$s La modalità tasca è attiva Illustrazione del telefono in tasca @@ -16,6 +22,4 @@ 2. Premere e tenere premuto il pulsante di accensione per uscire dalla modalità tasca. Le chiamate e le notifiche squilleranno - - %s aggiunto a GameSpace diff --git a/core/res/res/values-iw-rIL/cr_strings.xml b/core/res/res/values-iw-rIL/cr_strings.xml index d7304d6685400..5fcbfc687ff8c 100644 --- a/core/res/res/values-iw-rIL/cr_strings.xml +++ b/core/res/res/values-iw-rIL/cr_strings.xml @@ -8,6 +8,12 @@ העתק את הקישור של דוח הקריסה הקישור הועתק בהצלחה התרחשה שגיאה במהלך העלאת דו\"ח הקריסה + + החליקו בשנית כדי להתיר מחוות + + %s התווסף ל-GameSpace + + פתיחת הנעילה של %1$s מצב כיס מופעל תרשים של טלפון בכיס @@ -16,6 +22,4 @@ 2. ליחצו והחזיקו את כפתור ההפעלה ליציאה ממצב כיס. שיחות והתראות יצלצלו - - %s התווסף ל-GameSpace diff --git a/core/res/res/values-ja-rJP/cr_strings.xml b/core/res/res/values-ja-rJP/cr_strings.xml index 05726c57b2b40..1c9e4ee0fc71a 100644 --- a/core/res/res/values-ja-rJP/cr_strings.xml +++ b/core/res/res/values-ja-rJP/cr_strings.xml @@ -8,6 +8,12 @@ クラッシュログ URL をコピー URL をコピーしました Pasty へのログのアップロード中にエラーが発生しました + + 再度スワイプしてジェスチャーのロックを解除 + + %sがゲームスペースに追加されました + + %1$s をロック解除 ポケットモードがアクティブです ポケットの中のスマートフォンのイラスト @@ -16,6 +22,4 @@ 2. 電源ボタンを押したままにするとポケットモードを終了します。 着信音と通知音が鳴ります - - %sがゲームスペースに追加されました diff --git a/core/res/res/values-ko-rKR/cr_strings.xml b/core/res/res/values-ko-rKR/cr_strings.xml index fa808203d9b41..9711ebed4cef7 100644 --- a/core/res/res/values-ko-rKR/cr_strings.xml +++ b/core/res/res/values-ko-rKR/cr_strings.xml @@ -8,6 +8,12 @@ 비정상 종료 로그 URL 복사 URL을 복사했습니다. Pasty 서비스에 로그를 업로드하는 중 오류가 발생했습니다. + + 제스처 잠금을 해제하려면 다시 한 번 스와이프하세요. + + %s GameSpace에 추가되었습니다 + + %1$s 잠금 해제 포켓 모드 사용 중 주머니에 들어 있는 기기를 나타낸 그림 @@ -16,6 +22,4 @@ 2. 전원 버튼을 길게 눌러 포켓 모드를 종료합니다. 벨소리 및 알림 소리가 울립니다. - - %s GameSpace에 추가되었습니다 diff --git a/core/res/res/values-ku-rTR/cr_strings.xml b/core/res/res/values-ku-rTR/cr_strings.xml index a8e1b3d7d894d..81b20e994574b 100644 --- a/core/res/res/values-ku-rTR/cr_strings.xml +++ b/core/res/res/values-ku-rTR/cr_strings.xml @@ -8,6 +8,12 @@ لەبەرگرتنەوەی بەستەری کڕاشبوون بەسەرکەوتوویی لەبەرگیرایەوە Di dema barkirina têketinê li Pasty de xeletiyek derket + + Swipe again to unlock gestures + + %s added to GameSpace + + Unlock %1$s Pocket mode is active Illustration of phone in pocket @@ -16,6 +22,4 @@ 2. Press and hold the power button to exit pocket mode. Calls and notifications will ring - - %s added to GameSpace diff --git a/core/res/res/values-nl-rNL/cr_strings.xml b/core/res/res/values-nl-rNL/cr_strings.xml index 06afb9b2ca5df..a3740e098c1c3 100644 --- a/core/res/res/values-nl-rNL/cr_strings.xml +++ b/core/res/res/values-nl-rNL/cr_strings.xml @@ -8,6 +8,12 @@ Kopieer crash log URL URL succesvol gekopieerd Er is een fout opgetreden tijdens het uploaden van het logboek naar Pasty + + Veeg opnieuw om gebaren te ontgrendelen + + %s toegevoegd aan GameSpace + + Ontgrendel %1$s Pocket mode is aan Illustratie van de telefoon in zak @@ -16,6 +22,4 @@ 2. Houd de aan/uit-knop ingedrukt om de broekzak modus te sluiten. Gesprekken en meldingen zullen af gaan - - %s toegevoegd aan GameSpace diff --git a/core/res/res/values-pl-rPL/cr_strings.xml b/core/res/res/values-pl-rPL/cr_strings.xml index e01300eeb94ad..4c99f7ae7bdc8 100644 --- a/core/res/res/values-pl-rPL/cr_strings.xml +++ b/core/res/res/values-pl-rPL/cr_strings.xml @@ -8,6 +8,12 @@ Skopiuj adres URL dziennika awarii URL skopiowany pomyślnie Wystąpił błąd podczas przesyłania dziennika do serwisu Pasty + + Przesuń ponownie, aby odblokować gesty + + %s dodano do Przestrzeni gier + + Odblokuj %1$s Tryb kieszonkowy jest aktywny Ilustracja telefonu w kieszeni @@ -16,6 +22,4 @@ 2. Naciśnij i przytrzymaj przycisk zasilania, aby wyjść z trybu kieszonkowego. Połączenia i powiadomienia będą z dźwiękiem - - %s dodano do przestrzeni gier diff --git a/core/res/res/values-pt-rBR/cr_strings.xml b/core/res/res/values-pt-rBR/cr_strings.xml index 9377164371bd3..c2b754a1b23e0 100644 --- a/core/res/res/values-pt-rBR/cr_strings.xml +++ b/core/res/res/values-pt-rBR/cr_strings.xml @@ -8,6 +8,12 @@ Copiar URL do log de erro URL copiado com sucesso Ocorreu um erro durante o upload do log para o Pasty + + Deslize novamente para desbloquear os gestos + + %s adicionado ao GameSpace + + Desbloquear %1$s Modo de bolso está ativo Ilustração de telefone no bolso @@ -16,6 +22,4 @@ 2. Pressione e segure o botão liga/desliga para sair do modo de bolso. Chamadas e notificações irão tocar - - %s adicionado ao GameSpace diff --git a/core/res/res/values-pt-rPT/cr_strings.xml b/core/res/res/values-pt-rPT/cr_strings.xml index 1d20e1ca3f366..2b43d4d1393c5 100644 --- a/core/res/res/values-pt-rPT/cr_strings.xml +++ b/core/res/res/values-pt-rPT/cr_strings.xml @@ -8,6 +8,12 @@ Copiar URL do registo de falhas URL copiado com sucesso Ocorreu um erro ao enviar o registo para o dogbin + + Deslize novamente para desbloquear os gestos + + %s adicionado ao EspaçoJogo + + Desbloquear %1$s Modo de bolso está ativo Ilustração do telefone no bolso @@ -16,6 +22,4 @@ 2. Pressione e segure o botão de ligar/desligar para sair do modo bolso. As chamadas e as notificações vão tocar - - %s adicionado ao EspaçoJogo diff --git a/core/res/res/values-ro-rRO/cr_strings.xml b/core/res/res/values-ro-rRO/cr_strings.xml index 319bd3008f57a..20117db3f5faa 100644 --- a/core/res/res/values-ro-rRO/cr_strings.xml +++ b/core/res/res/values-ro-rRO/cr_strings.xml @@ -8,6 +8,12 @@ Copiază URL-ul jurnalului de eroare URL-ul a fost copiat cu succes A apărut o eroare la încărcarea registrului în pasty + + Glisați din nou pentru a debloca gesturile + + %s adăugat la GameSpace + + Deblocare %1$s Modul de buzunar este activ Ilustrație de telefon în buzunar @@ -16,6 +22,4 @@ 2. Apăsați și țineți apăsat butonul de pornire pentru a ieși din modul buzunar. Apelurile și notificările vor suna - - %s adăugat la GameSpace diff --git a/core/res/res/values-ru-rRU/cr_strings.xml b/core/res/res/values-ru-rRU/cr_strings.xml index ad699f2a07682..3d23c262eaffb 100644 --- a/core/res/res/values-ru-rRU/cr_strings.xml +++ b/core/res/res/values-ru-rRU/cr_strings.xml @@ -8,6 +8,12 @@ Скопировать ссылку на журнал сбоя Ссылка скопирована Произошла ошибка во время загрузки лога на Pasty + + Проведите ещё раз, чтобы разблокировать жесты + + %s добавлена в GameSpace + + Разблокировать %1$s Режим «В кармане» включен Иллюстрация телефона в кармане @@ -16,6 +22,4 @@ 2. Нажмите и удерживайте кнопку питания, чтобы выйти из режима «В кармане». Звонки и уведомления будут звучать - - %s добавлена в GameSpace diff --git a/core/res/res/values-sat-rIN/cr_strings.xml b/core/res/res/values-sat-rIN/cr_strings.xml index 8137b0bb05276..4132d2ba4d881 100644 --- a/core/res/res/values-sat-rIN/cr_strings.xml +++ b/core/res/res/values-sat-rIN/cr_strings.xml @@ -8,6 +8,12 @@ ᱠᱨᱟᱥ ᱞᱚᱜᱽ URL ᱱᱚᱠᱚᱞ ᱢᱮ URL ᱨᱟᱥ ᱞᱮᱠᱟᱛᱮ ᱱᱚᱠᱚᱞᱮᱱᱟ An error occured while uploading the log to Pasty + + Swipe again to unlock gestures + + %s added to GameSpace + + Unlock %1$s Pocket mode is active Illustration of phone in pocket @@ -16,6 +22,4 @@ 2. Press and hold the power button to exit pocket mode. Calls and notifications will ring - - %s added to GameSpace diff --git a/core/res/res/values-sk-rSK/cr_strings.xml b/core/res/res/values-sk-rSK/cr_strings.xml index 4d809ad81573d..539c1a75f5517 100644 --- a/core/res/res/values-sk-rSK/cr_strings.xml +++ b/core/res/res/values-sk-rSK/cr_strings.xml @@ -8,6 +8,12 @@ Kopírovať adresu URL záznamu o chybe URL úspešne skopírované Pri nahrávaní protokolu o zlyhaní došlo k chybe + + Prejdite prstom znova pre odomknutie gest + + %s pridané do GameSpace + + Odomknúť %1$s Režim detekcie nosenia vo vrecku je aktívny Znázornenie režimu detekcie nosenia vo vrecku @@ -16,6 +22,4 @@ 2. Stlačte a podržte tlačidlo napájania, pre vypnutie režimu detekcie nosenia vo vrecku. Telefonáty a upozornenia budú zvoniť - - %s pridané do GameSpace diff --git a/core/res/res/values-tr-rTR/cr_strings.xml b/core/res/res/values-tr-rTR/cr_strings.xml index 9847e0ace88a7..999d76a33ee1e 100644 --- a/core/res/res/values-tr-rTR/cr_strings.xml +++ b/core/res/res/values-tr-rTR/cr_strings.xml @@ -8,6 +8,12 @@ Kilitlenme günlüğü bağlantısını kopyala Bağlantı başarıyla kopyalandı Kayıt Pasty\'ye yüklenirken bir hata oluştu + + Jestlerin kilidini açmak için tekrar kaydırın + + GameSpace\'e %s eklendi + + Kilidi aç %1$s Cep modu kullanımda Cepteki telefon illüstrasyon @@ -16,6 +22,4 @@ 2. Cep modundan çıkmak için güç düğmesini basılı tutun. Çağrılar ve bildirimlerde zil çalacak - - GameSpace\'e %s eklendi diff --git a/core/res/res/values-uk-rUA/cr_strings.xml b/core/res/res/values-uk-rUA/cr_strings.xml index 20083115dbb18..88f55317258f9 100644 --- a/core/res/res/values-uk-rUA/cr_strings.xml +++ b/core/res/res/values-uk-rUA/cr_strings.xml @@ -8,6 +8,12 @@ Копіювати URL звіту про помилку URL успішно скопійовано Сталася помилка під час завантаження журналу до Pasty + + Проведіть ще раз, щоб розблокувати жести + + %s додано до ігрового простору + + Розблокувати %1$s Кишеньковий режим активний Ілюстрація телефону в кишені @@ -16,6 +22,4 @@ 2. Натисніть і утримуйте кнопку живлення, щоб вийти з кишенькового режиму. Звук для викликів та сповіщень увімкнено - - %s додано до ігрового простору diff --git a/core/res/res/values-vi-rVN/cr_strings.xml b/core/res/res/values-vi-rVN/cr_strings.xml index 605019e82d48d..083471742f9da 100644 --- a/core/res/res/values-vi-rVN/cr_strings.xml +++ b/core/res/res/values-vi-rVN/cr_strings.xml @@ -8,6 +8,12 @@ Sao chép địa chỉ nhật ký sự cố Đã sao chép thành công Đã xảy ra lỗi khi tải nhật ký lên máy chủ + + Vuốt lại để mở khóa cử chỉ + + %s đã thêm vào không gian trò chơi + + Mở khóa %1$s Chế độ bỏ túi đang được bật Hình minh họa điện thoại trong túi @@ -16,6 +22,4 @@ 2. Ấn giữ nút nguồn để tiếp tục. Cuộc gọi & thông báo sẽ đổ chuông - - %s đã thêm vào không gian trò chơi diff --git a/core/res/res/values-zh-rCN/cr_strings.xml b/core/res/res/values-zh-rCN/cr_strings.xml index 14aa3e319bf70..ddb5597d61fe0 100644 --- a/core/res/res/values-zh-rCN/cr_strings.xml +++ b/core/res/res/values-zh-rCN/cr_strings.xml @@ -8,6 +8,12 @@ 复制崩溃日志链接 已成功复制链接 将日志上传到 Pasty 时出错 + + 再次滑动以解锁手势 + + %s 已添加到 游戏空间 + + 解锁应用 %1$s 口袋检测已开启 口袋检测说明 @@ -16,6 +22,4 @@ 2. 按住电源按钮可退出口袋检测。 来电和通知时将响铃 - - %s 已添加到 游戏空间 diff --git a/core/res/res/values-zh-rTW/cr_strings.xml b/core/res/res/values-zh-rTW/cr_strings.xml index 13a18590b97b7..3eda7c49750d2 100644 --- a/core/res/res/values-zh-rTW/cr_strings.xml +++ b/core/res/res/values-zh-rTW/cr_strings.xml @@ -8,6 +8,12 @@ 複製當機紀錄連結 已成功複製連結 上傳紀錄至 Pasty 時發生錯誤 + + 再滑動一次以解鎖手勢 + + %s 已加入 GameSpace + + 解鎖 %1$s 防誤觸模式已啟用 防誤觸模式示意圖 @@ -16,6 +22,4 @@ 2. 長按電源鍵以退出防誤觸模式。 來電與通知將發出鈴聲 - - %s 已加入 GameSpace diff --git a/packages/SystemUI/res/values-ar-rSA/cr_strings.xml b/packages/SystemUI/res/values-ar-rSA/cr_strings.xml index 3b645fb1f3724..294a9a65b15f6 100644 --- a/packages/SystemUI/res/values-ar-rSA/cr_strings.xml +++ b/packages/SystemUI/res/values-ar-rSA/cr_strings.xml @@ -108,9 +108,9 @@ لوحة تحكم الصوت الدقة الذكية - تشغيل - إيقاف - نسبة البكسل + On + Off + Pixel percentage %d%% حدث خطأ أثناء تحميل بيانات الطقس @@ -132,7 +132,7 @@ 5G / NR غير مدعوم - ربط VPN + VPN tethering يتم التعرف على الوجه... @@ -155,101 +155,100 @@ تم حذف تسجيل الشاشة - المؤقت - ساعة الإيقاف - المنبّه - الكشاف - نقطة اتصال - نقطة الاتصال نشطة - VPN نشط - تسجيل الشاشة - قيد التشغيل - إخراج الوسائط - وضع الصوت + Timer + Stopwatch + Alarm + Flashlight + Hotspot + Hotspot Active + VPN Active + Screen Recording + Now Playing + Media output + Sound Mode صامت الاهتزاز نغمة الرنين - جارِ الشحن - لاسلكي - موفر - الموسيقى - منسوخ - منسوخ! - تم نسخ الصورة - نسخ الصورة - صورة الحافظة - الصورة - الرابط - تجاهل - فتح + Charging + Wireless + Saver + Music + Copied + Copied! + Image copied + Copy Image + Clipboard image + Image + URL + Dismiss + Open إيقاف - إيقاف التسجيل - إعادة التعيين - مسح الكل - إظهار المزيد - عرض أقل - تشغيل - إيقاف مؤقت - متوقف مؤقتاً - حفظ - التسجيل - تم - الرنين - قيد التشغيل - تشغيل - التطبيقات الأخيرة - Kill app - مفتوح - تم فتح الجهاز - التقدم - الإرسال إلى - الكاميرا & الميكروفون - الكاميرا - الميكروفون - الكاميرا & الميكروفون - أجهزة %d - الشحن اللاسلكي - حتى الإكتمال - موفر البطارية - الاتصال - مكالمة واردة - متصل - غير متصل - لا توجد أجهزة - جهاز متصل - <xliff:d id="count" example="3">%d</xliff:g> الأجهزة - VPN متصل - مؤمن - جاري الاتصال\u2026 - 1 جهاز - أجهزة بلوتوث + Stop Recording + Reset + Clear All + Show more + Show less + Play + Pause + Paused + Saved + Recording + Done + Ringing + Running + ON + Recents + Unlocked + Device Unlocked + Progress + Casting to + Camera & Microphone + Camera + Microphone + Camera & Mic + %d devices + Wireless Charging + until full + Battery Saver + Call + Incoming Call + Connected + Disconnect + No devices + 1 device connected + %d devices connected + VPN Connected + Secured + Connecting\u2026 + 1 device + Bluetooth device %d apps - الآن - %d منذ دقيقة - %d منذ ساعة - %d منذ يوم - %d منذ اسبوع - استئناف - الحافظة - السابق - التالي - خلْط - إخراج - تسجيل - إرسال - نشط - البصمة - موثوق به - المحاذاة - كاميرا - ميكروفون - التطبيقات الأخيرة - %d جارية.. - ضد - مباشر - النهائي - استراحة مابين الشوطين - القادمة + Just now + %dm ago + %dh ago + %dd ago + %dw ago + Resume + Clipboard + Previous + Next + Shuffle + Output + Rec + Cast + Active + Biometric + Trust + Alignment + Cam + Mic + Recent Apps + %d running + vs + LIVE + Final + Halftime + Upcoming لقطة الشاشة diff --git a/packages/SystemUI/res/values-az-rAZ/cr_strings.xml b/packages/SystemUI/res/values-az-rAZ/cr_strings.xml index f62b536d51e3d..b5f28cea2a708 100644 --- a/packages/SystemUI/res/values-az-rAZ/cr_strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-be-rBY/cr_strings.xml b/packages/SystemUI/res/values-be-rBY/cr_strings.xml index 5511753a24820..4b4163564aae1 100644 --- a/packages/SystemUI/res/values-be-rBY/cr_strings.xml +++ b/packages/SystemUI/res/values-be-rBY/cr_strings.xml @@ -196,7 +196,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-bg-rBG/cr_strings.xml b/packages/SystemUI/res/values-bg-rBG/cr_strings.xml index ce55761228a35..2c97f204f99a3 100644 --- a/packages/SystemUI/res/values-bg-rBG/cr_strings.xml +++ b/packages/SystemUI/res/values-bg-rBG/cr_strings.xml @@ -194,7 +194,6 @@ Бягане Включено Скорошни - Kill app Отключено Устройството е отключено Прогрес diff --git a/packages/SystemUI/res/values-ca-rES/cr_strings.xml b/packages/SystemUI/res/values-ca-rES/cr_strings.xml index ec37b6d56b428..c1e456588a316 100644 --- a/packages/SystemUI/res/values-ca-rES/cr_strings.xml +++ b/packages/SystemUI/res/values-ca-rES/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-cs-rCZ/cr_strings.xml b/packages/SystemUI/res/values-cs-rCZ/cr_strings.xml index 8f75f22d521ec..ca7ec104a1c2d 100644 --- a/packages/SystemUI/res/values-cs-rCZ/cr_strings.xml +++ b/packages/SystemUI/res/values-cs-rCZ/cr_strings.xml @@ -196,7 +196,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-de-rDE/cr_strings.xml b/packages/SystemUI/res/values-de-rDE/cr_strings.xml index 215a690b71cc7..38056268fe17d 100644 --- a/packages/SystemUI/res/values-de-rDE/cr_strings.xml +++ b/packages/SystemUI/res/values-de-rDE/cr_strings.xml @@ -194,7 +194,6 @@ Läuft AN App-Verlauf - App beenden Entsperrt Gerät entsperrt Fortschritt diff --git a/packages/SystemUI/res/values-el-rGR/cr_strings.xml b/packages/SystemUI/res/values-el-rGR/cr_strings.xml index a6110c36eab68..bffd7d22ae539 100644 --- a/packages/SystemUI/res/values-el-rGR/cr_strings.xml +++ b/packages/SystemUI/res/values-el-rGR/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-es-rES/cr_strings.xml b/packages/SystemUI/res/values-es-rES/cr_strings.xml index 0f7e6463bdd41..fe9c448e097b9 100644 --- a/packages/SystemUI/res/values-es-rES/cr_strings.xml +++ b/packages/SystemUI/res/values-es-rES/cr_strings.xml @@ -108,9 +108,9 @@ Panel de volumen Píxeles inteligentes - Activado - Desactivado - Porcentaje de píxeles + On + Off + Pixel percentage %d%% Error al cargar datos del clima @@ -151,101 +151,100 @@ Grabación de pantalla eliminada - Temporizador - Cronómetro - Alarma - Linterna - Punto de acceso - Punto de acceso activo - VPN activa - Grabación de pantalla - Reproduciendo - Salida multimedia - Modo de sonido + Timer + Stopwatch + Alarm + Flashlight + Hotspot + Hotspot Active + VPN Active + Screen Recording + Now Playing + Media output + Sound Mode Vibrar Timbre - Cargando - Inalámbrico - Ahorro - Música - Copiado - ¡Copiado! - Imagen copiada - Copiar imagen - Imagen del portapapeles - Imagen + Charging + Wireless + Saver + Music + Copied + Copied! + Image copied + Copy Image + Clipboard image + Image URL - Descartar - Abrir + Dismiss + Open Detener - Detener grabación - Reiniciar - Borrar todo - Mostrar más - Mostrar menos - Reproducir - Pausar - En pausa - Guardado - Grabando - Hecho - Sonando - En ejecución - ACTIVADO - Recientes - Finalizar aplicación - Desbloqueado - Dispositivo desbloqueado - Progreso - Transmitiendo a - Cámara & Micrófono - Cámara - Micrófono - Cámara & Micro - %d dispositivos - Carga inalámbrica - hasta que se complete - Ahorro de batería - Llamada - Llamada entrante - Conectado - Desconectar - No hay dispositivos - 1 dispositivo conectado - %d dispositivos conectados - VPN Conectada - Seguro - Conectando\u2026 - 1 dispositivo - Dispositivo Bluetooth - %d aplicaciones - Justo ahora - %d minutos atrás - %dhoras atrás - %ddías atrás - %dsemanas atrás - Reanudar - Portapapeles - Anterior - Siguiente - Aleatorio - Salida - Grabar - Transmitir - Activo - Biométrico - Confianza - Alineación - Cámara - Micrófono - Aplicaciones recientes - %d en ejecución - contra - EN VIVO + Stop Recording + Reset + Clear All + Show more + Show less + Play + Pause + Paused + Saved + Recording + Done + Ringing + Running + ON + Recents + Unlocked + Device Unlocked + Progress + Casting to + Camera & Microphone + Camera + Microphone + Camera & Mic + %d devices + Wireless Charging + until full + Battery Saver + Call + Incoming Call + Connected + Disconnect + No devices + 1 device connected + %d devices connected + VPN Connected + Secured + Connecting\u2026 + 1 device + Bluetooth device + %d apps + Just now + %dm ago + %dh ago + %dd ago + %dw ago + Resume + Clipboard + Previous + Next + Shuffle + Output + Rec + Cast + Active + Biometric + Trust + Alignment + Cam + Mic + Recent Apps + %d running + vs + LIVE Final - Medio tiempo - Próximamente + Halftime + Upcoming Captura de pantalla diff --git a/packages/SystemUI/res/values-et-rEE/cr_strings.xml b/packages/SystemUI/res/values-et-rEE/cr_strings.xml index 366765f750e0f..4da32f55edc0b 100644 --- a/packages/SystemUI/res/values-et-rEE/cr_strings.xml +++ b/packages/SystemUI/res/values-et-rEE/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-fa-rIR/cr_strings.xml b/packages/SystemUI/res/values-fa-rIR/cr_strings.xml index 265cb9a23ccab..116f9bbf84914 100644 --- a/packages/SystemUI/res/values-fa-rIR/cr_strings.xml +++ b/packages/SystemUI/res/values-fa-rIR/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-fi-rFI/cr_strings.xml b/packages/SystemUI/res/values-fi-rFI/cr_strings.xml index 285224d74bef6..da8487b062f3c 100644 --- a/packages/SystemUI/res/values-fi-rFI/cr_strings.xml +++ b/packages/SystemUI/res/values-fi-rFI/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-fr-rFR/cr_strings.xml b/packages/SystemUI/res/values-fr-rFR/cr_strings.xml index 0f9cef8916c2a..afc963584efd3 100644 --- a/packages/SystemUI/res/values-fr-rFR/cr_strings.xml +++ b/packages/SystemUI/res/values-fr-rFR/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Récents - Kill app Déverrouillé Appareil déverrouillé Progression diff --git a/packages/SystemUI/res/values-hu-rHU/cr_strings.xml b/packages/SystemUI/res/values-hu-rHU/cr_strings.xml index 1c0013bf2c3ab..e01682ce54933 100644 --- a/packages/SystemUI/res/values-hu-rHU/cr_strings.xml +++ b/packages/SystemUI/res/values-hu-rHU/cr_strings.xml @@ -194,7 +194,6 @@ Folyamatban BE Előzmények - Alkalmazás kilövése Feloldva A készülék feloldva Folyamat diff --git a/packages/SystemUI/res/values-in-rID/cr_strings.xml b/packages/SystemUI/res/values-in-rID/cr_strings.xml index 0de60a2f6d02b..b31211fb9ad88 100644 --- a/packages/SystemUI/res/values-in-rID/cr_strings.xml +++ b/packages/SystemUI/res/values-in-rID/cr_strings.xml @@ -193,7 +193,6 @@ Running ON Recents - Matikan aplikasi Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-it-rIT/cr_strings.xml b/packages/SystemUI/res/values-it-rIT/cr_strings.xml index 45e3f9e5b2585..89ececed0009a 100644 --- a/packages/SystemUI/res/values-it-rIT/cr_strings.xml +++ b/packages/SystemUI/res/values-it-rIT/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-iw-rIL/cr_strings.xml b/packages/SystemUI/res/values-iw-rIL/cr_strings.xml index 80dc406f1ca4b..dd351d885ac6d 100644 --- a/packages/SystemUI/res/values-iw-rIL/cr_strings.xml +++ b/packages/SystemUI/res/values-iw-rIL/cr_strings.xml @@ -196,7 +196,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-ja-rJP/cr_strings.xml b/packages/SystemUI/res/values-ja-rJP/cr_strings.xml index c276ade59e3f1..c654b56e95078 100644 --- a/packages/SystemUI/res/values-ja-rJP/cr_strings.xml +++ b/packages/SystemUI/res/values-ja-rJP/cr_strings.xml @@ -193,7 +193,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-ko-rKR/cr_strings.xml b/packages/SystemUI/res/values-ko-rKR/cr_strings.xml index c504da40c9c5c..af0228781ac22 100644 --- a/packages/SystemUI/res/values-ko-rKR/cr_strings.xml +++ b/packages/SystemUI/res/values-ko-rKR/cr_strings.xml @@ -108,9 +108,9 @@ 음량 패널 스마트 픽셀 - 켜기 - 끄기 - 픽셀 퍼센티지 + On + Off + Pixel percentage %d%% 날씨 데이터를 불러오는 중 오류가 발생했습니다. @@ -193,7 +193,6 @@ 실행중 켜기 최근 - Kill app 잠금 해제됨 기기 잠금 해제됨 진행 상태 diff --git a/packages/SystemUI/res/values-ku-rTR/cr_strings.xml b/packages/SystemUI/res/values-ku-rTR/cr_strings.xml index 8badf69bd263d..06ee349f2cf14 100644 --- a/packages/SystemUI/res/values-ku-rTR/cr_strings.xml +++ b/packages/SystemUI/res/values-ku-rTR/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-nl-rNL/cr_strings.xml b/packages/SystemUI/res/values-nl-rNL/cr_strings.xml index cc304e1c1c4df..58ff5d6711e37 100644 --- a/packages/SystemUI/res/values-nl-rNL/cr_strings.xml +++ b/packages/SystemUI/res/values-nl-rNL/cr_strings.xml @@ -194,7 +194,6 @@ Bezig AAN Recente - App beëindigen Ontgrendeld Apparaat ontgrendeld Voortgang diff --git a/packages/SystemUI/res/values-pl-rPL/cr_strings.xml b/packages/SystemUI/res/values-pl-rPL/cr_strings.xml index 6554fd621dae0..87e677ef6b6e5 100644 --- a/packages/SystemUI/res/values-pl-rPL/cr_strings.xml +++ b/packages/SystemUI/res/values-pl-rPL/cr_strings.xml @@ -108,9 +108,9 @@ Panel głośności Inteligentne piksele - Włącz - Wyłącz - Procent pikseli + On + Off + Pixel percentage %d%% Błąd wczytywania danych o pogodzie @@ -196,7 +196,6 @@ Uruchamianie WŁ. Ostatnio używane - Zakończ aplikację Odblokowano Odblokowano urządzenie Postęp diff --git a/packages/SystemUI/res/values-pt-rBR/cr_strings.xml b/packages/SystemUI/res/values-pt-rBR/cr_strings.xml index bbee443496313..fc78c91584c5b 100644 --- a/packages/SystemUI/res/values-pt-rBR/cr_strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-pt-rPT/cr_strings.xml b/packages/SystemUI/res/values-pt-rPT/cr_strings.xml index 8efe8e6496ce3..0f4fc96a6a8d2 100644 --- a/packages/SystemUI/res/values-pt-rPT/cr_strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/cr_strings.xml @@ -108,9 +108,9 @@ Painel de volume Pixeis Inteligentes - Ligado - Desligado - Percentagem de píxeis + On + Off + Pixel percentage %d%% Erro ao carregar dados meteorológicos @@ -194,11 +194,10 @@ Em execução LIGADO Recentes - Terminar aplicação Desbloqueado Dispositivo desbloqueado Progresso - Transmitindo para + Trasnmitindo para Câmara & Microfone Câmara Microfone @@ -207,7 +206,7 @@ Carregamento sem fio até encher Poupança de Bateria - Chamada + Call Chamada Recebida Conectado Desconectar diff --git a/packages/SystemUI/res/values-ro-rRO/cr_strings.xml b/packages/SystemUI/res/values-ro-rRO/cr_strings.xml index 1dd532a9925f6..5b26cc3f14053 100644 --- a/packages/SystemUI/res/values-ro-rRO/cr_strings.xml +++ b/packages/SystemUI/res/values-ro-rRO/cr_strings.xml @@ -195,7 +195,6 @@ Rulează PORNITĂ Recente - Kill app Deblocat Dispozitiv deblocat Progres diff --git a/packages/SystemUI/res/values-ru-rRU/cr_strings.xml b/packages/SystemUI/res/values-ru-rRU/cr_strings.xml index 8621823e6e08d..3f85af0b1aff1 100644 --- a/packages/SystemUI/res/values-ru-rRU/cr_strings.xml +++ b/packages/SystemUI/res/values-ru-rRU/cr_strings.xml @@ -196,7 +196,6 @@ Выполнение Вкл. Недавние - Закрыть приложение Разблокировано Устройство разблокировано Прогресс diff --git a/packages/SystemUI/res/values-sat-rIN/cr_strings.xml b/packages/SystemUI/res/values-sat-rIN/cr_strings.xml index 7fe8289de2a47..f083031502eef 100644 --- a/packages/SystemUI/res/values-sat-rIN/cr_strings.xml +++ b/packages/SystemUI/res/values-sat-rIN/cr_strings.xml @@ -194,7 +194,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-sk-rSK/cr_strings.xml b/packages/SystemUI/res/values-sk-rSK/cr_strings.xml index 0e119df5db971..ab1a634afc4a0 100644 --- a/packages/SystemUI/res/values-sk-rSK/cr_strings.xml +++ b/packages/SystemUI/res/values-sk-rSK/cr_strings.xml @@ -196,7 +196,6 @@ Running ON Recents - Kill app Unlocked Device Unlocked Progress diff --git a/packages/SystemUI/res/values-tr-rTR/cr_strings.xml b/packages/SystemUI/res/values-tr-rTR/cr_strings.xml index 7c3684d92d822..b9c4d0f875e0f 100644 --- a/packages/SystemUI/res/values-tr-rTR/cr_strings.xml +++ b/packages/SystemUI/res/values-tr-rTR/cr_strings.xml @@ -159,7 +159,7 @@ Kişisel Erişim Noktası Etkin VPN Etkin Ekran Kaydı - Şimdi çalınıyor + Şu An Çalan Medya çıkışı Ses Modu Sessiz @@ -194,7 +194,6 @@ Çalışıyor AÇIK Son Kullanılanlar - Uygulamayı kapat Kilidi Açıldı Cihaz Kilidi Açıldı İlerleme diff --git a/packages/SystemUI/res/values-uk-rUA/cr_strings.xml b/packages/SystemUI/res/values-uk-rUA/cr_strings.xml index 47e3642bb8e44..4891ed4cccf56 100644 --- a/packages/SystemUI/res/values-uk-rUA/cr_strings.xml +++ b/packages/SystemUI/res/values-uk-rUA/cr_strings.xml @@ -196,7 +196,6 @@ Виконується УВІМК Меню \"Нещодавніх завдань\" - Закрити програму Розблоковано Пристрій розблоковано Прогрес diff --git a/packages/SystemUI/res/values-vi-rVN/cr_strings.xml b/packages/SystemUI/res/values-vi-rVN/cr_strings.xml index 966a5477d4460..57d8bc7411dec 100644 --- a/packages/SystemUI/res/values-vi-rVN/cr_strings.xml +++ b/packages/SystemUI/res/values-vi-rVN/cr_strings.xml @@ -51,7 +51,7 @@ Trang %1$d trên %2$d %1$s đang bật Không có tiêu đề - Nhìn thoáng qua + At a glance Mã QR Xem @@ -108,9 +108,9 @@ Bảng điều chỉnh âm lượng Điểm ảnh thông minh - Bật - Tắt - Tỷ lệ phần trăm điểm ảnh + On + Off + Pixel percentage %d%% Lỗi khi tải dữ liệu thời tiết @@ -174,13 +174,13 @@ Sao chép hình ảnh Hình ảnh trong bảng tạm Hình ảnh - Liên kết + URL Bỏ qua Mở Dừng lại Dừng ghi Đặt lại - Xóa tất cả + Xoá tất cả Hiện thêm Hiện ít hơn Phát @@ -192,21 +192,20 @@ Đang đổ chuông Đang chạy BẬT - Gần đây - Dừng ứng dụng - Đã mở khóa - Thiết bị đã mở khóa + Ứng dụng gần đây + Đã mở khoá + Thiết bị đã mở khoá Tiến trình Đang chiếu lên - Máy ảnh & micrô - Máy ảnh - Micrô - Máy ảnh & micrô + Camera & Microphone + Camera + Microphone + Camera & Mic %d thiết bị - Đang sạc không dây + Sạc không dây cho đến khi đầy Tiết kiệm pin - Cuộc gọi + Call Cuộc gọi đến Đã kết nối Ngắt kết nối @@ -225,7 +224,7 @@ %d ngày trước %d tuần trước Tiếp tục - Bảng nhớ tạm + Bảng tạm Trước Tiếp theo Phát ngẫu nhiên @@ -240,7 +239,7 @@ Mic Ứng dụng gần đây %d đang chạy - với + vs TRỰC TIẾP Chung kết Hiệp nghỉ diff --git a/packages/SystemUI/res/values-zh-rCN/cr_strings.xml b/packages/SystemUI/res/values-zh-rCN/cr_strings.xml index 30abda3092ac4..b366b38f4c24b 100644 --- a/packages/SystemUI/res/values-zh-rCN/cr_strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/cr_strings.xml @@ -108,9 +108,9 @@ 音量面板 智能像素 - 开启 - 关闭 - 像素百分比 + On + Off + Pixel percentage %d%% 加载天气数据时出错 @@ -193,7 +193,6 @@ 正在运行 开启 最近应用 - 关闭程序 已解锁 设备已解锁 进度 diff --git a/packages/SystemUI/res/values-zh-rTW/cr_strings.xml b/packages/SystemUI/res/values-zh-rTW/cr_strings.xml index ccaccb25db0c5..af66fc7ca27e7 100644 --- a/packages/SystemUI/res/values-zh-rTW/cr_strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/cr_strings.xml @@ -108,9 +108,9 @@ 音量面板 智慧像素 - 已啟用 - 停用 - 螢幕省電像素比例 + On + Off + Pixel percentage %d%% 載入天氣資訊時發生錯誤 @@ -193,7 +193,6 @@ 運行中 開啟 總覽 - 結束應用程式 未鎖定 裝置已解鎖 進度 @@ -206,7 +205,7 @@ 無線充電 直至充飽 省電模式 - 呼叫 + Call 來電 已連線 中斷連線 From 0e78e8bbe9dc97eeab3e3198c0f64c514c14cb4c Mon Sep 17 00:00:00 2001 From: Pranav Vashi Date: Thu, 11 Jun 2026 22:02:36 +0530 Subject: [PATCH 06/13] Revert "core: treat redraws and stretch effects as movement" This reverts commit 00f2c3e5fca933926b4abec41d7ac9b0c4cc36e7. --- core/java/android/view/View.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 2294339551a96..b1949cf01f9e1 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -24117,10 +24117,6 @@ public RenderNode updateDisplayListIfDirty() { mPrivateFlags4 |= PFLAG4_HAS_DRAWN; - // Treat as a move for preferred frame rate purposes - // This solves refresh rate drops during any stretch effects - mPrivateFlags4 |= PFLAG4_HAS_MOVED; - // Fast path for layouts with no backgrounds if ((mPrivateFlags & PFLAG_SKIP_DRAW) == PFLAG_SKIP_DRAW) { dispatchDraw(canvas); From abea78d1ad0f8e08a9ee0c8665c76bce8971fb67 Mon Sep 17 00:00:00 2001 From: Pranav Vashi Date: Fri, 12 Jun 2026 20:30:43 +0530 Subject: [PATCH 07/13] Revert "OplusTypeCastingHelper: update stub" This reverts commit c9f9e9b2a47c92d5ae965e2603e4a57f4d8b73ea. --- core/java/com/oplus/util/OplusTypeCastingHelper.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/core/java/com/oplus/util/OplusTypeCastingHelper.java b/core/java/com/oplus/util/OplusTypeCastingHelper.java index 4819e9f20b720..fb89699ee3739 100644 --- a/core/java/com/oplus/util/OplusTypeCastingHelper.java +++ b/core/java/com/oplus/util/OplusTypeCastingHelper.java @@ -1,10 +1,3 @@ package com.oplus.util; -public final class OplusTypeCastingHelper { - public static T typeCasting(Class type, Object object) { - if (object != null && type.isInstance(object)) { - return type.cast(object); - } - return null; - } -} +public final class OplusTypeCastingHelper { } From 0c9742ae0d3f0672cd49a6bf665f81bdc8ae5160 Mon Sep 17 00:00:00 2001 From: Pranav Vashi Date: Fri, 12 Jun 2026 20:30:52 +0530 Subject: [PATCH 08/13] Revert "Add some fwb stubs from Oplus" This reverts commit c3a7ec56fd31a779451bd65db681d55410ffe2ea. --- core/java/com/oplus/theme/OplusThemeUtil.java | 9 --------- core/java/com/oplus/util/OplusTypeCastingHelper.java | 3 --- 2 files changed, 12 deletions(-) delete mode 100644 core/java/com/oplus/theme/OplusThemeUtil.java delete mode 100644 core/java/com/oplus/util/OplusTypeCastingHelper.java diff --git a/core/java/com/oplus/theme/OplusThemeUtil.java b/core/java/com/oplus/theme/OplusThemeUtil.java deleted file mode 100644 index cea1cfd31b834..0000000000000 --- a/core/java/com/oplus/theme/OplusThemeUtil.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.oplus.theme; - -import android.compat.annotation.UnsupportedAppUsage; - -public class OplusThemeUtil { - /** @hide */ - @UnsupportedAppUsage - public static String CUSTOM_THEME_PATH = "/data/theme/com.oplus.camera"; -} diff --git a/core/java/com/oplus/util/OplusTypeCastingHelper.java b/core/java/com/oplus/util/OplusTypeCastingHelper.java deleted file mode 100644 index fb89699ee3739..0000000000000 --- a/core/java/com/oplus/util/OplusTypeCastingHelper.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.oplus.util; - -public final class OplusTypeCastingHelper { } From fe9f66efd8e4990f7deb8eac3a59e619f5f9ff94 Mon Sep 17 00:00:00 2001 From: Lup Gabriel Date: Fri, 19 Jun 2026 10:23:40 +0300 Subject: [PATCH 09/13] New translations (#1322) [ci skip] --- packages/SystemUI/res/values-ar-rSA/cr_strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/res/values-ar-rSA/cr_strings.xml b/packages/SystemUI/res/values-ar-rSA/cr_strings.xml index 294a9a65b15f6..8439712e79543 100644 --- a/packages/SystemUI/res/values-ar-rSA/cr_strings.xml +++ b/packages/SystemUI/res/values-ar-rSA/cr_strings.xml @@ -108,9 +108,9 @@ لوحة تحكم الصوت الدقة الذكية - On - Off - Pixel percentage + تشغيل + إيقاف + نسبة البكسل %d%% حدث خطأ أثناء تحميل بيانات الطقس @@ -132,7 +132,7 @@ 5G / NR غير مدعوم - VPN tethering + ربط VPN يتم التعرف على الوجه... @@ -155,7 +155,7 @@ تم حذف تسجيل الشاشة - Timer + المؤقت Stopwatch Alarm Flashlight From ab418aa2d64c5a7d94c326245ed0f16d6e32a637 Mon Sep 17 00:00:00 2001 From: Abhay Singh Gill Date: Sat, 14 Dec 2024 22:49:56 +0530 Subject: [PATCH 10/13] SystemUI: Use Material3 switches for screenrecord options Signed-off-by: Abhay Singh Gill Signed-off-by: Dmitrii Signed-off-by: Ghosuto --- .../res/layout/screen_record_options.xml | 26 +++++++++---------- .../ScreenRecordPermissionContentManager.kt | 14 +++++----- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/res/layout/screen_record_options.xml b/packages/SystemUI/res/layout/screen_record_options.xml index cb9f904072eab..53474b9b365c4 100644 --- a/packages/SystemUI/res/layout/screen_record_options.xml +++ b/packages/SystemUI/res/layout/screen_record_options.xml @@ -41,14 +41,14 @@ android:dropDownWidth="274dp" android:importantForAccessibility="yes"/> - - - - - - - \ No newline at end of file + diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionContentManager.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionContentManager.kt index 71f8ce079b1f7..6e98c37dccf47 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionContentManager.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionContentManager.kt @@ -38,8 +38,8 @@ import android.view.View.VISIBLE import android.view.accessibility.AccessibilityNodeInfo import android.widget.AdapterView import android.widget.ArrayAdapter +import android.widget.CompoundButton import android.widget.Spinner -import android.widget.Switch import androidx.annotation.LayoutRes import com.android.systemui.Prefs import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget @@ -109,12 +109,12 @@ class ScreenRecordPermissionContentManager( ): ScreenRecordPermissionContentManager } - private lateinit var tapsSwitch: Switch - private lateinit var audioSwitch: Switch - private lateinit var lowQualitySwitch: Switch - private lateinit var longerDurationSwitch: Switch - private lateinit var skipTimeSwitch: Switch - private lateinit var hevcSwitch: Switch + private lateinit var tapsSwitch: CompoundButton + private lateinit var audioSwitch: CompoundButton + private lateinit var lowQualitySwitch: CompoundButton + private lateinit var longerDurationSwitch: CompoundButton + private lateinit var skipTimeSwitch: CompoundButton + private lateinit var hevcSwitch: CompoundButton private lateinit var tapsView: View private lateinit var options: Spinner From cc47d8b407f15f13ac2af3c66f613a664edd6748 Mon Sep 17 00:00:00 2001 From: rmp22 <195054967+rmp22@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:52:46 +0800 Subject: [PATCH 11/13] SystemUI: Extending screen recorder options feature specs taken from motorola Change-Id: I04b794f1114cab0b50e49708827e91fd56de773e Signed-off-by: rmp22 <195054967+rmp22@users.noreply.github.com> Signed-off-by: Ghosuto Signed-off-by: zerotwo-alt --- .../res/layout/screen_record_options.xml | 169 +++++++++++++++++- .../res/layout/screenrecord_spinner_item.xml | 24 +++ packages/SystemUI/res/values/cm_strings.xml | 23 +++ packages/SystemUI/res/values/cr_arrays.xml | 46 ++++- .../screenrecord/RecordingService.java | 86 +++++++++ .../screenrecord/ScreenMediaRecorder.java | 55 +++++- .../ScreenRecordPermissionContentManager.kt | 100 +++++++++++ .../domain/ScreenRecordingParameters.kt | 5 + ...egacyScreenRecordingStartStopInteractor.kt | 5 + 9 files changed, 492 insertions(+), 21 deletions(-) create mode 100644 packages/SystemUI/res/layout/screenrecord_spinner_item.xml diff --git a/packages/SystemUI/res/layout/screen_record_options.xml b/packages/SystemUI/res/layout/screen_record_options.xml index 53474b9b365c4..be47cb6d41676 100644 --- a/packages/SystemUI/res/layout/screen_record_options.xml +++ b/packages/SystemUI/res/layout/screen_record_options.xml @@ -91,7 +91,8 @@ android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" - android:layout_marginTop="@dimen/screenrecord_option_padding"> + android:layout_marginTop="@dimen/screenrecord_option_padding" + android:visibility="gone"> + android:layout_marginTop="@dimen/screenrecord_option_padding" + android:visibility="gone"> + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/values/cm_strings.xml b/packages/SystemUI/res/values/cm_strings.xml index 381dc02c91103..4fbd6818b1a13 100644 --- a/packages/SystemUI/res/values/cm_strings.xml +++ b/packages/SystemUI/res/values/cm_strings.xml @@ -129,6 +129,29 @@ Remove the 3 second wait HEVC encoding Use the more efficient HEVC encoder + Resolution + Frame rate + Time limit + File size limit + Video quality + High + Medium + Low + Auto + Auto + 30 FPS + 60 FPS + Unlimited + 5 minutes + 10 minutes + 30 minutes + 60 minutes + Unlimited + 10 MB + 100 MB + 500 MB + 1 GB + 15 GB This keeps it in view until you unpin. Touch & hold Back to unpin. diff --git a/packages/SystemUI/res/values/cr_arrays.xml b/packages/SystemUI/res/values/cr_arrays.xml index 79515214b333c..0640396f0d1b8 100644 --- a/packages/SystemUI/res/values/cr_arrays.xml +++ b/packages/SystemUI/res/values/cr_arrays.xml @@ -7,17 +7,47 @@ - @string/quick_settings_compass_N - @string/quick_settings_compass_NE - @string/quick_settings_compass_E - @string/quick_settings_compass_SE - @string/quick_settings_compass_S - @string/quick_settings_compass_SW - @string/quick_settings_compass_W - @string/quick_settings_compass_NW + @string/quick_settings_compass_N + @string/quick_settings_compass_NE + @string/quick_settings_compass_E + @string/quick_settings_compass_SE + @string/quick_settings_compass_S + @string/quick_settings_compass_SW + @string/quick_settings_compass_W + @string/quick_settings_compass_NW + + + @string/screenrecord_bitrate_high + @string/screenrecord_bitrate_medium + @string/screenrecord_bitrate_low + + + + @string/screenrecord_fps_auto + @string/screenrecord_fps_30 + @string/screenrecord_fps_60 + + + + @string/screenrecord_time_unlimited + @string/screenrecord_time_5min + @string/screenrecord_time_10min + @string/screenrecord_time_30min + @string/screenrecord_time_60min + + + + @string/screenrecord_size_unlimited + @string/screenrecord_size_10mb + @string/screenrecord_size_100mb + @string/screenrecord_size_500mb + @string/screenrecord_size_1gb + @string/screenrecord_size_15gb + + diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java index 14ffbd6c54786..f139ecd537627 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java @@ -94,6 +94,11 @@ public class RecordingService extends Service implements ScreenMediaRecorderList private static final String EXTRA_LOW_QUALITY = "extra_lowQuality"; private static final String EXTRA_LONGER_DURATION = "extra_longerDuration"; private final static String EXTRA_HEVC = "extra_HEVC"; + private static final String EXTRA_RESOLUTION_MODE = "extra_resolutionMode"; + private static final String EXTRA_FPS_MODE = "extra_fpsMode"; + private static final String EXTRA_TIME_LIMIT_MS = "extra_timeLimitMs"; + private static final String EXTRA_FILE_SIZE_BYTES = "extra_fileSizeBytes"; + private static final String EXTRA_BITRATE_MULTIPLIER = "extra_bitrateMultiplier"; protected static final String ACTION_START = "com.android.systemui.screenrecord.START"; protected static final String ACTION_SHOW_START_NOTIF = @@ -129,6 +134,11 @@ public class RecordingService extends Service implements ScreenMediaRecorderList private boolean mLowQuality; private boolean mLongerDuration; private boolean mHEVC; + private int mResolutionMode; + private int mFpsMode; + private int mTimeLimitMs; + private long mFileSizeBytes; + private float mBitrateMultiplier = 1.0f; @Inject public RecordingService(ScreenRecordUxController controller, @LongRunning Executor executor, @@ -174,6 +184,21 @@ public static Intent getStartIntent(Context context, int resultCode, .putExtra(EXTRA_HEVC, hevc); } + public static Intent getStartIntent(Context context, int resultCode, + int audioSource, boolean showTaps, + @Nullable MediaProjectionCaptureTarget captureTarget, + boolean lowQuality, boolean longerDuration, boolean hevc, + int resolutionMode, int fpsMode, int timeLimitMs, long fileSizeBytes, + float bitrateMultiplier) { + return getStartIntent(context, resultCode, audioSource, showTaps, captureTarget, + lowQuality, longerDuration, hevc) + .putExtra(EXTRA_RESOLUTION_MODE, resolutionMode) + .putExtra(EXTRA_FPS_MODE, fpsMode) + .putExtra(EXTRA_TIME_LIMIT_MS, timeLimitMs) + .putExtra(EXTRA_FILE_SIZE_BYTES, fileSizeBytes) + .putExtra(EXTRA_BITRATE_MULTIPLIER, bitrateMultiplier); + } + /** * Get an intent to start the recording service. * @@ -202,6 +227,27 @@ public static Intent getStartIntent( .putExtra(EXTRA_DISPLAY_ID, displayId); } + public static Intent getStartIntent( + Context context, + int resultCode, + int audioSource, + boolean showTaps, + int displayId, + @Nullable MediaProjectionCaptureTarget captureTarget, + boolean lowQuality, + boolean longerDuration, + boolean hevc, + int resolutionMode, + int fpsMode, + int timeLimitMs, + long fileSizeBytes, + float bitrateMultiplier) { + return getStartIntent(context, resultCode, audioSource, showTaps, captureTarget, lowQuality, + longerDuration, hevc, resolutionMode, fpsMode, timeLimitMs, fileSizeBytes, + bitrateMultiplier) + .putExtra(EXTRA_DISPLAY_ID, displayId); + } + @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent == null) { @@ -231,6 +277,11 @@ public int onStartCommand(Intent intent, int flags, int startId) { mLowQuality = intent.getBooleanExtra(EXTRA_LOW_QUALITY, false); mLongerDuration = intent.getBooleanExtra(EXTRA_LONGER_DURATION, false); mHEVC = intent.getBooleanExtra(EXTRA_HEVC, true); + mResolutionMode = intent.getIntExtra(EXTRA_RESOLUTION_MODE, 0); + mFpsMode = intent.getIntExtra(EXTRA_FPS_MODE, 0); + mTimeLimitMs = intent.getIntExtra(EXTRA_TIME_LIMIT_MS, 0); + mFileSizeBytes = intent.getLongExtra(EXTRA_FILE_SIZE_BYTES, 0L); + mBitrateMultiplier = intent.getFloatExtra(EXTRA_BITRATE_MULTIPLIER, 1.0f); MediaProjectionCaptureTarget captureTarget = intent.getParcelableExtra(EXTRA_CAPTURE_TARGET, @@ -259,6 +310,11 @@ public int onStartCommand(Intent intent, int flags, int startId) { setLowQuality(mLowQuality); setLongerDuration(mLongerDuration); setHEVC(mHEVC); + setResolutionMode(mResolutionMode); + setRequestedFps(mFpsMode); + setTimeLimitMs(mTimeLimitMs); + setFileSizeBytes(mFileSizeBytes); + setBitrateMultiplier(mBitrateMultiplier); if (startRecording()) { updateState(true); @@ -701,6 +757,36 @@ private void setHEVC(boolean hevc) { } } + private void setResolutionMode(int resolutionMode) { + if (getRecorder() != null) { + getRecorder().setResolutionMode(resolutionMode); + } + } + + private void setRequestedFps(int fps) { + if (getRecorder() != null) { + getRecorder().setRequestedFps(fps); + } + } + + private void setTimeLimitMs(int timeLimitMs) { + if (getRecorder() != null) { + getRecorder().setTimeLimitMs(timeLimitMs); + } + } + + private void setFileSizeBytes(long fileSizeBytes) { + if (getRecorder() != null) { + getRecorder().setFileSizeBytes(fileSizeBytes); + } + } + + private void setBitrateMultiplier(float multiplier) { + if (getRecorder() != null) { + getRecorder().setBitrateMultiplier(multiplier); + } + } + private PendingIntent getStopPendingIntent() { return PendingIntent.getService(this, REQUEST_CODE, getStopIntent(this), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java index 8274713d3cb7e..996a521e25f75 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java @@ -102,6 +102,11 @@ public class ScreenMediaRecorder extends MediaProjection.Callback { private boolean mLowQuality; private boolean mLongerDuration; private boolean mHEVC; + private int mResolutionMode; + private int mRequestedFps; + private int mTimeLimitMs; + private long mFileSizeBytes; + private float mBitrateMultiplier = 1.0f; private Context mContext; ScreenMediaRecorderListener mListener; @@ -157,6 +162,26 @@ public void setHEVC(boolean hevc) { mHEVC = hevc; } + public void setResolutionMode(int resolutionMode) { + mResolutionMode = resolutionMode; + } + + public void setRequestedFps(int fps) { + mRequestedFps = fps; + } + + public void setTimeLimitMs(int timeLimitMs) { + mTimeLimitMs = timeLimitMs; + } + + public void setFileSizeBytes(long fileSizeBytes) { + mFileSizeBytes = fileSizeBytes; + } + + public void setBitrateMultiplier(float multiplier) { + mBitrateMultiplier = multiplier; + } + private void prepare() throws IOException, RemoteException, RuntimeException { //Setup media projection IBinder b = ServiceManager.getService(MEDIA_PROJECTION_SERVICE); @@ -198,16 +223,35 @@ private void prepare() throws IOException, RemoteException, RuntimeException { DisplayManager dm = mContext.getSystemService(DisplayManager.class); Display display = dm.getDisplay(mDisplayId); display.getRealMetrics(metrics); - int refreshRate = mLowQuality ? LOW_VIDEO_FRAME_RATE : (int) display.getRefreshRate(); + int refreshRate; + if (mRequestedFps > 0) { + refreshRate = mRequestedFps; + } else { + refreshRate = mLowQuality ? LOW_VIDEO_FRAME_RATE : (int) display.getRefreshRate(); + } if (mMaxRefreshRate != 0 && refreshRate > mMaxRefreshRate) refreshRate = mMaxRefreshRate; - int[] dimens = getSupportedSize(metrics.widthPixels, metrics.heightPixels, refreshRate); + int targetWidth = metrics.widthPixels; + int targetHeight = metrics.heightPixels; + if (mResolutionMode > 0) { + int longEdge = Math.max(targetWidth, targetHeight); + if (longEdge > mResolutionMode) { + double scale = (double) mResolutionMode / longEdge; + targetWidth = (int) (targetWidth * scale); + targetHeight = (int) (targetHeight * scale); + } + } else if (mResolutionMode == -1) { + targetWidth = targetWidth * 3 / 4; + targetHeight = targetHeight * 3 / 4; + } + int[] dimens = getSupportedSize(targetWidth, targetHeight, refreshRate); int width = dimens[0]; int height = dimens[1]; refreshRate = dimens[2]; int resRatio = mLowQuality ? LOW_VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO : VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO; - int vidBitRate = width * height * refreshRate / VIDEO_FRAME_RATE * resRatio; - long maxFilesize = mLongerDuration ? MAX_FILESIZE_BYTES_LONGER : MAX_FILESIZE_BYTES; + int vidBitRate = (int) (width * height * refreshRate / VIDEO_FRAME_RATE * resRatio * mBitrateMultiplier); + long maxFilesize = mFileSizeBytes > 0 ? mFileSizeBytes + : (mLongerDuration ? MAX_FILESIZE_BYTES_LONGER : MAX_FILESIZE_BYTES); if (!mHEVC) { mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoEncodingProfileLevel( @@ -224,7 +268,8 @@ private void prepare() throws IOException, RemoteException, RuntimeException { mMediaRecorder.setVideoSize(width, height); mMediaRecorder.setVideoFrameRate(refreshRate); mMediaRecorder.setVideoEncodingBitRate(vidBitRate); - mMediaRecorder.setMaxDuration(mLongerDuration ? 0 : MAX_DURATION_MS); + int maxDurationMs = mTimeLimitMs > 0 ? mTimeLimitMs : (mLongerDuration ? 0 : MAX_DURATION_MS); + mMediaRecorder.setMaxDuration(maxDurationMs); mMediaRecorder.setMaxFileSize(maxFilesize); // Set up audio diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionContentManager.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionContentManager.kt index 6e98c37dccf47..4abe7d02837f9 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionContentManager.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionContentManager.kt @@ -21,6 +21,7 @@ import android.app.Activity import android.content.Intent import android.hardware.display.DisplayManager import android.media.MediaCodecInfo +import android.util.DisplayMetrics import android.media.MediaCodecList import android.media.MediaFormat import android.media.projection.StopReason @@ -117,6 +118,12 @@ class ScreenRecordPermissionContentManager( private lateinit var hevcSwitch: CompoundButton private lateinit var tapsView: View private lateinit var options: Spinner + private lateinit var bitrateSpinner: Spinner + private lateinit var resolutionSpinner: Spinner + private lateinit var fpsSpinner: Spinner + private lateinit var timeLimitSpinner: Spinner + private lateinit var fileSizeSpinner: Spinner + private val resolutionModeValues = mutableListOf() override fun bind(view: View) { super.bind(view) @@ -191,6 +198,17 @@ class ScreenRecordPermissionContentManager( audioSwitch.isChecked = true } + resolutionSpinner = containerView.requireViewById(R.id.screenrecord_resolution_spinner) + fpsSpinner = containerView.requireViewById(R.id.screenrecord_fps_spinner) + timeLimitSpinner = containerView.requireViewById(R.id.screenrecord_time_limit_spinner) + fileSizeSpinner = containerView.requireViewById(R.id.screenrecord_file_size_spinner) + bitrateSpinner = containerView.requireViewById(R.id.screenrecord_bitrate_spinner) + setupSpinner(bitrateSpinner, R.array.screenrecord_bitrate_entries) + setupResolutionSpinner() + setupSpinner(fpsSpinner, R.array.screenrecord_fps_entries) + setupSpinner(timeLimitSpinner, R.array.screenrecord_time_limit_entries) + setupSpinner(fileSizeSpinner, R.array.screenrecord_file_size_entries) + // Disable HEVC when hardware accelerated codec is not available if (!hasHevcHwEncoder()) { Prefs.putInt(containerView.context, PREF_HEVC, 0) @@ -242,6 +260,11 @@ class ScreenRecordPermissionContentManager( val longerDuration = longerDurationSwitch.isChecked val skipTime = skipTimeSwitch.isChecked val hevc = hevcSwitch.isChecked + val bitrateMultiplier = BITRATE_MULTIPLIER_VALUES[bitrateSpinner.selectedItemPosition] + val resolutionMode = resolutionModeValues[resolutionSpinner.selectedItemPosition] + val fpsMode = FPS_MODE_VALUES[fpsSpinner.selectedItemPosition] + val timeLimitMs = TIME_LIMIT_VALUES_MS[timeLimitSpinner.selectedItemPosition] + val fileSizeBytes = FILE_SIZE_VALUES_BYTES[fileSizeSpinner.selectedItemPosition] savePrefs(); @@ -258,6 +281,11 @@ class ScreenRecordPermissionContentManager( lowQuality = lowQuality, longerDuration = longerDuration, hevc = hevc, + bitrateMultiplier = bitrateMultiplier, + resolutionMode = resolutionMode, + fpsMode = fpsMode, + timeLimitMs = timeLimitMs, + fileSizeBytes = fileSizeBytes, ) ) }, @@ -265,6 +293,57 @@ class ScreenRecordPermissionContentManager( ) } + private fun setupResolutionSpinner() { + val ctx = containerView.context + val dm = ctx.getSystemService(DisplayManager::class.java) + val metrics = DisplayMetrics() + dm.getDisplay(Display.DEFAULT_DISPLAY).getRealMetrics(metrics) + val screenW = metrics.widthPixels + val screenH = metrics.heightPixels + val longEdge = maxOf(screenW, screenH) + + val entries = mutableListOf(ctx.getString(R.string.screenrecord_resolution_auto)) + resolutionModeValues.clear() + resolutionModeValues.add(0) + + if (longEdge > 2560) { + entries.add(resolutionLabel(screenW, screenH, 2560)) + resolutionModeValues.add(2560) + } + if (longEdge > 1920) { + entries.add(resolutionLabel(screenW, screenH, 1920)) + resolutionModeValues.add(1920) + } + if (longEdge > 1280) { + entries.add(resolutionLabel(screenW, screenH, 1280)) + resolutionModeValues.add(1280) + } + + val adapter = ArrayAdapter(ctx, R.layout.screenrecord_spinner_item, entries) + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + resolutionSpinner.adapter = adapter + } + + private fun resolutionLabel(screenW: Int, screenH: Int, longEdgeCap: Int): String { + val scale = longEdgeCap.toDouble() / maxOf(screenW, screenH) + val w = (screenW * scale).toInt() + val h = (screenH * scale).toInt() + val className = when (longEdgeCap) { + 2560 -> "1440p" + 1920 -> "1080p" + else -> "720p" + } + return "$className ($w × $h)" + } + + private fun setupSpinner(spinner: Spinner, entriesRes: Int) { + val ctx = containerView.context + val entries = ctx.resources.getTextArray(entriesRes) + val adapter = ArrayAdapter(ctx, R.layout.screenrecord_spinner_item, entries) + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + spinner.adapter = adapter + } + private fun hasHevcHwEncoder(): Boolean { val mediaCodecList = MediaCodecList(MediaCodecList.REGULAR_CODECS) @@ -292,6 +371,11 @@ class ScreenRecordPermissionContentManager( Prefs.putInt(userContext, PREF_AUDIO_SOURCE, options.selectedItemPosition) Prefs.putInt(userContext, PREF_SKIP, if (skipTimeSwitch.isChecked) 1 else 0) Prefs.putInt(userContext, PREF_HEVC, if (hevcSwitch.isChecked) 1 else 0) + Prefs.putInt(userContext, PREF_BITRATE, bitrateSpinner.selectedItemPosition) + Prefs.putInt(userContext, PREF_RESOLUTION, resolutionModeValues[resolutionSpinner.selectedItemPosition]) + Prefs.putInt(userContext, PREF_FPS, fpsSpinner.selectedItemPosition) + Prefs.putInt(userContext, PREF_TIME_LIMIT, timeLimitSpinner.selectedItemPosition) + Prefs.putInt(userContext, PREF_FILE_SIZE, fileSizeSpinner.selectedItemPosition) } private fun loadPrefs() { @@ -303,6 +387,12 @@ class ScreenRecordPermissionContentManager( options.setSelection(Prefs.getInt(userContext, PREF_AUDIO_SOURCE, 0)) skipTimeSwitch.isChecked = Prefs.getInt(userContext, PREF_SKIP, 0) == 1 hevcSwitch.isChecked = Prefs.getInt(userContext, PREF_HEVC, 1) == 1 + bitrateSpinner.setSelection(Prefs.getInt(userContext, PREF_BITRATE, 0)) + val savedResMode = Prefs.getInt(userContext, PREF_RESOLUTION, 0) + resolutionSpinner.setSelection(resolutionModeValues.indexOf(savedResMode).coerceAtLeast(0)) + fpsSpinner.setSelection(Prefs.getInt(userContext, PREF_FPS, 0)) + timeLimitSpinner.setSelection(Prefs.getInt(userContext, PREF_TIME_LIMIT, 0)) + fileSizeSpinner.setSelection(Prefs.getInt(userContext, PREF_FILE_SIZE, 0)) } private inner class CaptureTargetResultReceiver : @@ -340,6 +430,16 @@ class ScreenRecordPermissionContentManager( private const val PREF_AUDIO_SOURCE = "screenrecord_audio_source" private const val PREF_SKIP = "screenrecord_skip_timer" private const val PREF_HEVC = "screenrecord_use_hevc" + private const val PREF_BITRATE = "screenrecord_bitrate" + private const val PREF_RESOLUTION = "screenrecord_resolution_mode" + private const val PREF_FPS = "screenrecord_fps_mode" + private const val PREF_TIME_LIMIT = "screenrecord_time_limit" + private const val PREF_FILE_SIZE = "screenrecord_file_size" + + private val BITRATE_MULTIPLIER_VALUES = floatArrayOf(1.0f, 0.5f, 0.25f) + private val FPS_MODE_VALUES = intArrayOf(0, 30, 60) + private val TIME_LIMIT_VALUES_MS = intArrayOf(0, 5 * 60 * 1000, 10 * 60 * 1000, 30 * 60 * 1000, 60 * 60 * 1000) + private val FILE_SIZE_VALUES_BYTES = longArrayOf(0L, 10L shl 20, 100L shl 20, 500L shl 20, 1L shl 30, 15L shl 30) fun createOptionList(displayManager: DisplayManager): List { val connectedDisplays = getConnectedDisplays(displayManager) diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/domain/ScreenRecordingParameters.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/domain/ScreenRecordingParameters.kt index b79d115adc3f5..cbbd0e567ea5b 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/domain/ScreenRecordingParameters.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/domain/ScreenRecordingParameters.kt @@ -27,4 +27,9 @@ data class ScreenRecordingParameters( val lowQuality: Boolean, val longerDuration: Boolean, val hevc: Boolean, + val resolutionMode: Int = 0, + val fpsMode: Int = 0, + val timeLimitMs: Int = 0, + val fileSizeBytes: Long = 0L, + val bitrateMultiplier: Float = 1.0f, ) diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/domain/interactor/LegacyScreenRecordingStartStopInteractor.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/domain/interactor/LegacyScreenRecordingStartStopInteractor.kt index 4ff01b6600ba6..5f507a7af6852 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/domain/interactor/LegacyScreenRecordingStartStopInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/domain/interactor/LegacyScreenRecordingStartStopInteractor.kt @@ -50,6 +50,11 @@ constructor(private val userContextProvider: UserContextProvider) : lowQuality, longerDuration, hevc, + resolutionMode, + fpsMode, + timeLimitMs, + fileSizeBytes, + bitrateMultiplier, ) }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, From f9b02beeb95f914edd23f036eb2ae12725df28bb Mon Sep 17 00:00:00 2001 From: Zero two Date: Fri, 10 Jul 2026 10:36:37 +0000 Subject: [PATCH 12/13] SystemUI: Fix screen recorder options layout Signed-off-by: Zero two --- packages/SystemUI/res/layout/screen_record_options.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/SystemUI/res/layout/screen_record_options.xml b/packages/SystemUI/res/layout/screen_record_options.xml index be47cb6d41676..efe5744423293 100644 --- a/packages/SystemUI/res/layout/screen_record_options.xml +++ b/packages/SystemUI/res/layout/screen_record_options.xml @@ -277,6 +277,8 @@ android:layout_weight="1" android:gravity="center_vertical" android:minHeight="48dp" + android:maxLines="1" + android:ellipsize="end" android:text="@string/screenrecord_resolution_label" android:textAppearance="@style/TextAppearance.ScreenRecord.SwitchLabel" android:contentDescription="@string/screenrecord_resolution_label"/> @@ -284,6 +286,7 @@ android:id="@+id/screenrecord_resolution_spinner" android:layout_width="wrap_content" android:layout_height="48dp" + android:maxWidth="120dp" android:dropDownWidth="wrap_content" android:popupBackground="@drawable/screenrecord_spinner_background" android:importantForAccessibility="yes"/> @@ -427,3 +430,4 @@ android:importantForAccessibility="yes" /> + From c2deef1baf65f76f0b48099f426d9785a1b77a71 Mon Sep 17 00:00:00 2001 From: Joey Date: Wed, 27 May 2026 23:05:06 +0900 Subject: [PATCH 13/13] security: harden TrickyStore keybox validation and extend PIF security patch props - Add ro.system.build.version.security_patch and ro.product.build.version.security_patch to PIF spoof config so all security patch prop variants are covered consistently. - Validate keybox XML structure before parsing: require at least one ECDSA or RSA key block and a serial/DeviceID identifier; log warnings for missing optional blocks. - Add async revocation check against the Android attestation status endpoint; warn on REVOKED or SUSPENDED certificate serials without blocking the main flow. - Eagerly warm up TEE status on a background thread during initialization to avoid stale null reads from the settings UI. - Expose isTeeBroken() as a thread-safe public API that forces the TEE check if it hasn't run yet. Signed-off-by: Ghosuto Signed-off-by: Mrick343 Signed-off-by: zerotwo-alt --- .../security/trickystore/TrickyStoreService.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/java/android/security/trickystore/TrickyStoreService.java b/core/java/android/security/trickystore/TrickyStoreService.java index dbb6eb3c609b7..5057b59f39fdd 100644 --- a/core/java/android/security/trickystore/TrickyStoreService.java +++ b/core/java/android/security/trickystore/TrickyStoreService.java @@ -51,6 +51,8 @@ public class TrickyStoreService { private volatile Boolean mTeeBroken = null; private volatile long mLastRevocationCheckMs = 0L; + private volatile long mLastTargetsRefreshMs = 0L; + private static final long TARGETS_REFRESH_COOLDOWN_MS = 5_000L; private static final long REVOCATION_CHECK_COOLDOWN_MS = 24 * 60 * 60 * 1000L; private volatile CustomPatchLevel mCustomPatchLevel = null; private volatile String mLastKeyboxFingerprint = null; @@ -461,7 +463,7 @@ private boolean checkTeeBroken() { public boolean needHack(int callingUid, String[] packages) { if (packages == null) return false; - refreshTargets(); + maybeRefreshTargets(); ensureTeeStatus(); for (String pkg : packages) { Mode mode = mPackageModes.get(pkg); @@ -473,7 +475,7 @@ public boolean needHack(int callingUid, String[] packages) { public boolean needGenerate(int callingUid, String[] packages) { if (packages == null) return false; - refreshTargets(); + maybeRefreshTargets(); ensureTeeStatus(); for (String pkg : packages) { Mode mode = mPackageModes.get(pkg); @@ -483,6 +485,14 @@ public boolean needGenerate(int callingUid, String[] packages) { return false; } + private void maybeRefreshTargets() { + long now = System.currentTimeMillis(); + if (now - mLastTargetsRefreshMs >= TARGETS_REFRESH_COOLDOWN_MS) { + mLastTargetsRefreshMs = now; + refreshTargets(); + } + } + public KeyBoxManager getKeyBoxManager() { refreshKeyBox(); return mKeyBoxManager;