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; 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/layout/screen_record_options.xml b/packages/SystemUI/res/layout/screen_record_options.xml index cb9f904072eab..efe5744423293 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"/> - - + android:layout_marginTop="@dimen/screenrecord_option_padding" + android:visibility="gone"> - + android:layout_marginTop="@dimen/screenrecord_option_padding" + android:visibility="gone"> - - + + + + + + + + + + + + + + + + + + + + + + + + + - - \ No newline at end of file + + diff --git a/packages/SystemUI/res/layout/screenrecord_spinner_item.xml b/packages/SystemUI/res/layout/screenrecord_spinner_item.xml new file mode 100644 index 0000000000000..87b0682089434 --- /dev/null +++ b/packages/SystemUI/res/layout/screenrecord_spinner_item.xml @@ -0,0 +1,24 @@ + + + diff --git a/packages/SystemUI/res/values-ar-rSA/cr_strings.xml b/packages/SystemUI/res/values-ar-rSA/cr_strings.xml index 846a21beaf798..0b1e7e2b40837 100644 --- a/packages/SystemUI/res/values-ar-rSA/cr_strings.xml +++ b/packages/SystemUI/res/values-ar-rSA/cr_strings.xml @@ -156,100 +156,99 @@ تم حذف تسجيل الشاشة المؤقت - ساعة الإيقاف - المنبّه - الكشاف - نقطة اتصال - نقطة الاتصال نشطة - VPN نشط - تسجيل الشاشة - قيد التشغيل - إخراج الوسائط - وضع الصوت + 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 7cddeb7efe3f0..67eb9aa04de9d 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 bc15ad03e5196..7b57ef1bd6a6b 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 b67df30f60edb..0c2f5f73911f3 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 e291d420a8cf0..7d2b9a955a687 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 d219794f1cd33..3fb18abf442bc 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 fb432b89c0edd..9aa3bcd039c29 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 2f9e24d2c5009..11b6ba92e7af7 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 d099e2d3cadde..dedb99a29ec28 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 812ecabb5a249..4944580ea932b 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 7dd5d49083c84..900084d8345ca 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 36272ba54106c..a48c8647420f4 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 56eb56d32ca07..6d145355aa627 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 6b39efa163d87..ddc8cf2330b4e 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 19a9607bf7702..28d47ea331c2f 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 fc276e33fed26..74e143f04db90 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 e82691655897e..c13122dec6fc8 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 730b608f0ab61..a089c9c81cd48 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 5cf9fcf49a82b..3879fcfb4e552 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 adf6192f75660..3ddefda220dcc 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 d2f3d9cfe5a87..7bb8e4a0f050e 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 fe5ef5e647237..fc9207495b905 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 85a3500b56905..3d5836f11a89b 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 2f7908b5d683c..ec1413274959c 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 edddb2bdbd14f..799b4a086da76 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 77308c90985ea..4c5022f1fab1a 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 5d651f005eb9c..54b90f6b30aca 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 1ae240224433d..b008caa262f4c 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 de804491ff69f..1b1def214df29 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 7a4e3be66a73e..e776ca4ecd1ed 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 acf5a2c758015..ccda08d405c3c 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 e812fe46a5e36..0e2b1b74e1049 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 ffe6728b883d0..aeaf83f951bbc 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 來電 已連線 中斷連線 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 71f8ce079b1f7..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 @@ -38,8 +39,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,14 +110,20 @@ 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 + 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, 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: