summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/app/NetInitiatedActivity.java31
-rw-r--r--core/res/res/values-be/strings.xml2
-rw-r--r--core/res/res/values-es-rUS/strings.xml46
-rw-r--r--core/res/res/values-hi/strings.xml2
-rw-r--r--core/res/res/values-ky/strings.xml2
-rw-r--r--core/res/res/values-pt-rPT/strings.xml4
-rw-r--r--core/res/res/values-tl/strings.xml2
-rw-r--r--core/res/res/values-vi/strings.xml4
-rw-r--r--data/etc/car/Android.bp7
-rw-r--r--data/etc/car/com.android.car.rotary.xml22
-rw-r--r--location/java/com/android/internal/location/GpsNetInitiatedHandler.java3
-rw-r--r--packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml5
-rw-r--r--packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml2
-rw-r--r--packages/CarSystemUI/res-keyguard/values/dimens.xml4
-rw-r--r--packages/CarSystemUI/res-keyguard/values/styles.xml7
-rw-r--r--packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml43
-rw-r--r--packages/CarSystemUI/res/layout/notification_center_activity.xml21
-rw-r--r--packages/CarSystemUI/res/layout/notification_panel_container.xml2
-rw-r--r--packages/CarSystemUI/res/layout/sysui_overlay_window.xml30
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java5
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java5
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java7
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java65
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java14
-rw-r--r--packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java31
-rw-r--r--packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java111
-rw-r--r--packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java12
-rw-r--r--packages/InputDevices/res/values-eu/strings.xml6
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml10
-rw-r--r--packages/SystemUI/res/values-hy/strings.xml2
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml2
-rw-r--r--packages/SystemUI/res/values-my/strings.xml2
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml4
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml2
-rw-r--r--packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java165
-rw-r--r--services/core/java/com/android/server/accounts/AccountManagerService.java6
36 files changed, 446 insertions, 242 deletions
diff --git a/core/java/com/android/internal/app/NetInitiatedActivity.java b/core/java/com/android/internal/app/NetInitiatedActivity.java
index 92e9fe492442..5efeb0fc928e 100644
--- a/core/java/com/android/internal/app/NetInitiatedActivity.java
+++ b/core/java/com/android/internal/app/NetInitiatedActivity.java
@@ -17,18 +17,14 @@
package com.android.internal.app;
import android.app.AlertDialog;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.IntentFilter;
import android.location.LocationManagerInternal;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
-import android.widget.Toast;
import com.android.internal.R;
import com.android.internal.location.GpsNetInitiatedHandler;
@@ -43,7 +39,6 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa
private static final String TAG = "NetInitiatedActivity";
private static final boolean DEBUG = true;
- private static final boolean VERBOSE = false;
private static final int POSITIVE_BUTTON = AlertDialog.BUTTON_POSITIVE;
private static final int NEGATIVE_BUTTON = AlertDialog.BUTTON_NEGATIVE;
@@ -55,17 +50,6 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa
private int default_response = -1;
private int default_response_timeout = 6;
- /** Used to detect when NI request is received */
- private BroadcastReceiver mNetInitiatedReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (DEBUG) Log.d(TAG, "NetInitiatedReceiver onReceive: " + intent.getAction());
- if (intent.getAction() == GpsNetInitiatedHandler.ACTION_NI_VERIFY) {
- handleNIVerify(intent);
- }
- }
- };
-
private final Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
@@ -109,14 +93,12 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa
protected void onResume() {
super.onResume();
if (DEBUG) Log.d(TAG, "onResume");
- registerReceiver(mNetInitiatedReceiver, new IntentFilter(GpsNetInitiatedHandler.ACTION_NI_VERIFY));
}
@Override
protected void onPause() {
super.onPause();
if (DEBUG) Log.d(TAG, "onPause");
- unregisterReceiver(mNetInitiatedReceiver);
}
/**
@@ -141,17 +123,4 @@ public class NetInitiatedActivity extends AlertActivity implements DialogInterfa
LocationManagerInternal lm = LocalServices.getService(LocationManagerInternal.class);
lm.sendNiResponse(notificationId, response);
}
-
- @UnsupportedAppUsage
- private void handleNIVerify(Intent intent) {
- int notifId = intent.getIntExtra(GpsNetInitiatedHandler.NI_INTENT_KEY_NOTIF_ID, -1);
- notificationId = notifId;
-
- if (DEBUG) Log.d(TAG, "handleNIVerify action: " + intent.getAction());
- }
-
- private void showNIError() {
- Toast.makeText(this, "NI error" /* com.android.internal.R.string.usb_storage_error_message */,
- Toast.LENGTH_LONG).show();
- }
}
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 6fbdd4626b94..78ed3a86a697 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -775,7 +775,7 @@
<string name="eventTypeAnniversary" msgid="4684702412407916888">"Гадавіна"</string>
<string name="eventTypeOther" msgid="530671238533887997">"Іншае"</string>
<string name="emailTypeCustom" msgid="1809435350482181786">"Карыстальніцкая"</string>
- <string name="emailTypeHome" msgid="1597116303154775999">"Хатні"</string>
+ <string name="emailTypeHome" msgid="1597116303154775999">"Асабістая"</string>
<string name="emailTypeWork" msgid="2020095414401882111">"Працоўная"</string>
<string name="emailTypeOther" msgid="5131130857030897465">"Іншая"</string>
<string name="emailTypeMobile" msgid="787155077375364230">"Мабільны"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 4d93d6eaf641..e0a35ac95a9b 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -325,8 +325,8 @@
<string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"Controla el posicionamiento y el nivel de zoom de la pantalla."</string>
<string name="capability_title_canPerformGestures" msgid="9106545062106728987">"Usar gestos"</string>
<string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"Permite presionar, deslizar, pellizcar y usar otros gestos."</string>
- <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestos del sensor de huellas digitales"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Captura los gestos que se hacen en el sensor de huellas digitales del dispositivo."</string>
+ <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestos del sensor de huellas dactilares"</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Captura los gestos que se hacen en el sensor de huellas dactilares del dispositivo."</string>
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Tomar captura de pantalla"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Puede tomar una captura de la pantalla."</string>
<string name="permlab_statusBar" msgid="8798267849526214017">"desactivar o modificar la barra de estado"</string>
@@ -511,9 +511,9 @@
<string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"Permite que la app conecte el dispositivo Android TV a redes WiMAX y que lo desconecte de ellas."</string>
<string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"Permite que la aplicación conecte el dispositivo a una red WiMAX y que lo desconecte de ella."</string>
<string name="permlab_bluetooth" msgid="586333280736937209">"vincular con dispositivos Bluetooth"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Permite que la aplicación vea la configuración de Bluetooth de la tablet y que cree y acepte conexiones con los dispositivos sincronizados."</string>
- <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Permite que la app vea la configuración de Bluetooth del dispositivo Android TV, así como que cree y acepte conexiones con los dispositivos sincronizados."</string>
- <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Permite que la aplicación vea la configuración de Bluetooth del dispositivo y que cree y acepte conexiones con los dispositivos sincronizados."</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Permite que la aplicación vea la configuración de Bluetooth de la tablet y que cree y acepte conexiones con los dispositivos vinculados."</string>
+ <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Permite que la app vea la configuración de Bluetooth del dispositivo Android TV, así como que cree y acepte conexiones con los dispositivos vinculados."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Permite que la aplicación vea la configuración de Bluetooth del dispositivo y que cree y acepte conexiones con los dispositivos vinculados."</string>
<string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"Información sobre servicio de pago NFC preferido"</string>
<string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que la app reciba información del servicio de pago NFC preferido, como el servicio de asistencia registrado y el destino de la ruta."</string>
<string name="permlab_nfc" msgid="1904455246837674977">"controlar la Transmisión de datos en proximidad"</string>
@@ -524,10 +524,10 @@
<string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"Permite que la app conozca el nivel de complejidad del bloqueo de pantalla (alta, media, baja o ninguna), lo que indica el rango de duración posible y el tipo de bloqueo. La app también puede sugerirles a los usuarios que actualicen el bloqueo de pantalla a un determinado nivel, aunque ellos pueden ignorar esta sugerencia y seguir navegando. Ten en cuenta que el bloqueo de pantalla no se almacena como texto sin formato, por lo que la app no conoce la contraseña exacta."</string>
<string name="permlab_useBiometric" msgid="6314741124749633786">"usar hardware biométrico"</string>
<string name="permdesc_useBiometric" msgid="7502858732677143410">"Permite que la app use hardware biométrico para realizar la autenticación"</string>
- <string name="permlab_manageFingerprint" msgid="7432667156322821178">"Administrar el hardware de huellas digitales"</string>
- <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"Permite que la aplicación emplee métodos para agregar y eliminar plantillas de huellas digitales para su uso."</string>
- <string name="permlab_useFingerprint" msgid="1001421069766751922">"Utilizar hardware de huellas digitales"</string>
- <string name="permdesc_useFingerprint" msgid="412463055059323742">"Permite que la aplicación utilice el hardware de huellas digitales para realizar la autenticación."</string>
+ <string name="permlab_manageFingerprint" msgid="7432667156322821178">"Administrar el hardware de huellas dactilares"</string>
+ <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"Permite que la aplicación emplee métodos para agregar y eliminar plantillas de huellas dactilares para su uso."</string>
+ <string name="permlab_useFingerprint" msgid="1001421069766751922">"Utilizar hardware de huellas dactilares"</string>
+ <string name="permdesc_useFingerprint" msgid="412463055059323742">"Permite que la aplicación utilice el hardware de huellas dactilares para realizar la autenticación."</string>
<string name="permlab_audioWrite" msgid="8501705294265669405">"modificar tu colección de música"</string>
<string name="permdesc_audioWrite" msgid="8057399517013412431">"Permite que la app modifique tu colección de música."</string>
<string name="permlab_videoWrite" msgid="5940738769586451318">"modificar tu colección de videos"</string>
@@ -542,31 +542,31 @@
<string name="biometric_not_recognized" msgid="5106687642694635888">"No se reconoció"</string>
<string name="biometric_error_canceled" msgid="8266582404844179778">"Se canceló la autenticación"</string>
<string name="biometric_error_device_not_secured" msgid="3129845065043995924">"No se estableció ningún PIN, patrón ni contraseña"</string>
- <string name="fingerprint_acquired_partial" msgid="8532380671091299342">"Se detectó parcialmente la huella digital. Vuelve a intentarlo."</string>
- <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"No se pudo procesar la huella digital. Vuelve a intentarlo."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="4694800187151533990">"El sensor de huellas digitales está sucio. Limpia el sensor y vuelve a intentarlo."</string>
+ <string name="fingerprint_acquired_partial" msgid="8532380671091299342">"Se detectó parcialmente la huella dactilar. Vuelve a intentarlo."</string>
+ <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"No se pudo procesar la huella dactilar. Vuelve a intentarlo."</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="4694800187151533990">"El sensor de huellas dactilares está sucio. Limpia el sensor y vuelve a intentarlo."</string>
<string name="fingerprint_acquired_too_fast" msgid="5151661932298844352">"Moviste el dedo muy rápido. Vuelve a intentarlo."</string>
<string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Moviste el dedo muy lento. Vuelve a intentarlo."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
- <string name="fingerprint_authenticated" msgid="2024862866860283100">"Se autenticó la huella digital"</string>
+ <string name="fingerprint_authenticated" msgid="2024862866860283100">"Se autenticó la huella dactilar"</string>
<string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"Se autenticó el rostro"</string>
<string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"Se autenticó el rostro; presiona Confirmar"</string>
- <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"El hardware para detectar huellas digitales no está disponible."</string>
- <string name="fingerprint_error_no_space" msgid="6126456006769817485">"No se puede almacenar la huella digital. Elimina una de las existentes."</string>
- <string name="fingerprint_error_timeout" msgid="2946635815726054226">"Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."</string>
- <string name="fingerprint_error_canceled" msgid="540026881380070750">"Se canceló la operación de huella digital."</string>
- <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"El usuario canceló la operación de huella digital."</string>
+ <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"El hardware para detectar huellas dactilares no está disponible."</string>
+ <string name="fingerprint_error_no_space" msgid="6126456006769817485">"No se puede almacenar la huella dactilar. Elimina una de las existentes."</string>
+ <string name="fingerprint_error_timeout" msgid="2946635815726054226">"Finalizó el tiempo de espera para la huella dactilar. Vuelve a intentarlo."</string>
+ <string name="fingerprint_error_canceled" msgid="540026881380070750">"Se canceló la operación de huella dactilar."</string>
+ <string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"El usuario canceló la operación de huella dactilar."</string>
<string name="fingerprint_error_lockout" msgid="7853461265604738671">"Demasiados intentos. Vuelve a intentarlo más tarde."</string>
- <string name="fingerprint_error_lockout_permanent" msgid="3895478283943513746">"Realizaste demasiados intentos. Se inhabilitó el sensor de huellas digitales."</string>
+ <string name="fingerprint_error_lockout_permanent" msgid="3895478283943513746">"Realizaste demasiados intentos. Se inhabilitó el sensor de huellas dactilares."</string>
<string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Vuelve a intentarlo."</string>
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"No se registraron huellas digitales."</string>
- <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo no tiene sensor de huellas digitales."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="578914350967423382">"Este dispositivo no tiene sensor de huellas dactilares."</string>
<string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"Se inhabilitó temporalmente el sensor."</string>
<string name="fingerprint_name_template" msgid="8941662088160289778">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
- <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícono de huella digital"</string>
+ <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ícono de huella dactilar"</string>
<string name="permlab_manageFace" msgid="4569549381889283282">"administrar el hardware de desbloqueo facial"</string>
<string name="permdesc_manageFace" msgid="6204569688492710471">"Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso."</string>
<string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"usar el hardware de desbloqueo facial"</string>
@@ -1539,8 +1539,8 @@
<string name="expires_on" msgid="1623640879705103121">"Expira el:"</string>
<string name="serial_number" msgid="3479576915806623429">"Número de serie:"</string>
<string name="fingerprints" msgid="148690767172613723">"Huellas digitales:"</string>
- <string name="sha256_fingerprint" msgid="7103976380961964600">"Huella digital SHA-256"</string>
- <string name="sha1_fingerprint" msgid="2339915142825390774">"Huella digital SHA-1:"</string>
+ <string name="sha256_fingerprint" msgid="7103976380961964600">"Huella dactilar SHA-256"</string>
+ <string name="sha1_fingerprint" msgid="2339915142825390774">"Huella dactilar SHA-1:"</string>
<string name="activity_chooser_view_see_all" msgid="3917045206812726099">"Ver todas"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="8880731437191978314">"Elige actividad"</string>
<string name="share_action_provider_share_with" msgid="1904096863622941880">"Compartir con"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index cd307dfb9d40..139e6b4862b9 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1326,7 +1326,7 @@
<string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"आपके एडमिन ने इस डिवाइस की समस्या को हल करने में सहायता के लिए एक गड़बड़ी की रिपोर्ट का अनुरोध किया है. ऐप्लिकेशन और डेटा शेयर किए जा सकते हैं."</string>
<string name="share_remote_bugreport_action" msgid="7630880678785123682">"शेयर करें"</string>
<string name="decline_remote_bugreport_action" msgid="4040894777519784346">"अस्वीकार करें"</string>
- <string name="select_input_method" msgid="3971267998568587025">"इनपुट पद्धति चुनें"</string>
+ <string name="select_input_method" msgid="3971267998568587025">"इनपुट का तरीका चुनें"</string>
<string name="show_ime" msgid="6406112007347443383">"सामान्य कीबोर्ड के सक्रिय होने के दौरान इसे स्‍क्रीन पर बनाए रखें"</string>
<string name="hardware" msgid="1800597768237606953">"वर्चुअल कीबोर्ड दिखाएं"</string>
<string name="select_keyboard_layout_notification_title" msgid="4427643867639774118">"सामान्य कीबोर्ड कॉन्फ़िगर करें"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index c42cf953c651..ed25123ed39d 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -996,7 +996,7 @@
<item quantity="other">Акыркы <xliff:g id="COUNT_1">%d</xliff:g> күн</item>
<item quantity="one">Акыркы <xliff:g id="COUNT_0">%d</xliff:g> күн</item>
</plurals>
- <string name="last_month" msgid="1528906781083518683">"Өткөн ай"</string>
+ <string name="last_month" msgid="1528906781083518683">"Акыркы ай"</string>
<string name="older" msgid="1645159827884647400">"Эскирээк"</string>
<string name="preposition_for_date" msgid="2780767868832729599">"<xliff:g id="DATE">%s</xliff:g> күнү"</string>
<string name="preposition_for_time" msgid="4336835286453822053">"саат <xliff:g id="TIME">%s</xliff:g>"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index d3cb8528683f..6de3cdffefae 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -254,7 +254,7 @@
<item quantity="one">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_0">%d</xliff:g> segundo…</item>
</plurals>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Captura de ecrã tirada com o relatório de erro."</string>
- <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Falha ao tirar captura de ecrã com o relatório de erro."</string>
+ <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Falha ao fazer captura de ecrã com o relatório de erro."</string>
<string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string>
<string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"Som desativado"</string>
<string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"O som está ativado"</string>
@@ -327,7 +327,7 @@
<string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"É possível tocar, deslizar rapidamente, juntar os dedos e realizar outros gestos"</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"Gestos de impressão digital"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"Pode capturar gestos realizados no sensor de impressões digitais do dispositivo."</string>
- <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Tirar captura de ecrã"</string>
+ <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"Fazer captura de ecrã"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"É possível tirar uma captura de ecrã."</string>
<string name="permlab_statusBar" msgid="8798267849526214017">"desativar ou modificar barra de estado"</string>
<string name="permdesc_statusBar" msgid="5809162768651019642">"Permite à app desativar a barra de estado ou adicionar e remover ícones do sistema."</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index f68ed31dabe1..0bd750f1aa33 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -220,7 +220,7 @@
<string name="reboot_to_update_prepare" msgid="6978842143587422365">"Naghahandang i-update…"</string>
<string name="reboot_to_update_package" msgid="4644104795527534811">"Pinoproseso ang package ng update…"</string>
<string name="reboot_to_update_reboot" msgid="4474726009984452312">"Nagre-restart…"</string>
- <string name="reboot_to_reset_title" msgid="2226229680017882787">"I-reset ang data ng factory"</string>
+ <string name="reboot_to_reset_title" msgid="2226229680017882787">"Pag-reset sa factory data"</string>
<string name="reboot_to_reset_message" msgid="3347690497972074356">"Nagre-restart…"</string>
<string name="shutdown_progress" msgid="5017145516412657345">"Nagsa-shut down…"</string>
<string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"Mag-shut down ang iyong tablet."</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index bf7fbca64581..71d93ba82951 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -967,7 +967,7 @@
<string name="save_password_remember" msgid="6490888932657708341">"Nhớ"</string>
<string name="save_password_never" msgid="6776808375903410659">"Chưa bao giờ"</string>
<string name="open_permission_deny" msgid="5136793905306987251">"Bạn không được phép mở trang này."</string>
- <string name="text_copied" msgid="2531420577879738860">"Đã sao chép văn bản vào khay nhớ tạm thời."</string>
+ <string name="text_copied" msgid="2531420577879738860">"Đã sao chép văn bản vào bảng nhớ tạm thời."</string>
<string name="copied" msgid="4675902854553014676">"Đã sao chép"</string>
<string name="more_item_label" msgid="7419249600215749115">"Thêm"</string>
<string name="prepend_shortcut_label" msgid="1743716737502867951">"Trình đơn+"</string>
@@ -1092,7 +1092,7 @@
<string name="selectAll" msgid="1532369154488982046">"Chọn tất cả"</string>
<string name="cut" msgid="2561199725874745819">"Cắt"</string>
<string name="copy" msgid="5472512047143665218">"Sao chép"</string>
- <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"Không sao chép được vào khay nhớ tạm"</string>
+ <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"Không sao chép được vào bảng nhớ tạm"</string>
<string name="paste" msgid="461843306215520225">"Dán"</string>
<string name="paste_as_plain_text" msgid="7664800665823182587">"Dán dưới dạng văn bản thuần túy"</string>
<string name="replace" msgid="7842675434546657444">"Thay thế..."</string>
diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp
index c5a460b78474..dc892080417d 100644
--- a/data/etc/car/Android.bp
+++ b/data/etc/car/Android.bp
@@ -163,3 +163,10 @@ prebuilt_etc {
src: "com.android.car.activityresolver.xml",
filename_from_src: true,
}
+
+prebuilt_etc {
+ name: "allowed_privapp_com.android.car.rotary",
+ sub_dir: "permissions",
+ src: "com.android.car.rotary.xml",
+ filename_from_src: true,
+}
diff --git a/data/etc/car/com.android.car.rotary.xml b/data/etc/car/com.android.car.rotary.xml
new file mode 100644
index 000000000000..575275507ea5
--- /dev/null
+++ b/data/etc/car/com.android.car.rotary.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<permissions>
+ <privapp-permissions package="com.android.car.rotary">
+ <permission name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
+ <permission name="android.permission.WRITE_SECURE_SETTINGS"/>
+ </privapp-permissions>
+</permissions>
diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
index 67a040dba3e7..a3765151a6f7 100644
--- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
+++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
@@ -51,9 +51,6 @@ public class GpsNetInitiatedHandler {
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- // NI verify activity for bringing up UI (not used yet)
- public static final String ACTION_NI_VERIFY = "android.intent.action.NETWORK_INITIATED_VERIFY";
-
// string constants for defining data fields in NI Intent
public static final String NI_INTENT_KEY_NOTIF_ID = "notif_id";
public static final String NI_INTENT_KEY_TITLE = "title";
diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml
index 3e35df9d9b0c..f617ec06ae52 100644
--- a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml
+++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml
@@ -14,10 +14,7 @@
~ limitations under the License.
-->
-<!-- Car customizations
- Car has solid black background instead of a transparent one
--->
-<LinearLayout
+<com.android.car.ui.FocusArea
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyguard_container"
android:layout_width="match_parent"
diff --git a/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml b/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml
index 8306cb4a708a..c5974e3c7167 100644
--- a/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml
+++ b/packages/CarSystemUI/res-keyguard/layout/num_pad_keys.xml
@@ -66,7 +66,6 @@
android:src="@drawable/ic_backspace"
android:clickable="true"
android:tint="@android:color/white"
- android:background="@drawable/ripple_drawable"
android:contentDescription="@string/keyboardview_keycode_delete" />
<com.android.keyguard.NumPadKey
android:id="@+id/key0"
@@ -77,7 +76,6 @@
style="@style/NumPadKeyButton.LastRow"
android:src="@drawable/ic_done"
android:tint="@android:color/white"
- android:background="@drawable/ripple_drawable"
android:contentDescription="@string/keyboardview_keycode_enter" />
</merge>
diff --git a/packages/CarSystemUI/res-keyguard/values/dimens.xml b/packages/CarSystemUI/res-keyguard/values/dimens.xml
index 8dfe1716ef54..3c139586c2cc 100644
--- a/packages/CarSystemUI/res-keyguard/values/dimens.xml
+++ b/packages/CarSystemUI/res-keyguard/values/dimens.xml
@@ -17,10 +17,8 @@
<resources>
<dimen name="num_pad_margin_left">112dp</dimen>
<dimen name="num_pad_margin_right">144dp</dimen>
- <dimen name="num_pad_key_width">80dp</dimen>
+ <dimen name="num_pad_key_width">120dp</dimen>
<dimen name="num_pad_key_height">80dp</dimen>
- <dimen name="num_pad_key_margin_horizontal">@*android:dimen/car_padding_5</dimen>
- <dimen name="num_pad_key_margin_bottom">@*android:dimen/car_padding_5</dimen>
<dimen name="pin_entry_height">@dimen/num_pad_key_height</dimen>
<dimen name="divider_height">1dp</dimen>
<dimen name="key_enter_margin_top">128dp</dimen>
diff --git a/packages/CarSystemUI/res-keyguard/values/styles.xml b/packages/CarSystemUI/res-keyguard/values/styles.xml
index ecea30a13ced..ca37428a9fd9 100644
--- a/packages/CarSystemUI/res-keyguard/values/styles.xml
+++ b/packages/CarSystemUI/res-keyguard/values/styles.xml
@@ -23,12 +23,11 @@
<item name="android:layout_width">@dimen/num_pad_key_width</item>
<item name="android:layout_height">@dimen/num_pad_key_height</item>
<item name="android:layout_marginBottom">@dimen/num_pad_key_margin_bottom</item>
+ <item name="android:background">?android:attr/selectableItemBackground</item>
<item name="textView">@id/pinEntry</item>
</style>
<style name="NumPadKeyButton.MiddleColumn">
- <item name="android:layout_marginStart">@dimen/num_pad_key_margin_horizontal</item>
- <item name="android:layout_marginEnd">@dimen/num_pad_key_margin_horizontal</item>
</style>
<style name="NumPadKeyButton.LastRow">
@@ -36,12 +35,10 @@
</style>
<style name="NumPadKeyButton.LastRow.MiddleColumn">
- <item name="android:layout_marginStart">@dimen/num_pad_key_margin_horizontal</item>
- <item name="android:layout_marginEnd">@dimen/num_pad_key_margin_horizontal</item>
</style>
<style name="KeyguardButton" parent="@android:style/Widget.DeviceDefault.Button">
- <item name="android:background">@drawable/keyguard_button_background</item>
+ <item name="android:background">?android:attr/selectableItemBackground</item>
<item name="android:textColor">@color/button_text</item>
<item name="android:textAllCaps">false</item>
</style>
diff --git a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml
index 99df6d52de07..f987b5a650bc 100644
--- a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml
+++ b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml
@@ -14,29 +14,36 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<com.android.systemui.car.userswitcher.UserSwitcherContainer
+
+<com.android.car.ui.FocusArea
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/container"
+ android:id="@+id/user_switcher_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/car_user_switcher_background_color"
- android:orientation="vertical">
+ android:gravity="center">
+ <com.android.systemui.car.userswitcher.UserSwitcherContainer
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/car_user_switcher_background_color"
+ android:orientation="vertical">
- <include
- layout="@layout/car_status_bar_header"
- android:layout_alignParentTop="true"
- android:theme="@android:style/Theme"/>
+ <include
+ layout="@layout/car_status_bar_header"
+ android:layout_alignParentTop="true"
+ android:theme="@android:style/Theme"/>
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <com.android.systemui.car.userswitcher.UserGridRecyclerView
- android:id="@+id/user_grid"
+ <FrameLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginTop="@dimen/car_user_switcher_margin_top"/>
- </FrameLayout>
+ android:layout_height="match_parent">
+ <com.android.systemui.car.userswitcher.UserGridRecyclerView
+ android:id="@+id/user_grid"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginTop="@dimen/car_user_switcher_margin_top"/>
+ </FrameLayout>
-</com.android.systemui.car.userswitcher.UserSwitcherContainer>
+ </com.android.systemui.car.userswitcher.UserSwitcherContainer>
+</com.android.car.ui.FocusArea>
diff --git a/packages/CarSystemUI/res/layout/notification_center_activity.xml b/packages/CarSystemUI/res/layout/notification_center_activity.xml
index 0e45e43132de..51d23db79e8d 100644
--- a/packages/CarSystemUI/res/layout/notification_center_activity.xml
+++ b/packages/CarSystemUI/res/layout/notification_center_activity.xml
@@ -22,10 +22,6 @@
android:layout_height="match_parent"
android:background="@color/notification_shade_background_color">
- <com.android.car.ui.FocusParkingView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
-
<View
android:id="@+id/glass_pane"
android:layout_width="match_parent"
@@ -37,20 +33,15 @@
app:layout_constraintTop_toTopOf="parent"
/>
- <com.android.car.ui.FocusArea
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:orientation="vertical"
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/notifications"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingBottom="@dimen/notification_shade_list_padding_bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent">
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/notifications"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/notification_shade_list_padding_bottom"/>
- </com.android.car.ui.FocusArea>
+ app:layout_constraintTop_toTopOf="parent"/>
<include layout="@layout/notification_handle_bar"/>
diff --git a/packages/CarSystemUI/res/layout/notification_panel_container.xml b/packages/CarSystemUI/res/layout/notification_panel_container.xml
index 3b53c6aaeac3..de69769b2bb0 100644
--- a/packages/CarSystemUI/res/layout/notification_panel_container.xml
+++ b/packages/CarSystemUI/res/layout/notification_panel_container.xml
@@ -14,7 +14,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-<FrameLayout
+<com.android.car.ui.FocusArea
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/notification_container"
android:layout_width="match_parent"
diff --git a/packages/CarSystemUI/res/layout/sysui_overlay_window.xml b/packages/CarSystemUI/res/layout/sysui_overlay_window.xml
index e7295aa6383d..3d6085c55b5b 100644
--- a/packages/CarSystemUI/res/layout/sysui_overlay_window.xml
+++ b/packages/CarSystemUI/res/layout/sysui_overlay_window.xml
@@ -22,25 +22,29 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
+ <com.android.car.ui.FocusParkingView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+
<ViewStub android:id="@+id/notification_panel_stub"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout="@layout/notification_panel_container"
- android:layout_marginBottom="@dimen/car_bottom_navigation_bar_height"/>
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/notification_panel_container"
+ android:layout_marginBottom="@dimen/car_bottom_navigation_bar_height"/>
<ViewStub android:id="@+id/keyguard_stub"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout="@layout/keyguard_container" />
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/keyguard_container" />
<ViewStub android:id="@+id/fullscreen_user_switcher_stub"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout="@layout/car_fullscreen_user_switcher"/>
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/car_fullscreen_user_switcher"/>
<ViewStub android:id="@+id/user_switching_dialog_stub"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout="@layout/car_user_switching_dialog"/>
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout="@layout/car_user_switching_dialog"/>
</FrameLayout> \ No newline at end of file
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
index ec018f9bb62e..53d2320b3f9f 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java
@@ -148,6 +148,11 @@ public class CarKeyguardViewController extends OverlayViewController implements
}
@Override
+ protected int getFocusAreaViewId() {
+ return R.id.keyguard_container;
+ }
+
+ @Override
protected boolean shouldShowNavigationBarInsets() {
return true;
}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
index 7b81974e8ec1..d7d7f53eb46d 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java
@@ -219,6 +219,11 @@ public class NotificationPanelViewController extends OverlayPanelViewController
}
@Override
+ protected int getFocusAreaViewId() {
+ return R.id.notification_container;
+ }
+
+ @Override
protected boolean shouldShowNavigationBarInsets() {
return true;
}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
index 5fc7299f68c5..dd59efa7b0b2 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java
@@ -76,7 +76,7 @@ public class FullScreenUserSwitcherViewController extends OverlayViewController
}
if (event.getAction() == KeyEvent.ACTION_UP && getLayout().isVisibleToUser()) {
- getLayout().setVisibility(View.GONE);
+ stop();
}
return true;
});
@@ -92,6 +92,11 @@ public class FullScreenUserSwitcherViewController extends OverlayViewController
}
@Override
+ protected int getFocusAreaViewId() {
+ return R.id.user_switcher_container;
+ }
+
+ @Override
protected boolean shouldFocusWindow() {
return true;
}
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
index 8adc1adcc41c..7bc17765d9fc 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java
@@ -17,12 +17,17 @@
package com.android.systemui.car.window;
import static android.view.WindowInsets.Type.statusBars;
+import static android.view.accessibility.AccessibilityNodeInfo.ACTION_FOCUS;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.view.WindowInsets;
+import androidx.annotation.IdRes;
+
+import com.android.car.ui.FocusArea;
+
/**
* Owns a {@link View} that is present in SystemUIOverlayWindow.
*/
@@ -128,6 +133,66 @@ public class OverlayViewController {
return mOverlayViewGlobalStateController;
}
+ /** Returns whether the view controlled by this controller is visible. */
+ public final boolean isVisible() {
+ return mLayout.getVisibility() == View.VISIBLE;
+ }
+
+ /**
+ * Returns the ID of the focus area that should receive focus when this view is the
+ * topmost view or {@link View#NO_ID} if there is no focus area.
+ */
+ @IdRes
+ protected int getFocusAreaViewId() {
+ return View.NO_ID;
+ }
+
+ /** Returns whether the view controlled by this controller has rotary focus. */
+ protected final boolean hasRotaryFocus() {
+ return !mLayout.isInTouchMode() && mLayout.hasFocus();
+ }
+
+ /**
+ * Sets whether this view allows rotary focus. This should be set to {@code true} for the
+ * topmost layer in the overlay window and {@code false} for the others.
+ */
+ public void setAllowRotaryFocus(boolean allowRotaryFocus) {
+ if (!isInflated()) {
+ return;
+ }
+
+ if (!(mLayout instanceof ViewGroup)) {
+ return;
+ }
+
+ ViewGroup viewGroup = (ViewGroup) mLayout;
+ viewGroup.setDescendantFocusability(allowRotaryFocus
+ ? ViewGroup.FOCUS_BEFORE_DESCENDANTS
+ : ViewGroup.FOCUS_BLOCK_DESCENDANTS);
+ }
+
+ /**
+ * Refreshes the rotary focus in this view if we are in rotary mode. If the view already has
+ * rotary focus, it leaves the focus alone. Returns {@code true} if a new view was focused.
+ */
+ public boolean refreshRotaryFocusIfNeeded() {
+ if (mLayout.isInTouchMode()) {
+ return false;
+ }
+
+ if (hasRotaryFocus()) {
+ return false;
+ }
+
+ View view = mLayout.findViewById(getFocusAreaViewId());
+ if (view == null || !(view instanceof FocusArea)) {
+ return mLayout.requestFocus();
+ }
+
+ FocusArea focusArea = (FocusArea) view;
+ return focusArea.performAccessibilityAction(ACTION_FOCUS, /* arguments= */ null);
+ }
+
/**
* Returns {@code true} if heads up notifications should be displayed over this view.
*/
diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
index 55f0975aeccf..204dde7e87b7 100644
--- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java
@@ -29,6 +29,7 @@ import androidx.annotation.VisibleForTesting;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
@@ -120,6 +121,7 @@ public class OverlayViewGlobalStateController {
refreshWindowFocus();
refreshNavigationBarVisibility();
refreshStatusBarVisibility();
+ refreshRotaryFocusIfNeeded();
Log.d(TAG, "Content shown: " + viewController.getClass().getName());
debugLog();
@@ -193,6 +195,7 @@ public class OverlayViewGlobalStateController {
refreshWindowFocus();
refreshNavigationBarVisibility();
refreshStatusBarVisibility();
+ refreshRotaryFocusIfNeeded();
if (mZOrderVisibleSortedMap.isEmpty()) {
setWindowVisible(false);
@@ -254,6 +257,17 @@ public class OverlayViewGlobalStateController {
}
}
+ private void refreshRotaryFocusIfNeeded() {
+ for (OverlayViewController controller : mZOrderVisibleSortedMap.values()) {
+ boolean isTop = Objects.equals(controller, mHighestZOrder);
+ controller.setAllowRotaryFocus(isTop);
+ }
+
+ if (!mZOrderVisibleSortedMap.isEmpty()) {
+ mHighestZOrder.refreshRotaryFocusIfNeeded();
+ }
+ }
+
/** Returns {@code true} is the window is visible. */
public boolean isWindowVisible() {
return mSystemUIOverlayWindowController.isWindowVisible();
diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java
index c9ec34fd5f08..bbab4388f17d 100644
--- a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java
+++ b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java
@@ -16,12 +16,14 @@
package com.android.systemui.wm;
+import android.content.Context;
import android.os.Handler;
import android.os.RemoteException;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import android.view.IDisplayWindowInsetsController;
+import android.view.IWindowManager;
import android.view.InsetsController;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
@@ -48,30 +50,32 @@ public class DisplaySystemBarsController extends DisplayImeController {
private static final String TAG = "DisplaySystemBarsController";
+ private final Context mContext;
+ private final Handler mHandler;
+
private SparseArray<PerDisplay> mPerDisplaySparseArray;
@Inject
public DisplaySystemBarsController(
- SystemWindows syswin,
+ Context context,
+ IWindowManager wmService,
DisplayController displayController,
@Main Handler mainHandler,
TransactionPool transactionPool) {
- super(syswin, displayController, mainHandler, transactionPool);
+ super(wmService, displayController, mainHandler::post, transactionPool);
+ mContext = context;
+ mHandler = mainHandler;
}
@Override
public void onDisplayAdded(int displayId) {
PerDisplay pd = new PerDisplay(displayId);
- try {
- mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, pd);
- } catch (RemoteException e) {
- Slog.w(TAG, "Unable to set insets controller on display " + displayId);
- }
+ pd.register();
// Lazy loading policy control filters instead of during boot.
if (mPerDisplaySparseArray == null) {
mPerDisplaySparseArray = new SparseArray<>();
- BarControlPolicy.reloadFromSetting(mSystemWindows.mContext);
- BarControlPolicy.registerContentObserver(mSystemWindows.mContext, mHandler, () -> {
+ BarControlPolicy.reloadFromSetting(mContext);
+ BarControlPolicy.registerContentObserver(mContext, mHandler, () -> {
int size = mPerDisplaySparseArray.size();
for (int i = 0; i < size; i++) {
mPerDisplaySparseArray.valueAt(i).modifyDisplayWindowInsets();
@@ -84,7 +88,7 @@ public class DisplaySystemBarsController extends DisplayImeController {
@Override
public void onDisplayRemoved(int displayId) {
try {
- mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, null);
+ mWmService.setDisplayWindowInsetsController(displayId, null);
} catch (RemoteException e) {
Slog.w(TAG, "Unable to remove insets controller on display " + displayId);
}
@@ -100,11 +104,10 @@ public class DisplaySystemBarsController extends DisplayImeController {
String mPackageName;
PerDisplay(int displayId) {
- super(displayId,
- mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation());
+ super(displayId, mDisplayController.getDisplayLayout(displayId).rotation());
mDisplayId = displayId;
mInsetsController = new InsetsController(
- new DisplaySystemBarsInsetsControllerHost(mHandler, this));
+ new DisplaySystemBarsInsetsControllerHost(mHandler, mInsetsControllerImpl));
}
@Override
@@ -166,7 +169,7 @@ public class DisplaySystemBarsController extends DisplayImeController {
showInsets(barVisibilities[0], /* fromIme= */ false);
hideInsets(barVisibilities[1], /* fromIme= */ false);
try {
- mSystemWindows.mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
+ mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
} catch (RemoteException e) {
Slog.w(TAG, "Unable to update window manager service.");
}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
index 294aa0d3cf9b..d97b2329350f 100644
--- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java
@@ -215,6 +215,16 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
}
@Test
+ public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() {
+ setupOverlayViewController1();
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
+
+ assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey(
+ OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue();
+ }
+
+ @Test
public void showView_nothingAlreadyShown_newHighestZOrder() {
setupOverlayViewController1();
@@ -225,13 +235,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
}
@Test
- public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() {
+ public void showView_nothingAlreadyShown_descendantsFocusable() {
setupOverlayViewController1();
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
- assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey(
- OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue();
+ verify(mOverlayViewController1).setAllowRotaryFocus(true);
}
@Test
@@ -332,6 +341,30 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
}
@Test
+ public void showView_newHighestZOrder_topDescendantsFocusable() {
+ setupOverlayViewController1();
+ setOverlayViewControllerAsShowing(mOverlayViewController1);
+ setupOverlayViewController2();
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
+
+ verify(mOverlayViewController1).setAllowRotaryFocus(false);
+ verify(mOverlayViewController2).setAllowRotaryFocus(true);
+ }
+
+ @Test
+ public void showView_newHighestZOrder_refreshTopFocus() {
+ setupOverlayViewController1();
+ setOverlayViewControllerAsShowing(mOverlayViewController1);
+ setupOverlayViewController2();
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
+
+ verify(mOverlayViewController1, never()).refreshRotaryFocusIfNeeded();
+ verify(mOverlayViewController2).refreshRotaryFocusIfNeeded();
+ }
+
+ @Test
public void showView_oldHighestZOrder() {
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
@@ -345,9 +378,9 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
@Test
public void showView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden() {
setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
- setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true);
when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -360,11 +393,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
@Test
public void showView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarsShown() {
setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
- setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false);
when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true);
+ reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
@@ -374,9 +408,9 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
@Test
public void showView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden() {
setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
- setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true);
when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -389,11 +423,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
@Test
public void showView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarsShown() {
setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
- setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false);
when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true);
+ reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
@@ -426,6 +461,30 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
}
@Test
+ public void showView_oldHighestZOrder_topDescendantsFocusable() {
+ setupOverlayViewController1();
+ setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
+
+ verify(mOverlayViewController1).setAllowRotaryFocus(false);
+ verify(mOverlayViewController2).setAllowRotaryFocus(true);
+ }
+
+ @Test
+ public void showView_oldHighestZOrder_refreshTopFocus() {
+ setupOverlayViewController1();
+ setupOverlayViewController2();
+ setOverlayViewControllerAsShowing(mOverlayViewController2);
+
+ mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
+
+ verify(mOverlayViewController1, never()).refreshRotaryFocusIfNeeded();
+ verify(mOverlayViewController2).refreshRotaryFocusIfNeeded();
+ }
+
+ @Test
public void showView_somethingAlreadyShown_windowVisibleNotCalled() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
@@ -577,10 +636,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
public void hideView_newHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -593,10 +652,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
public void hideView_newHighestZOrder_shouldShowNavBarTrue_navigationBarShown() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true);
reset(mWindowInsetsController);
@@ -609,10 +668,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
public void hideView_newHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -625,10 +684,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
public void hideView_newHighestZOrder_shouldShowStatusBarTrue_statusBarShown() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true);
reset(mWindowInsetsController);
@@ -668,10 +727,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
public void hideView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -684,11 +743,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
public void hideView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarShown() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true);
+ reset(mWindowInsetsController);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
@@ -699,10 +759,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
public void hideView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false);
reset(mWindowInsetsController);
@@ -715,11 +775,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
public void hideView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarShown() {
setupOverlayViewController1();
setupOverlayViewController2();
- when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
- when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
setOverlayViewControllerAsShowing(mOverlayViewController1);
setOverlayViewControllerAsShowing(mOverlayViewController2);
+ when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true);
+ when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true);
when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true);
+ reset(mWindowInsetsController);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
@@ -917,7 +978,11 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
private void setOverlayViewControllerAsShowing(OverlayViewController overlayViewController) {
mOverlayViewGlobalStateController.showView(overlayViewController, /* show= */ null);
+ View layout = overlayViewController.getLayout();
reset(mSystemUIOverlayWindowController);
+ reset(overlayViewController);
when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
+ when(overlayViewController.getLayout()).thenReturn(layout);
+ when(overlayViewController.isInflated()).thenReturn(true);
}
}
diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java
index 29cc8eec4bc3..765a4e7900b5 100644
--- a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java
+++ b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java
@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.car.settings.CarSettings;
import android.os.Handler;
@@ -29,6 +30,7 @@ import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.IWindowManager;
+import android.view.Surface;
import androidx.test.filters.SmallTest;
@@ -60,15 +62,20 @@ public class DisplaySystemBarsControllerTest extends SysuiTestCase {
private Handler mHandler;
@Mock
private TransactionPool mTransactionPool;
+ @Mock
+ private DisplayLayout mDisplayLayout;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mSystemWindows.mContext = mContext;
mSystemWindows.mWmService = mIWindowManager;
+ when(mDisplayLayout.rotation()).thenReturn(Surface.ROTATION_0);
+ when(mDisplayController.getDisplayLayout(DISPLAY_ID)).thenReturn(mDisplayLayout);
mController = new DisplaySystemBarsController(
- mSystemWindows,
+ mContext,
+ mIWindowManager,
mDisplayController,
mHandler,
mTransactionPool
@@ -81,7 +88,8 @@ public class DisplaySystemBarsControllerTest extends SysuiTestCase {
mController.onDisplayAdded(DISPLAY_ID);
verify(mIWindowManager).setDisplayWindowInsetsController(
- eq(DISPLAY_ID), any(DisplaySystemBarsController.PerDisplay.class));
+ eq(DISPLAY_ID),
+ any(DisplayImeController.PerDisplay.DisplayWindowInsetsControllerImpl.class));
}
@Test
diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml
index 18d3eb745574..fe4110aa2614 100644
--- a/packages/InputDevices/res/values-eu/strings.xml
+++ b/packages/InputDevices/res/values-eu/strings.xml
@@ -38,9 +38,9 @@
<string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabiarra"</string>
<string name="keyboard_layout_greek" msgid="7289253560162386040">"Greziarra"</string>
<string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebrearra"</string>
- <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituaniera"</string>
- <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Espainiera (Latinoamerika)"</string>
- <string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letoniera"</string>
+ <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lituaniarra"</string>
+ <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Espainiarra (Latinoamerika)"</string>
+ <string name="keyboard_layout_latvian" msgid="4405417142306250595">"Letoniarra"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Persiarra"</string>
<string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Azerbaijandarra"</string>
<string name="keyboard_layout_polish" msgid="1121588624094925325">"Poloniarra"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 36230e0be18c..d99961434f2f 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -58,7 +58,7 @@
<string name="always_use_device" msgid="210535878779644679">"Abrir siempre <xliff:g id="APPLICATION">%1$s</xliff:g> cuando se conecte <xliff:g id="USB_DEVICE">%2$s</xliff:g>"</string>
<string name="always_use_accessory" msgid="1977225429341838444">"Abrir siempre <xliff:g id="APPLICATION">%1$s</xliff:g> cuando se conecte <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>"</string>
<string name="usb_debugging_title" msgid="8274884945238642726">"¿Permitir depuración por USB?"</string>
- <string name="usb_debugging_message" msgid="5794616114463921773">"La huella digital de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_message" msgid="5794616114463921773">"La huella dactilar de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="4003121804294739548">"Permitir siempre desde esta computadora"</string>
<string name="usb_debugging_allow" msgid="1722643858015321328">"Permitir"</string>
<string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"No tienes permitida la depuración por USB"</string>
@@ -128,8 +128,8 @@
<string name="accessibility_phone_button" msgid="4256353121703100427">"Teléfono"</string>
<string name="accessibility_voice_assist_button" msgid="6497706615649754510">"Asistente voz"</string>
<string name="accessibility_unlock_button" msgid="122785427241471085">"Desbloquear"</string>
- <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"Esperando huella digital"</string>
- <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"Desbloquear sin utilizar la huella digital"</string>
+ <string name="accessibility_waiting_for_fingerprint" msgid="5209142744692162598">"Esperando huella dactilar"</string>
+ <string name="accessibility_unlock_without_fingerprint" msgid="1811563723195375298">"Desbloquear sin utilizar la huella dactilar"</string>
<string name="accessibility_scanning_face" msgid="3093828357921541387">"Escaneando rostro"</string>
<string name="accessibility_send_smart_reply" msgid="8885032190442015141">"Enviar"</string>
<string name="accessibility_manage_notification" msgid="582215815790143983">"Administrar notificaciones"</string>
@@ -168,8 +168,8 @@
<string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"Hubo demasiados intentos incorrectos. Se borrará este usuario."</string>
<string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"Hubo demasiados intentos incorrectos. Se borrarán este perfil de trabajo y sus datos."</string>
<string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Descartar"</string>
- <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor de huellas digitales"</string>
- <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ícono de huella digital"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor de huellas dactilares"</string>
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Ícono de huella dactilar"</string>
<string name="face_dialog_looking_for_face" msgid="2656848512116189509">"Autenticando tu rostro…"</string>
<string name="accessibility_face_dialog_face_icon" msgid="8335095612223716768">"Ícono de rostro"</string>
<string name="accessibility_compatibility_zoom_button" msgid="5845799798708790509">"Botón de zoom de compatibilidad"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index af9a11635cac..514e60b3ecd7 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -997,7 +997,7 @@
<string name="privacy_type_camera" msgid="7974051382167078332">"տեսախցիկը"</string>
<string name="privacy_type_location" msgid="7991481648444066703">"վայրը"</string>
<string name="privacy_type_microphone" msgid="9136763906797732428">"խոսափողը"</string>
- <string name="sensor_privacy_mode" msgid="4462866919026513692">"Տվիչներն անջատած են"</string>
+ <string name="sensor_privacy_mode" msgid="4462866919026513692">"Տվիչներն անջատված են"</string>
<string name="device_services" msgid="1549944177856658705">"Սարքի ծառայություններ"</string>
<string name="music_controls_no_title" msgid="4166497066552290938">"Անանուն"</string>
<string name="restart_button_description" msgid="6916116576177456480">"Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 56709cf683ba..7c64e26136bb 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -718,7 +718,7 @@
<string name="notification_channel_summary_default" msgid="3282930979307248890">"Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt"</string>
<string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt. Sarunas no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> pēc noklusējuma tiek parādītas burbulī."</string>
<string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Piesaista jūsu uzmanību, rādot peldošu saīsni uz šo saturu."</string>
- <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Parādās sarunu sadaļas augšdaļā un kā peldošs burbulis, kā arī bloķēšanas ekrānā tiek rādīts profila attēls"</string>
+ <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Parādās sarunu sadaļas augšdaļā, arī kā peldošs burbulis, profila attēls parādās bloķēšanas ekrānā"</string>
<string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Iestatījumi"</string>
<string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string>
<string name="no_shortcut" msgid="8257177117568230126">"Lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> netiek atbalstītas sarunu funkcijas."</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 4367ad123ff0..837c7817f3b3 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -223,7 +223,7 @@
<string name="data_connection_lte" msgid="557021044282539923">"LTE"</string>
<string name="data_connection_lte_plus" msgid="4799302403782283178">"LTE+"</string>
<string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string>
- <string name="data_connection_roaming" msgid="375650836665414797">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်ခြင်း"</string>
+ <string name="data_connection_roaming" msgid="375650836665414797">"ပြင်ပကွန်ရက်သုံးခြင်း"</string>
<string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string>
<string name="accessibility_no_sim" msgid="1140839832913084973">"ဆင်းကဒ်မရှိပါ။"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 8ae1e1a01bf8..9ff77b4fd670 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -833,7 +833,7 @@
<string name="right_nav_bar_button_type" msgid="4472566498647364715">"Loại nút bổ sung bên phải"</string>
<string name="nav_bar_default" msgid="8386559913240761526">"(mặc định)"</string>
<string-array name="nav_bar_buttons">
- <item msgid="2681220472659720036">"Khay nhớ tạm"</item>
+ <item msgid="2681220472659720036">"Bảng nhớ tạm"</item>
<item msgid="4795049793625565683">"Mã phím"</item>
<item msgid="80697951177515644">"Xác nhận xoay, trình chuyển đổi bàn phím"</item>
<item msgid="7626977989589303588">"Không có"</item>
@@ -848,7 +848,7 @@
<string name="save" msgid="3392754183673848006">"Lưu"</string>
<string name="reset" msgid="8715144064608810383">"Đặt lại"</string>
<string name="adjust_button_width" msgid="8313444823666482197">"Điều chỉnh chiều rộng nút"</string>
- <string name="clipboard" msgid="8517342737534284617">"Khay nhớ tạm"</string>
+ <string name="clipboard" msgid="8517342737534284617">"Bảng nhớ tạm"</string>
<string name="accessibility_key" msgid="3471162841552818281">"Nút điều hướng tùy chỉnh"</string>
<string name="left_keycode" msgid="8211040899126637342">"Mã phím bên trái"</string>
<string name="right_keycode" msgid="2480715509844798438">"Mã phím bên phải"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 010f954059a9..d54b0ae92a1c 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -71,7 +71,7 @@
<string name="wifi_debugging_secondary_user_message" msgid="4492383073970079751">"目前登入這部裝置的使用者無法開啟無線偵錯功能。如要使用這項功能,請切換到主要使用者。"</string>
<string name="usb_contaminant_title" msgid="894052515034594113">"USB 連接埠已停用"</string>
<string name="usb_contaminant_message" msgid="7730476585174719805">"為了避免液體或灰塵導致你的裝置受損,系統已停用 USB 連接埠,因此目前無法偵測任何配件。\n\n系統會在可繼續使用 USB 連接埠時通知你。"</string>
- <string name="usb_port_enabled" msgid="531823867664717018">"USB 通訊埠已啟用,可偵測充電器和配件"</string>
+ <string name="usb_port_enabled" msgid="531823867664717018">"USB 連接埠已啟用,可偵測充電器和配件"</string>
<string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"啟用 USB 連接埠"</string>
<string name="learn_more" msgid="4690632085667273811">"瞭解詳情"</string>
<string name="compat_mode_on" msgid="4963711187149440884">"放大為全螢幕"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
index ab4da83518e4..20e09a2df1cb 100644
--- a/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
+++ b/packages/SystemUI/src/com/android/systemui/wm/DisplayImeController.java
@@ -24,12 +24,12 @@ import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
-import android.os.Handler;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Slog;
import android.util.SparseArray;
import android.view.IDisplayWindowInsetsController;
+import android.view.IWindowManager;
import android.view.InsetsSource;
import android.view.InsetsSourceControl;
import android.view.InsetsState;
@@ -39,11 +39,15 @@ import android.view.WindowInsets;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
+import androidx.annotation.BinderThread;
+import androidx.annotation.VisibleForTesting;
+
import com.android.internal.view.IInputMethodManager;
import com.android.systemui.TransactionPool;
import com.android.systemui.dagger.qualifiers.Main;
import java.util.ArrayList;
+import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -66,20 +70,22 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
private static final int DIRECTION_HIDE = 2;
private static final int FLOATING_IME_BOTTOM_INSET = -80;
- SystemWindows mSystemWindows;
- final Handler mHandler;
+ protected final IWindowManager mWmService;
+ protected final Executor mMainExecutor;
final TransactionPool mTransactionPool;
+ final DisplayController mDisplayController;
final SparseArray<PerDisplay> mImePerDisplay = new SparseArray<>();
final ArrayList<ImePositionProcessor> mPositionProcessors = new ArrayList<>();
@Inject
- public DisplayImeController(SystemWindows syswin, DisplayController displayController,
- @Main Handler mainHandler, TransactionPool transactionPool) {
- mHandler = mainHandler;
- mSystemWindows = syswin;
+ public DisplayImeController(IWindowManager wmService, DisplayController displayController,
+ @Main Executor mainExecutor, TransactionPool transactionPool) {
+ mWmService = wmService;
+ mMainExecutor = mainExecutor;
mTransactionPool = transactionPool;
+ mDisplayController = displayController;
displayController.addDisplayWindowListener(this);
}
@@ -88,12 +94,8 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
// Add's a system-ui window-manager specifically for ime. This type is special because
// WM will defer IME inset handling to it in multi-window scenarious.
PerDisplay pd = new PerDisplay(displayId,
- mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation());
- try {
- mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, pd);
- } catch (RemoteException e) {
- Slog.w(TAG, "Unable to set insets controller on display " + displayId);
- }
+ mDisplayController.getDisplayLayout(displayId).rotation());
+ pd.register();
mImePerDisplay.put(displayId, pd);
}
@@ -103,7 +105,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
if (pd == null) {
return;
}
- if (mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation()
+ if (mDisplayController.getDisplayLayout(displayId).rotation()
!= pd.mRotation && isImeShowing(displayId)) {
pd.startAnimation(true, false /* forceRestart */);
}
@@ -112,7 +114,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
@Override
public void onDisplayRemoved(int displayId) {
try {
- mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, null);
+ mWmService.setDisplayWindowInsetsController(displayId, null);
} catch (RemoteException e) {
Slog.w(TAG, "Unable to remove insets controller on display " + displayId);
}
@@ -180,9 +182,12 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
}
}
- class PerDisplay extends IDisplayWindowInsetsController.Stub {
+ /** An implementation of {@link IDisplayWindowInsetsController} for a given display id. */
+ public class PerDisplay {
final int mDisplayId;
final InsetsState mInsetsState = new InsetsState();
+ protected final DisplayWindowInsetsControllerImpl mInsetsControllerImpl =
+ new DisplayWindowInsetsControllerImpl();
InsetsSourceControl mImeSourceControl = null;
int mAnimationDirection = DIRECTION_NONE;
ValueAnimator mAnimation = null;
@@ -196,28 +201,32 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
mRotation = initialRotation;
}
- @Override
+ public void register() {
+ try {
+ mWmService.setDisplayWindowInsetsController(mDisplayId, mInsetsControllerImpl);
+ } catch (RemoteException e) {
+ Slog.w(TAG, "Unable to set insets controller on display " + mDisplayId);
+ }
+ }
+
public void insetsChanged(InsetsState insetsState) {
- mHandler.post(() -> {
- if (mInsetsState.equals(insetsState)) {
- return;
- }
+ if (mInsetsState.equals(insetsState)) {
+ return;
+ }
- mImeShowing = insetsState.getSourceOrDefaultVisibility(InsetsState.ITYPE_IME);
+ mImeShowing = insetsState.getSourceOrDefaultVisibility(InsetsState.ITYPE_IME);
- final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME);
- final Rect newFrame = newSource.getFrame();
- final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame();
+ final InsetsSource newSource = insetsState.getSource(InsetsState.ITYPE_IME);
+ final Rect newFrame = newSource.getFrame();
+ final Rect oldFrame = mInsetsState.getSource(InsetsState.ITYPE_IME).getFrame();
- mInsetsState.set(insetsState, true /* copySources */);
- if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) {
- if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation");
- startAnimation(mImeShowing, true /* forceRestart */);
- }
- });
+ mInsetsState.set(insetsState, true /* copySources */);
+ if (mImeShowing && !newFrame.equals(oldFrame) && newSource.isVisible()) {
+ if (DEBUG) Slog.d(TAG, "insetsChanged when IME showing, restart animation");
+ startAnimation(mImeShowing, true /* forceRestart */);
+ }
}
- @Override
public void insetsControlChanged(InsetsState insetsState,
InsetsSourceControl[] activeControls) {
insetsChanged(insetsState);
@@ -227,27 +236,25 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
continue;
}
if (activeControl.getType() == InsetsState.ITYPE_IME) {
- mHandler.post(() -> {
- final Point lastSurfacePosition = mImeSourceControl != null
- ? mImeSourceControl.getSurfacePosition() : null;
- final boolean positionChanged =
- !activeControl.getSurfacePosition().equals(lastSurfacePosition);
- final boolean leashChanged =
- !haveSameLeash(mImeSourceControl, activeControl);
- mImeSourceControl = activeControl;
- if (mAnimation != null) {
- if (positionChanged) {
- startAnimation(mImeShowing, true /* forceRestart */);
- }
- } else {
- if (leashChanged) {
- applyVisibilityToLeash();
- }
- if (!mImeShowing) {
- removeImeSurface();
- }
+ final Point lastSurfacePosition = mImeSourceControl != null
+ ? mImeSourceControl.getSurfacePosition() : null;
+ final boolean positionChanged =
+ !activeControl.getSurfacePosition().equals(lastSurfacePosition);
+ final boolean leashChanged =
+ !haveSameLeash(mImeSourceControl, activeControl);
+ mImeSourceControl = activeControl;
+ if (mAnimation != null) {
+ if (positionChanged) {
+ startAnimation(mImeShowing, true /* forceRestart */);
+ }
+ } else {
+ if (leashChanged) {
+ applyVisibilityToLeash();
}
- });
+ if (!mImeShowing) {
+ removeImeSurface();
+ }
+ }
}
}
}
@@ -267,25 +274,22 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
}
}
- @Override
public void showInsets(int types, boolean fromIme) {
if ((types & WindowInsets.Type.ime()) == 0) {
return;
}
if (DEBUG) Slog.d(TAG, "Got showInsets for ime");
- mHandler.post(() -> startAnimation(true /* show */, false /* forceRestart */));
+ startAnimation(true /* show */, false /* forceRestart */);
}
- @Override
public void hideInsets(int types, boolean fromIme) {
if ((types & WindowInsets.Type.ime()) == 0) {
return;
}
if (DEBUG) Slog.d(TAG, "Got hideInsets for ime");
- mHandler.post(() -> startAnimation(false /* show */, false /* forceRestart */));
+ startAnimation(false /* show */, false /* forceRestart */);
}
- @Override
public void topFocusedWindowChanged(String packageName) {
// no-op
}
@@ -296,7 +300,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
private void setVisibleDirectly(boolean visible) {
mInsetsState.getSource(InsetsState.ITYPE_IME).setVisible(visible);
try {
- mSystemWindows.mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
+ mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState);
} catch (RemoteException e) {
}
}
@@ -315,7 +319,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
// an IME inset). For now, we assume that no non-floating IME will be <= this nav bar
// frame height so any reported frame that is <= nav-bar frame height is assumed to
// be floating.
- return frame.height() <= mSystemWindows.mDisplayController.getDisplayLayout(mDisplayId)
+ return frame.height() <= mDisplayController.getDisplayLayout(mDisplayId)
.navBarFrameHeight();
}
@@ -331,7 +335,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
// pretend the ime has some size just below the screen.
mImeFrame.set(newFrame);
final int floatingInset = (int) (
- mSystemWindows.mDisplayController.getDisplayLayout(mDisplayId).density()
+ mDisplayController.getDisplayLayout(mDisplayId).density()
* FLOATING_IME_BOTTOM_INSET);
mImeFrame.bottom -= floatingInset;
} else if (newFrame.height() != 0) {
@@ -448,6 +452,47 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged
setVisibleDirectly(true /* visible */);
}
}
+
+ @VisibleForTesting
+ @BinderThread
+ public class DisplayWindowInsetsControllerImpl
+ extends IDisplayWindowInsetsController.Stub {
+ @Override
+ public void topFocusedWindowChanged(String packageName) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.topFocusedWindowChanged(packageName);
+ });
+ }
+
+ @Override
+ public void insetsChanged(InsetsState insetsState) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.insetsChanged(insetsState);
+ });
+ }
+
+ @Override
+ public void insetsControlChanged(InsetsState insetsState,
+ InsetsSourceControl[] activeControls) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.insetsControlChanged(insetsState, activeControls);
+ });
+ }
+
+ @Override
+ public void showInsets(int types, boolean fromIme) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.showInsets(types, fromIme);
+ });
+ }
+
+ @Override
+ public void hideInsets(int types, boolean fromIme) throws RemoteException {
+ mMainExecutor.execute(() -> {
+ PerDisplay.this.hideInsets(types, fromIme);
+ });
+ }
+ }
}
void removeImeSurface() {
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 27c3ff1b4c09..2e04f9c2bcd1 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -3071,7 +3071,8 @@ public class AccountManagerService
.setContentTitle(title)
.setContentText(subtitle)
.setContentIntent(PendingIntent.getActivityAsUser(mContext, 0, intent,
- PendingIntent.FLAG_CANCEL_CURRENT, null, user))
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
+ null, user))
.build();
installNotification(getCredentialPermissionNotificationId(
account, authTokenType, uid), n, packageName, user.getIdentifier());
@@ -5293,7 +5294,8 @@ public class AccountManagerService
.setContentTitle(String.format(notificationTitleFormat, account.name))
.setContentText(message)
.setContentIntent(PendingIntent.getActivityAsUser(
- mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT,
+ mContext, 0, intent,
+ PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE,
null, new UserHandle(userId)))
.build();
installNotification(id, n, packageName, userId);