diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 5f0cb060b24..6e1ebe064b7 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -62,6 +62,7 @@ import static com.android.launcher3.popup.SystemShortcut.KILL_APP; import static com.android.launcher3.popup.SystemShortcut.PRIVATE_PROFILE_INSTALL; import static com.android.launcher3.popup.SystemShortcut.REMOVE; +import static com.android.launcher3.popup.SystemShortcut.RENAME_APP; import static com.android.launcher3.popup.SystemShortcut.UNINSTALL; import static com.android.launcher3.popup.SystemShortcut.UNINSTALL_APP; import static com.android.launcher3.popup.SystemShortcut.WIDGETS; @@ -586,7 +587,8 @@ public View.OnClickListener getItemOnClickListener() { public Stream getSupportedShortcuts(ItemInfo itemInfo) { // Order matters as it affects order of appearance in popup container List shortcuts = new ArrayList(Arrays.asList( - APP_INFO, WellbeingModel.SHORTCUT_FACTORY, mHotseatPredictionController)); + APP_INFO, WellbeingModel.SHORTCUT_FACTORY, mHotseatPredictionController, + RENAME_APP)); int container = itemInfo.container; if (canPinAppWithContextMenu() && DisplayController.showDesktopTaskbarForFreeformDisplay(this) diff --git a/res/drawable/ic_edit.xml b/res/drawable/ic_edit.xml new file mode 100644 index 00000000000..11d55bd6ec5 --- /dev/null +++ b/res/drawable/ic_edit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/res/values-ar-rSA/cr_strings.xml b/res/values-ar-rSA/cr_strings.xml index d56be9f9cd2..94f1fc7b1af 100644 --- a/res/values-ar-rSA/cr_strings.xml +++ b/res/values-ar-rSA/cr_strings.xml @@ -416,17 +416,17 @@ ترتيب شريط البحث مع خلفية الطبقات شفافية الطبقة الخارجية - إخفاء التطبيقات وحمايتها + إخفاء & تطبيقات محمية افتح لإدارة التطبيقات المخفية والمحمية يرجى مصادقة البصمة لفتح %1$s جارٍ التحميل…\u2026 - يرجى إعداد شاشة قفل الجهاز لتقييد الوصول إلى التطبيق + يرجى إعداد فقل شاشة الجهاز لتقييد الوصول إلى التطبيق مساعدة التطبيقات المخفية و الأدوات الخاصة بها ستكون مخفية أيضاً من واجهة التشغيل التطبيقات المحمية تتطلب المصادقة لكي تُفتح نمط تخطيط التطبيقات الحديثة - الإفتراضي + افتراضي تأثير المقياس نمط الكامي نمط iOS @@ -437,4 +437,19 @@ التطبيق المقفل في التطبيقات الحديثة الإهتزاز اثناء التمرير + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-az-rAZ/cr_strings.xml b/res/values-az-rAZ/cr_strings.xml index 5d4c5b09ece..7275cb4c470 100644 --- a/res/values-az-rAZ/cr_strings.xml +++ b/res/values-az-rAZ/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-be-rBY/cr_strings.xml b/res/values-be-rBY/cr_strings.xml index df80ce50aea..b1ea0b53e4c 100644 --- a/res/values-be-rBY/cr_strings.xml +++ b/res/values-be-rBY/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-bg-rBG/cr_strings.xml b/res/values-bg-rBG/cr_strings.xml index 8f0292e42fa..6f649720d2b 100644 --- a/res/values-bg-rBG/cr_strings.xml +++ b/res/values-bg-rBG/cr_strings.xml @@ -437,4 +437,19 @@ Заключено приложение в скорошните Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-ca-rES/cr_strings.xml b/res/values-ca-rES/cr_strings.xml index 1dcddd49fd5..5899bde529c 100644 --- a/res/values-ca-rES/cr_strings.xml +++ b/res/values-ca-rES/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-cs-rCZ/cr_strings.xml b/res/values-cs-rCZ/cr_strings.xml index f2cbcd8a08d..6e16ff86a1d 100644 --- a/res/values-cs-rCZ/cr_strings.xml +++ b/res/values-cs-rCZ/cr_strings.xml @@ -437,4 +437,19 @@ Zamknutá aplikace v nedávných aplikacích Vibrace při posouvání + + Přejmenovat + Zadejte název aplikace + Aplikace přejmenována + App name cannot be empty + App name must be %1$d characters or less + Obnovit + Název byl obnoven na původní + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-de-rDE/cr_strings.xml b/res/values-de-rDE/cr_strings.xml index 67eae4f387a..d5e3c3e73e0 100644 --- a/res/values-de-rDE/cr_strings.xml +++ b/res/values-de-rDE/cr_strings.xml @@ -437,4 +437,19 @@ Gesperrte App im Anwendungsverlauf Scroll-Vibration + + Umbenennen + App-Name eingeben + App umbenannt + App-Name darf nicht leer sein + App-Name darf maximal %1$d Zeichen haben + Zurücksetzen + Name auf Original zurückgesetzt + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-el-rGR/cr_strings.xml b/res/values-el-rGR/cr_strings.xml index 3cadd10c675..0b2fa6c8cfb 100644 --- a/res/values-el-rGR/cr_strings.xml +++ b/res/values-el-rGR/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-es-rES/cr_strings.xml b/res/values-es-rES/cr_strings.xml index 81241fb9156..f6a172ee896 100644 --- a/res/values-es-rES/cr_strings.xml +++ b/res/values-es-rES/cr_strings.xml @@ -437,4 +437,19 @@ Aplicación bloqueada en recientes Vibración de desplazamiento + + Renombrar + Introduzca el nombre de la aplicación + Aplicación renombrada + El nombre de la aplicación no puede estar vacío + El nombre de la aplicación debe tener %1$d caracteres o menos + Restablecer + Nombre restablecido al original + + Desenfoque al iniciar aplicación + Mostrar desenfoque al iniciar aplicaciones + + Icono personalizado + Elige cualquier icono de cualquier paquete de iconos + Buscar iconos diff --git a/res/values-fa-rIR/cr_strings.xml b/res/values-fa-rIR/cr_strings.xml index 25d7611a9fb..55d9ad1ef26 100644 --- a/res/values-fa-rIR/cr_strings.xml +++ b/res/values-fa-rIR/cr_strings.xml @@ -443,4 +443,19 @@ Remember the Lineage of the Unicorn Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-fi-rFI/cr_strings.xml b/res/values-fi-rFI/cr_strings.xml index 9eb5d5dd3f7..da055d2672a 100644 --- a/res/values-fi-rFI/cr_strings.xml +++ b/res/values-fi-rFI/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-fr-rFR/cr_strings.xml b/res/values-fr-rFR/cr_strings.xml index 924d8956077..230a67ef6c8 100644 --- a/res/values-fr-rFR/cr_strings.xml +++ b/res/values-fr-rFR/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-hi-rIN/cr_strings.xml b/res/values-hi-rIN/cr_strings.xml index c1212be30a3..00c21ba8c9a 100644 --- a/res/values-hi-rIN/cr_strings.xml +++ b/res/values-hi-rIN/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-hu-rHU/cr_strings.xml b/res/values-hu-rHU/cr_strings.xml index 8ce77d014f4..b7e94112c3b 100644 --- a/res/values-hu-rHU/cr_strings.xml +++ b/res/values-hu-rHU/cr_strings.xml @@ -437,4 +437,19 @@ Zárolt alkalmazások az előzményekben Rezgés görgetéskor + + Átnevezés + Írja be az alkalmazás nevét + Az alkalmazás átnevezve + Ez a mező nem lehet üres + Az alkalmazás neve legfeljebb %1$d karakter lehet + Visszaállítás + Visszaállítva az eredetire + + A megnyíló alkalmazás homályossága + Elmosó effektus alkamazás megnyitásakor + + Egyéni ikon + Bármelyik ikoncsomagból kijelölhet egy ikont + Ikonok keresése diff --git a/res/values-in-rID/cr_strings.xml b/res/values-in-rID/cr_strings.xml index c0f07bec3b7..d00f0584d25 100644 --- a/res/values-in-rID/cr_strings.xml +++ b/res/values-in-rID/cr_strings.xml @@ -437,4 +437,19 @@ Aplikasi terkunci di daftar aplikasi terbaru Getaran gulir + + Ubah nama + Masukkan nama aplikasi + Aplikasi berganti nama + Nama aplikasi tidak boleh kosong + Nama aplikasi harus terdiri dari %1$d karakter atau kurang + Atur ulang + Nama diatur ulang ke nama asli + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-it-rIT/cr_strings.xml b/res/values-it-rIT/cr_strings.xml index 1552b66e556..e5bcadac6a7 100644 --- a/res/values-it-rIT/cr_strings.xml +++ b/res/values-it-rIT/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-iw-rIL/cr_strings.xml b/res/values-iw-rIL/cr_strings.xml index f8e52f726ef..2583188f4f1 100644 --- a/res/values-iw-rIL/cr_strings.xml +++ b/res/values-iw-rIL/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-ja-rJP/cr_strings.xml b/res/values-ja-rJP/cr_strings.xml index 2902326e6f6..1989ed1342f 100644 --- a/res/values-ja-rJP/cr_strings.xml +++ b/res/values-ja-rJP/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-ko-rKR/cr_strings.xml b/res/values-ko-rKR/cr_strings.xml index 81f7cd3cdb1..cbb20766ad6 100644 --- a/res/values-ko-rKR/cr_strings.xml +++ b/res/values-ko-rKR/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-ku-rTR/cr_strings.xml b/res/values-ku-rTR/cr_strings.xml index 64251b9a568..95ac8872752 100644 --- a/res/values-ku-rTR/cr_strings.xml +++ b/res/values-ku-rTR/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-nl-rNL/cr_strings.xml b/res/values-nl-rNL/cr_strings.xml index 8767c598d67..696aae7b57e 100644 --- a/res/values-nl-rNL/cr_strings.xml +++ b/res/values-nl-rNL/cr_strings.xml @@ -437,4 +437,19 @@ Vergrendelde app in recente apps Scroll trillen + + Hernoemen + Voer app naam in + App hernoemd + App naam kan niet leeg zijn + App-naam moet %1$d tekens of minder zijn + Reset + Naam terugzetten naar origineel + + App start vervaging + Laat vervaag effect zien bij het starten van apps + + Aangepast icoon + Kies een pictogram uit elk pictogrammenpakket + Zoek pictogrammen diff --git a/res/values-pl-rPL/cr_strings.xml b/res/values-pl-rPL/cr_strings.xml index 8e0528c6c77..18ff56219f9 100644 --- a/res/values-pl-rPL/cr_strings.xml +++ b/res/values-pl-rPL/cr_strings.xml @@ -437,4 +437,19 @@ Zablokowana aplikacja w ostatnich aplikacjach Wibracje przewijania + + Zmień nazwę + Wprowadź nazwę aplikacji + Zmieniono nazwę aplikacji + Nazwa aplikacji nie może być pusta + Nazwa aplikacji musi mieć maksymalnie %1$d znaków + Zresetuj + Nazwa została przywrócona do domyślnej + + Rozmycie aplikacji + Pokazuj efekt rozmycia podczas uruchamiania aplikacji + + Własna ikona + Wybierz dowolną ikonę z dowolnej paczki ikon + Szukaj ikon diff --git a/res/values-pt-rBR/cr_strings.xml b/res/values-pt-rBR/cr_strings.xml index 112060b1c58..803dba27553 100644 --- a/res/values-pt-rBR/cr_strings.xml +++ b/res/values-pt-rBR/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-pt-rPT/cr_strings.xml b/res/values-pt-rPT/cr_strings.xml index 21611aab11a..54e9d7a1892 100644 --- a/res/values-pt-rPT/cr_strings.xml +++ b/res/values-pt-rPT/cr_strings.xml @@ -437,4 +437,19 @@ Aplicação bloqueada em recentes Vibração ao rolar + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-ro-rRO/cr_strings.xml b/res/values-ro-rRO/cr_strings.xml index 9334f2cfcdd..a3255c66334 100644 --- a/res/values-ro-rRO/cr_strings.xml +++ b/res/values-ro-rRO/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-ru-rRU/cr_strings.xml b/res/values-ru-rRU/cr_strings.xml index f85a764700e..fce0657dd8f 100644 --- a/res/values-ru-rRU/cr_strings.xml +++ b/res/values-ru-rRU/cr_strings.xml @@ -437,4 +437,19 @@ Заблокировано в недавних Вибрация прокрутки + + Переименовать + Введите название приложения + Приложение переименовано + Название приложения не может быть пустым + Название должно содержать не более %1$d символов + Сброс + Название сброшено на оригинальное + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-sat-rIN/cr_strings.xml b/res/values-sat-rIN/cr_strings.xml index 413edd8ee2e..764cf45dc27 100644 --- a/res/values-sat-rIN/cr_strings.xml +++ b/res/values-sat-rIN/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-sk-rSK/cr_strings.xml b/res/values-sk-rSK/cr_strings.xml index 2bbb16f12e7..037bd06a5ee 100644 --- a/res/values-sk-rSK/cr_strings.xml +++ b/res/values-sk-rSK/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-sr-rCS/cr_strings.xml b/res/values-sr-rCS/cr_strings.xml index 32b581641b1..fc6b493e229 100644 --- a/res/values-sr-rCS/cr_strings.xml +++ b/res/values-sr-rCS/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-ta-rIN/cr_strings.xml b/res/values-ta-rIN/cr_strings.xml index 36e321edb9d..daa813df869 100644 --- a/res/values-ta-rIN/cr_strings.xml +++ b/res/values-ta-rIN/cr_strings.xml @@ -437,4 +437,19 @@ Locked app in recents Scroll vibration + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-tr-rTR/cr_strings.xml b/res/values-tr-rTR/cr_strings.xml index 39d9844b256..d8efdc0ffde 100644 --- a/res/values-tr-rTR/cr_strings.xml +++ b/res/values-tr-rTR/cr_strings.xml @@ -437,4 +437,19 @@ Yakın geçmişte kilitlenen uygulama Kaydırma titreşimi + + Adını değiştir + Uygulama adı girin + Uygulamanın adı değiştirildi + Uygulama adı boş olamaz + Uygulama adı %1$d karakter veya daha kısa olmalıdır + Sıfırla + Uygulama adı sıfırlandı + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-uk-rUA/cr_strings.xml b/res/values-uk-rUA/cr_strings.xml index 80f501b5725..5cba2a1a5fd 100644 --- a/res/values-uk-rUA/cr_strings.xml +++ b/res/values-uk-rUA/cr_strings.xml @@ -437,4 +437,19 @@ Заблокований додаток у списку останніх Вібрація при прокручуванні + + Перейменувати + Введіть назву програми + Програму перейменовано + Назва додатку не може бути порожньою + Назва програми повинна бути менше символів %1$d + Скинути + Ім\'я скидається на оригінал + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-vi-rVN/cr_strings.xml b/res/values-vi-rVN/cr_strings.xml index 36a0196b5f3..196e5f4eb78 100644 --- a/res/values-vi-rVN/cr_strings.xml +++ b/res/values-vi-rVN/cr_strings.xml @@ -438,4 +438,19 @@ Gửi cho chúng tôi một cốc bia Ứng dụng đã khóa trong gần đây Rung khi cuộn + + Đổi tên + Nhập tên ứng dụng + Đổi tên xong + Không thể để trống + Tên ứng dụng phải là %1$d ký tự hoặc ít hơn + Đặt lại + Tên được đặt lại về tên gốc + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values-zh-rCN/cr_strings.xml b/res/values-zh-rCN/cr_strings.xml index 0789f601cf7..7d5cdad282a 100644 --- a/res/values-zh-rCN/cr_strings.xml +++ b/res/values-zh-rCN/cr_strings.xml @@ -437,4 +437,19 @@ 已锁定应用 滚动触觉 + + 重命名 + 输入应用名称 + 应用名称已更改 + 应用名称不能为空 + 应用名称最多可以包含 %1$d 个字符 + 重置 + 将应用名称恢复为默认 + + 应用启动模糊 + 启动应用时显示模糊效果 + + 自定义图标 + 从任意图标包选取图标 + 搜索图标 diff --git a/res/values-zh-rTW/cr_strings.xml b/res/values-zh-rTW/cr_strings.xml index 8d1caa7086e..6cb2f966d5e 100644 --- a/res/values-zh-rTW/cr_strings.xml +++ b/res/values-zh-rTW/cr_strings.xml @@ -437,4 +437,19 @@ 最近分頁中已鎖定的應用程式 捲動震動 + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original + + App launch blur + Show blur effect when launching apps + + Custom icon + Pick any icon from any icon pack + Search icons diff --git a/res/values/cr_strings.xml b/res/values/cr_strings.xml index a93815c0c13..2c1e61ed95b 100644 --- a/res/values/cr_strings.xml +++ b/res/values/cr_strings.xml @@ -500,4 +500,13 @@ Scroll vibration + + + Rename + Enter app name + App renamed + App name cannot be empty + App name must be %1$d characters or less + Reset + Name reset to original diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index e281e8c4dcd..087ea9bd199 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -99,6 +99,7 @@ import static com.android.launcher3.popup.SystemShortcut.APP_INFO; import static com.android.launcher3.popup.SystemShortcut.INSTALL; import static com.android.launcher3.popup.SystemShortcut.REMOVE; +import static com.android.launcher3.popup.SystemShortcut.RENAME_APP; import static com.android.launcher3.popup.SystemShortcut.UNINSTALL; import static com.android.launcher3.popup.SystemShortcut.WIDGETS; import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK; @@ -2988,18 +2989,19 @@ protected RectF getPopupTarget(float x, float y) { public Stream getSupportedShortcuts(ItemInfo itemInfo) { int container = itemInfo.container; if (container == CONTAINER_DESKTOP || container == CONTAINER_HOTSEAT) { - return Stream.of(APP_INFO, WIDGETS, INSTALL, REMOVE, UNINSTALL); + return Stream.of(APP_INFO, RENAME_APP, WIDGETS, INSTALL, REMOVE, UNINSTALL); } else if (container == CONTAINER_ALL_APPS || container == CONTAINER_ALL_APPS_PREDICTION) { // TODO(b/444744861): Update private space apps to have its own container. boolean isPinnable = itemInfo instanceof ItemInfoWithIcon info && (info.runtimeStatusFlags & FLAG_NOT_PINNABLE) == 0; if (isPinnable) { - return Stream.of(APP_INFO, WIDGETS, INSTALL, ADD_TO_HOME_SCREEN, UNINSTALL); + return Stream.of(APP_INFO, RENAME_APP, WIDGETS, INSTALL, + ADD_TO_HOME_SCREEN, UNINSTALL); } else { - return Stream.of(APP_INFO, WIDGETS, INSTALL, UNINSTALL); + return Stream.of(APP_INFO, RENAME_APP, WIDGETS, INSTALL, UNINSTALL); } } - return Stream.of(APP_INFO, WIDGETS, INSTALL, UNINSTALL); + return Stream.of(APP_INFO, RENAME_APP, WIDGETS, INSTALL, UNINSTALL); } /** diff --git a/src/com/android/launcher3/LauncherModel.kt b/src/com/android/launcher3/LauncherModel.kt index 8f4bee5d258..b22b781c0ae 100644 --- a/src/com/android/launcher3/LauncherModel.kt +++ b/src/com/android/launcher3/LauncherModel.kt @@ -15,6 +15,7 @@ */ package com.android.launcher3 +import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.ShortcutInfo @@ -43,6 +44,7 @@ import com.android.launcher3.model.ModelTaskController import com.android.launcher3.model.ModelWriter import com.android.launcher3.model.data.WorkspaceItemInfo import com.android.launcher3.model.tasks.CacheDataUpdatedTask +import com.android.launcher3.model.tasks.CustomAppNameChangedTask import com.android.launcher3.model.tasks.UserAvailabilityChangedTask import com.android.launcher3.model.tasks.UserLockStateChangedTask import com.android.launcher3.pm.UserCache @@ -397,6 +399,11 @@ constructor( } } + /** Called when a user-defined app display name has changed. */ + fun onCustomAppNameChanged(component: ComponentName, user: UserHandle) { + enqueueModelUpdateTask(CustomAppNameChangedTask(component, user)) + } + fun enqueueModelUpdateTask(task: ModelUpdateTask) { if (mModelDestroyed) { return diff --git a/src/com/android/launcher3/data/AppDatabase.kt b/src/com/android/launcher3/data/AppDatabase.kt index a9f26b7efef..6b1db1cab3f 100644 --- a/src/com/android/launcher3/data/AppDatabase.kt +++ b/src/com/android/launcher3/data/AppDatabase.kt @@ -12,7 +12,7 @@ import com.android.launcher3.util.override.MainThreadInitializedObject import kotlinx.coroutines.runBlocking -@Database(entities = [Wallpaper::class], version = 1) +@Database(entities = [Wallpaper::class], version = 1, exportSchema = false) abstract class AppDatabase : RoomDatabase() { abstract fun wallpaperDao(): WallpaperDao diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java index f17f788d7db..cc5c1e7b517 100644 --- a/src/com/android/launcher3/icons/IconCache.java +++ b/src/com/android/launcher3/icons/IconCache.java @@ -71,6 +71,7 @@ import com.android.launcher3.util.ApplicationInfoWrapper; import com.android.launcher3.util.CancellableTask; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.CustomAppNameStore; import com.android.launcher3.util.DaggerSingletonTracker; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.InstantAppResolver; @@ -105,6 +106,7 @@ public class IconCache extends BaseIconCache { private static final String TAG = "Launcher.IconCache"; private final LauncherApps mLauncherApps; + private final Context mContext; private final UserCache mUserManager; private final InstallSessionHelper mInstallSessionHelper; private final InstantAppResolver mInstantAppResolver; @@ -128,6 +130,7 @@ public IconCache( DaggerSingletonTracker lifecycle) { super(context, dbFileName, MODEL_EXECUTOR.getLooper(), idp.fillResIconDpi, idp.iconBitmapSize, true /* inMemoryCache */, iconProvider); + mContext = context; mLauncherApps = context.getSystemService(LauncherApps.class); mUserManager = userCache; mInstallSessionHelper = installSessionHelper; @@ -623,6 +626,10 @@ private synchronized BitmapInfo getBadgedIcon(@Nullable final BitmapInfo bitmap, protected void applyCacheEntry(@NonNull final CacheEntry entry, @NonNull final ItemInfoWithIcon info) { info.title = Utilities.trim(entry.title); + String customTitle = CustomAppNameStore.getCustomName(mContext, info); + if (customTitle != null) { + info.title = customTitle; + } info.contentDescription = entry.contentDescription; info.bitmap = entry.bitmap; // Clear any previously set appTitle, if the packageOverride is no longer valid @@ -647,6 +654,10 @@ protected void applyCacheEntry(@NonNull final CacheEntry entry, } info.appTitle = Utilities.trim(info.title); info.title = Utilities.trim(packageEntry.title); + customTitle = CustomAppNameStore.getCustomName(mContext, info); + if (customTitle != null) { + info.title = customTitle; + } info.contentDescription = packageEntry.contentDescription; info.bitmap = packageEntry.bitmap; } diff --git a/src/com/android/launcher3/model/AllAppsList.java b/src/com/android/launcher3/model/AllAppsList.java index a6039c87375..864c10be1d9 100644 --- a/src/com/android/launcher3/model/AllAppsList.java +++ b/src/com/android/launcher3/model/AllAppsList.java @@ -45,6 +45,7 @@ import com.android.launcher3.pm.PackageInstallInfo; import com.android.launcher3.pm.UserCache; import com.android.launcher3.util.ApiWrapper; +import com.android.launcher3.util.CustomAppNameStore; import com.android.launcher3.util.FlagOp; import com.android.launcher3.util.PackageManagerHelper; @@ -262,6 +263,24 @@ public void updateIconsAndLabels(HashSet packages, UserHandle user) { } } + /** Updates the display title for a single app after a custom rename. */ + public void updateCustomAppTitle(Context context, IconCache iconCache, + ComponentName component, UserHandle user) { + for (AppInfo info : data) { + if (!info.user.equals(user) || !component.equals(info.componentName)) { + continue; + } + String customTitle = CustomAppNameStore.getCustomName(context, info); + if (customTitle != null) { + info.title = customTitle; + } else { + iconCache.updateTitleAndIcon(info); + } + info.sectionName = mIndex.computeSectionName(info.title); + mDataChanged = true; + } + } + /** * Add and remove icons for this package which has been updated. * @param outRemovedComponents any component removed as a result of this update will diff --git a/src/com/android/launcher3/model/tasks/CustomAppNameChangedTask.kt b/src/com/android/launcher3/model/tasks/CustomAppNameChangedTask.kt new file mode 100644 index 00000000000..2b2144bb27f --- /dev/null +++ b/src/com/android/launcher3/model/tasks/CustomAppNameChangedTask.kt @@ -0,0 +1,83 @@ +/* + * SPDX-FileCopyrightText: crDroid Android Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.android.launcher3.model.tasks + +import android.content.ComponentName +import android.content.Intent +import android.content.pm.LauncherApps +import android.os.UserHandle +import com.android.launcher3.LauncherModel.ModelUpdateTask +import com.android.launcher3.LauncherSettings +import com.android.launcher3.icons.IconCache +import com.android.launcher3.model.AllAppsList +import com.android.launcher3.model.BgDataModel +import com.android.launcher3.model.ModelTaskController +import com.android.launcher3.model.data.ItemInfoWithIcon +import com.android.launcher3.util.CustomAppNameStore + +/** Rebinds launcher items after a custom app display name is changed. */ +class CustomAppNameChangedTask( + private val component: ComponentName, + private val user: UserHandle, +) : ModelUpdateTask { + + override fun execute( + taskController: ModelTaskController, + dataModel: BgDataModel, + apps: AllAppsList, + ) { + val context = taskController.context + val iconCache = taskController.iconCache + val launcherApps = context.getSystemService(LauncherApps::class.java) + val launchIntent = + Intent(Intent.ACTION_MAIN).apply { + addCategory(Intent.CATEGORY_LAUNCHER) + component = this@CustomAppNameChangedTask.component + } + val activityInfo = launcherApps.resolveActivity(launchIntent, user) + + synchronized(dataModel) { + val updatedWorkspaceItems = + dataModel.updateAndCollectWorkspaceItemInfos( + user, + { item -> + if ( + item.itemType != LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || + item.targetComponent != component + ) { + return@updateAndCollectWorkspaceItemInfos false + } + applyDisplayTitle(context, iconCache, activityInfo, item) + true + }, + null, + ) + + apps.updateCustomAppTitle(context, iconCache, component, user) + + taskController.bindUpdatedWorkspaceItems(updatedWorkspaceItems) + taskController.bindApplicationsIfNeeded() + } + } + + companion object { + private fun applyDisplayTitle( + context: android.content.Context, + iconCache: IconCache, + activityInfo: android.content.pm.LauncherActivityInfo?, + info: ItemInfoWithIcon, + ) { + val customTitle = CustomAppNameStore.getCustomName(context, info) + if (customTitle != null) { + info.title = customTitle + return + } + if (activityInfo != null) { + iconCache.getTitleAndIcon(info, activityInfo, info.matchingLookupFlag) + } + } + } +} diff --git a/src/com/android/launcher3/popup/SystemShortcut.java b/src/com/android/launcher3/popup/SystemShortcut.java index 293b0fbc856..650a88db502 100644 --- a/src/com/android/launcher3/popup/SystemShortcut.java +++ b/src/com/android/launcher3/popup/SystemShortcut.java @@ -14,6 +14,7 @@ import static com.android.launcher3.widget.picker.model.data.WidgetPickerDataUtils.findAllWidgetsForPackageUser; import android.app.ActivityManagerNative; +import android.app.AlertDialog; import android.app.IActivityManager; import android.content.ComponentName; import android.content.Context; @@ -27,10 +28,13 @@ import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; +import android.text.InputFilter; import android.util.Log; import android.view.InflateException; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -44,6 +48,7 @@ import com.android.launcher3.DropTargetHandler; import com.android.launcher3.Flags; import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; @@ -61,6 +66,7 @@ import com.android.launcher3.util.ApiWrapper; import com.android.launcher3.util.ApplicationInfoWrapper; import com.android.launcher3.util.ComponentKey; +import com.android.launcher3.util.CustomAppNameStore; import com.android.launcher3.util.InstantAppResolver; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; @@ -734,4 +740,147 @@ public void onClick(View view) { } } } + + public static final Factory RENAME_APP = + (activity, itemInfo, originalView) -> { + if (itemInfo.itemType == ITEM_TYPE_APPLICATION + && itemInfo.getTargetComponent() != null) { + return new RenameApp<>(activity, itemInfo, originalView); + } + return null; + }; + + public static class RenameApp extends SystemShortcut { + private static final int MAX_APP_NAME_LENGTH = 32; + + public RenameApp(T target, ItemInfo itemInfo, @NonNull View originalView) { + super(getDrawableId(), R.string.rename_app_label, target, + itemInfo, originalView); + } + + public static int getDrawableId() { + return R.drawable.ic_edit; + } + + @Override + public void onClick(View view) { + dismissTaskMenuView(); + + Context context = view.getContext(); + + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.rename_app_title); + + final EditText input = new EditText(context); + input.setText(mItemInfo.title); + input.setSelection(0, mItemInfo.title != null ? mItemInfo.title.length() : 0); + input.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_APP_NAME_LENGTH)}); + input.setInputType(android.text.InputType.TYPE_CLASS_TEXT); + + builder.setView(input); + + builder.setPositiveButton(android.R.string.ok, (dialog, which) -> { + String newName = input.getText().toString().trim(); + if (validateAndUpdateName(newName, context)) { + Toast.makeText(context, + R.string.app_renamed_successfully, + Toast.LENGTH_SHORT).show(); + } else if (newName.isEmpty()) { + Toast.makeText(context, + R.string.rename_app_empty_error, + Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(context, + context.getString(R.string.rename_app_length_error, + MAX_APP_NAME_LENGTH), + Toast.LENGTH_SHORT).show(); + } + }); + + builder.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel()); + + if (CustomAppNameStore.getCustomName((Context) mTarget, mItemInfo) != null) { + builder.setNeutralButton(R.string.rename_app_reset, (dialog2, which2) -> { + resetToOriginalName(context); + Toast.makeText(context, + R.string.rename_app_reset_message, + Toast.LENGTH_SHORT).show(); + }); + } + + AlertDialog dialog = builder.create(); + dialog.show(); + + input.requestFocus(); + InputMethodManager imm = (InputMethodManager) + context.getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm != null) { + imm.showSoftInput(input, InputMethodManager.SHOW_IMPLICIT); + } + } + + private boolean validateAndUpdateName(String newName, Context context) { + if (newName.isEmpty()) { + return false; + } + + if (newName.length() > MAX_APP_NAME_LENGTH) { + return false; + } + + mItemInfo.title = newName; + + CustomAppNameStore.saveCustomName(context, mItemInfo, newName); + if (mItemInfo instanceof WorkspaceItemInfo) { + WorkspaceItemInfo wsInfo = (WorkspaceItemInfo) mItemInfo; + LauncherAppState.getInstance(context).getModel().getWriter(false, null, null) + .updateItemInDatabase(wsInfo); + } + + forceUiUpdate(context); + + return true; + } + + private void resetToOriginalName(Context context) { + CustomAppNameStore.saveCustomName(context, mItemInfo, null); + CharSequence systemTitle = getSystemTitle(context, mItemInfo); + if (systemTitle != null) { + mItemInfo.title = systemTitle; + } + + if (mItemInfo instanceof WorkspaceItemInfo && systemTitle != null) { + WorkspaceItemInfo wsInfo = (WorkspaceItemInfo) mItemInfo; + LauncherAppState.getInstance(context).getModel().getWriter(false, null, null) + .updateItemInDatabase(wsInfo); + } + + forceUiUpdate(context); + } + + @Nullable + private static CharSequence getSystemTitle(Context context, ItemInfo info) { + ComponentName cn = info.getTargetComponent(); + if (cn == null) { + return null; + } + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + intent.setComponent(cn); + LauncherActivityInfo activityInfo = context.getSystemService(LauncherApps.class) + .resolveActivity(intent, info.user); + if (activityInfo != null) { + return Utilities.trim(activityInfo.getLabel()); + } + return null; + } + + private void forceUiUpdate(Context context) { + ComponentName cn = mItemInfo.getTargetComponent(); + if (cn != null) { + LauncherAppState.getInstance(context).getModel() + .onCustomAppNameChanged(cn, mItemInfo.user); + } + } + } } diff --git a/src/com/android/launcher3/util/CustomAppNameStore.java b/src/com/android/launcher3/util/CustomAppNameStore.java new file mode 100644 index 00000000000..4635308c7f4 --- /dev/null +++ b/src/com/android/launcher3/util/CustomAppNameStore.java @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: crDroid Android Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.android.launcher3.util; + +import android.content.ComponentName; +import android.content.Context; +import android.content.SharedPreferences; + +import androidx.annotation.Nullable; + +import com.android.launcher3.model.data.ItemInfo; + +/** Persists user-defined app display names for launcher items. */ +public final class CustomAppNameStore { + + private static final String CUSTOM_NAMES_PREFS = "custom_app_names"; + + private CustomAppNameStore() { } + + @Nullable + public static String customNameKey(ItemInfo info) { + ComponentName cn = info.getTargetComponent(); + if (cn == null) { + return null; + } + return cn.getPackageName() + "/" + cn.getClassName() + "/" + info.user.hashCode(); + } + + public static void saveCustomName(Context context, ItemInfo info, @Nullable String name) { + String key = customNameKey(info); + if (key == null) { + return; + } + SharedPreferences prefs = context.getSharedPreferences(CUSTOM_NAMES_PREFS, + Context.MODE_PRIVATE); + if (name == null) { + prefs.edit().remove(key).apply(); + } else { + prefs.edit().putString(key, name).apply(); + } + } + + @Nullable + public static String getCustomName(Context context, ItemInfo info) { + String key = customNameKey(info); + if (key == null) { + return null; + } + return context.getSharedPreferences(CUSTOM_NAMES_PREFS, Context.MODE_PRIVATE) + .getString(key, null); + } +}