Merge changes from topic "new-ohm-bg-panel"
* changes:
(2/n) Implement BackgroundWindowManager to manage tutorial background
(1/n) Phase out FEATURE_ONE_HANDED_BACKGROUND_PANEL
diff --git a/apex/media/OWNERS b/apex/media/OWNERS
index bed3895..2c5965c 100644
--- a/apex/media/OWNERS
+++ b/apex/media/OWNERS
@@ -1,6 +1,5 @@
# Bug component: 1344
hdmoon@google.com
-hkuang@google.com
jinpark@google.com
klhyun@google.com
lnilsson@google.com
diff --git a/apex/media/framework/java/android/media/Session2CommandGroup.java b/apex/media/framework/java/android/media/Session2CommandGroup.java
index 13aabfc..af8184a 100644
--- a/apex/media/framework/java/android/media/Session2CommandGroup.java
+++ b/apex/media/framework/java/android/media/Session2CommandGroup.java
@@ -68,7 +68,7 @@
/**
* Used by parcelable creator.
*/
- @SuppressWarnings("WeakerAccess") /* synthetic access */
+ @SuppressWarnings({"WeakerAccess", "UnsafeParcelApi"}) /* synthetic access */
Session2CommandGroup(Parcel in) {
Parcelable[] commands = in.readParcelableArray(Session2Command.class.getClassLoader());
if (commands != null) {
diff --git a/apex/media/service/java/com/android/server/media/MediaCommunicationService.java b/apex/media/service/java/com/android/server/media/MediaCommunicationService.java
index e48f234..7d47e25 100644
--- a/apex/media/service/java/com/android/server/media/MediaCommunicationService.java
+++ b/apex/media/service/java/com/android/server/media/MediaCommunicationService.java
@@ -79,7 +79,7 @@
final Executor mRecordExecutor = Executors.newSingleThreadExecutor();
@GuardedBy("mLock")
- final List<CallbackRecord> mCallbackRecords = new ArrayList<>();
+ final ArrayList<CallbackRecord> mCallbackRecords = new ArrayList<>();
final NotificationManager mNotificationManager;
MediaSessionManager mSessionManager;
@@ -150,8 +150,8 @@
return null;
}
- List<Session2Token> getSession2TokensLocked(int userId) {
- List<Session2Token> list = new ArrayList<>();
+ ArrayList<Session2Token> getSession2TokensLocked(int userId) {
+ ArrayList<Session2Token> list = new ArrayList<>();
if (userId == ALL.getIdentifier()) {
int size = mUserRecords.size();
for (int i = 0; i < size; i++) {
@@ -237,28 +237,29 @@
}
void dispatchSession2Changed(int userId) {
- MediaParceledListSlice<Session2Token> allSession2Tokens;
- MediaParceledListSlice<Session2Token> userSession2Tokens;
+ ArrayList<Session2Token> allSession2Tokens;
+ ArrayList<Session2Token> userSession2Tokens;
synchronized (mLock) {
- allSession2Tokens =
- new MediaParceledListSlice<>(getSession2TokensLocked(ALL.getIdentifier()));
- userSession2Tokens = new MediaParceledListSlice<>(getSession2TokensLocked(userId));
- }
- allSession2Tokens.setInlineCountLimit(1);
- userSession2Tokens.setInlineCountLimit(1);
+ allSession2Tokens = getSession2TokensLocked(ALL.getIdentifier());
+ userSession2Tokens = getSession2TokensLocked(userId);
- synchronized (mLock) {
for (CallbackRecord record : mCallbackRecords) {
if (record.mUserId == ALL.getIdentifier()) {
try {
- record.mCallback.onSession2Changed(allSession2Tokens);
+ MediaParceledListSlice<Session2Token> toSend =
+ new MediaParceledListSlice<>(allSession2Tokens);
+ toSend.setInlineCountLimit(0);
+ record.mCallback.onSession2Changed(toSend);
} catch (RemoteException e) {
Log.w(TAG, "Failed to notify session2 tokens changed " + record);
}
} else if (record.mUserId == userId) {
try {
- record.mCallback.onSession2Changed(userSession2Tokens);
+ MediaParceledListSlice<Session2Token> toSend =
+ new MediaParceledListSlice<>(userSession2Tokens);
+ toSend.setInlineCountLimit(0);
+ record.mCallback.onSession2Changed(toSend);
} catch (RemoteException e) {
Log.w(TAG, "Failed to notify session2 tokens changed " + record);
}
@@ -382,7 +383,7 @@
try {
// Check that they can make calls on behalf of the user and get the final user id
int resolvedUserId = handleIncomingUser(pid, uid, userId, null);
- List<Session2Token> result;
+ ArrayList<Session2Token> result;
synchronized (mLock) {
result = getSession2TokensLocked(resolvedUserId);
}
diff --git a/api/Android.bp b/api/Android.bp
index 2e49a0c..70f995a 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -24,6 +24,19 @@
default_applicable_licenses: ["frameworks_base_license"],
}
+bootstrap_go_package {
+ name: "soong-api",
+ pkgPath: "android/soong/api",
+ deps: [
+ "blueprint",
+ "soong",
+ "soong-android",
+ "soong-genrule",
+ ],
+ srcs: ["api.go"],
+ pluginFor: ["soong_build"],
+}
+
python_defaults {
name: "python3_version_defaults",
version: {
diff --git a/api/api.go b/api/api.go
new file mode 100644
index 0000000..976b140
--- /dev/null
+++ b/api/api.go
@@ -0,0 +1,224 @@
+// 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.
+
+package api
+
+import (
+ "github.com/google/blueprint/proptools"
+
+ "android/soong/android"
+ "android/soong/genrule"
+)
+
+// The intention behind this soong plugin is to generate a number of "merged"
+// API-related modules that would otherwise require a large amount of very
+// similar Android.bp boilerplate to define. For example, the merged current.txt
+// API definitions (created by merging the non-updatable current.txt with all
+// the module current.txts). This simplifies the addition of new android
+// modules, by reducing the number of genrules etc a new module must be added to.
+
+// The properties of the combined_apis module type.
+type CombinedApisProperties struct {
+ // Module libraries that have public APIs
+ Public []string
+ // Module libraries that have system APIs
+ System []string
+ // Module libraries that have module_library APIs
+ Module_lib []string
+ // Module libraries that have system_server APIs
+ System_server []string
+ // ART module library. The only API library not removed from the filtered api database, because
+ // 1) ART apis are available by default to all modules, while other module-to-module deps are
+ // explicit and probably receive more scrutiny anyway
+ // 2) The number of ART/libcore APIs is large, so not linting them would create a large gap
+ // 3) It's a compromise. Ideally we wouldn't be filtering out any module APIs, and have
+ // per-module lint databases that excludes just that module's APIs. Alas, that's more
+ // difficult to achieve.
+ Art_module string
+}
+
+type CombinedApis struct {
+ android.ModuleBase
+
+ properties CombinedApisProperties
+}
+
+func init() {
+ registerBuildComponents(android.InitRegistrationContext)
+}
+
+func registerBuildComponents(ctx android.RegistrationContext) {
+ ctx.RegisterModuleType("combined_apis", combinedApisModuleFactory)
+}
+
+var PrepareForCombinedApisTest = android.FixtureRegisterWithContext(registerBuildComponents)
+
+func (a *CombinedApis) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+}
+
+type genruleProps struct {
+ Name *string
+ Cmd *string
+ Dists []android.Dist
+ Out []string
+ Srcs []string
+ Tools []string
+ Visibility []string
+}
+
+// Struct to pass parameters for the various merged [current|removed].txt file modules we create.
+type MergedTxtDefinition struct {
+ // "current.txt" or "removed.txt"
+ TxtFilename string
+ // The module for the non-updatable / non-module part of the api.
+ BaseTxt string
+ // The list of modules that are relevant for this merged txt.
+ Modules []string
+ // The output tag for each module to use.e.g. {.public.api.txt} for current.txt
+ ModuleTag string
+ // public, system, module-lib or system-server
+ Scope string
+}
+
+func createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition) {
+ metalavaCmd := "$(location metalava)"
+ // Silence reflection warnings. See b/168689341
+ metalavaCmd += " -J--add-opens=java.base/java.util=ALL-UNNAMED "
+ metalavaCmd += " --quiet --no-banner --format=v2 "
+
+ filename := txt.TxtFilename
+ if txt.Scope != "public" {
+ filename = txt.Scope + "-" + filename
+ }
+
+ props := genruleProps{}
+ props.Name = proptools.StringPtr(ctx.ModuleName() + "-" + filename)
+ props.Tools = []string{"metalava"}
+ props.Out = []string{txt.TxtFilename}
+ props.Cmd = proptools.StringPtr(metalavaCmd + "$(in) --api $(out)")
+ props.Srcs = createSrcs(txt.BaseTxt, txt.Modules, txt.ModuleTag)
+ props.Dists = []android.Dist{
+ {
+ Targets: []string{"droidcore"},
+ Dir: proptools.StringPtr("api"),
+ Dest: proptools.StringPtr(filename),
+ },
+ {
+ Targets: []string{"sdk"},
+ Dir: proptools.StringPtr("apistubs/android/" + txt.Scope + "/api"),
+ Dest: proptools.StringPtr(txt.TxtFilename),
+ },
+ }
+ props.Visibility = []string{"//visibility:public"}
+ ctx.CreateModule(genrule.GenRuleFactory, &props)
+}
+
+func createMergedStubsSrcjar(ctx android.LoadHookContext, modules []string) {
+ props := genruleProps{}
+ props.Name = proptools.StringPtr(ctx.ModuleName() + "-current.srcjar")
+ props.Tools = []string{"merge_zips"}
+ props.Out = []string{"current.srcjar"}
+ props.Cmd = proptools.StringPtr("$(location merge_zips) $(out) $(in)")
+ props.Srcs = createSrcs(":api-stubs-docs-non-updatable", modules, "{.public.stubs.source}")
+ props.Visibility = []string{"//visibility:private"} // Used by make module in //development, mind
+ ctx.CreateModule(genrule.GenRuleFactory, &props)
+}
+
+func createFilteredApiVersions(ctx android.LoadHookContext, modules []string) {
+ props := genruleProps{}
+ props.Name = proptools.StringPtr("api-versions-xml-public-filtered")
+ props.Tools = []string{"api_versions_trimmer"}
+ props.Out = []string{"api-versions-public-filtered.xml"}
+ props.Cmd = proptools.StringPtr("$(location api_versions_trimmer) $(out) $(in)")
+ // Note: order matters: first parameter is the full api-versions.xml
+ // after that the stubs files in any order
+ // stubs files are all modules that export API surfaces EXCEPT ART
+ props.Srcs = createSrcs(":framework-doc-stubs{.api_versions.xml}", modules, ".stubs{.jar}")
+ props.Dists = []android.Dist{{Targets: []string{"sdk"}}}
+ ctx.CreateModule(genrule.GenRuleFactory, &props)
+}
+
+func createSrcs(base string, modules []string, tag string) []string {
+ a := make([]string, 0, len(modules)+1)
+ a = append(a, base)
+ for _, module := range modules {
+ a = append(a, ":"+module+tag)
+ }
+ return a
+}
+
+func remove(s []string, v string) []string {
+ s2 := make([]string, 0, len(s))
+ for _, sv := range s {
+ if sv != v {
+ s2 = append(s2, sv)
+ }
+ }
+ return s2
+}
+
+func createMergedTxts(ctx android.LoadHookContext, props CombinedApisProperties) {
+ var textFiles []MergedTxtDefinition
+ tagSuffix := []string{".api.txt}", ".removed-api.txt}"}
+ for i, f := range []string{"current.txt", "removed.txt"} {
+ textFiles = append(textFiles, MergedTxtDefinition{
+ TxtFilename: f,
+ BaseTxt: ":non-updatable-" + f,
+ Modules: props.Public,
+ ModuleTag: "{.public" + tagSuffix[i],
+ Scope: "public",
+ })
+ textFiles = append(textFiles, MergedTxtDefinition{
+ TxtFilename: f,
+ BaseTxt: ":non-updatable-system-" + f,
+ Modules: props.System,
+ ModuleTag: "{.system" + tagSuffix[i],
+ Scope: "system",
+ })
+ textFiles = append(textFiles, MergedTxtDefinition{
+ TxtFilename: f,
+ BaseTxt: ":non-updatable-module-lib-" + f,
+ Modules: props.Module_lib,
+ ModuleTag: "{.module-lib" + tagSuffix[i],
+ Scope: "module-lib",
+ })
+ textFiles = append(textFiles, MergedTxtDefinition{
+ TxtFilename: f,
+ BaseTxt: ":non-updatable-system-server-" + f,
+ Modules: props.System_server,
+ ModuleTag: "{.system-server" + tagSuffix[i],
+ Scope: "system-server",
+ })
+ }
+ for _, txt := range textFiles {
+ createMergedTxt(ctx, txt)
+ }
+}
+
+func (a *CombinedApis) createInternalModules(ctx android.LoadHookContext) {
+ createMergedTxts(ctx, a.properties)
+
+ createMergedStubsSrcjar(ctx, a.properties.Public)
+
+ // For the filtered api versions, we prune all APIs except art module's APIs.
+ createFilteredApiVersions(ctx, remove(a.properties.Public, a.properties.Art_module))
+}
+
+func combinedApisModuleFactory() android.Module {
+ module := &CombinedApis{}
+ module.AddProperties(&module.properties)
+ android.InitAndroidModule(module)
+ android.AddLoadHook(module, func(ctx android.LoadHookContext) { module.createInternalModules(ctx) })
+ return module
+}
diff --git a/core/api/current.txt b/core/api/current.txt
index cddb6ff..f38c237 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -1312,6 +1312,7 @@
field public static final int shouldDisableView = 16843246; // 0x10101ee
field public static final int shouldUseDefaultUnfoldTransition = 16844364; // 0x101064c
field public static final int showAsAction = 16843481; // 0x10102d9
+ field public static final int showClockAndComplications;
field public static final int showDefault = 16843258; // 0x10101fa
field public static final int showDividers = 16843561; // 0x1010329
field public static final int showForAllUsers = 16844015; // 0x10104ef
@@ -27683,6 +27684,23 @@
package android.net.vcn {
+ public final class VcnCellUnderlyingNetworkTemplate extends android.net.vcn.VcnUnderlyingNetworkTemplate {
+ method @NonNull public java.util.Set<java.lang.String> getOperatorPlmnIds();
+ method public int getOpportunistic();
+ method public int getRoaming();
+ method @NonNull public java.util.Set<java.lang.Integer> getSimSpecificCarrierIds();
+ }
+
+ public static final class VcnCellUnderlyingNetworkTemplate.Builder {
+ ctor public VcnCellUnderlyingNetworkTemplate.Builder();
+ method @NonNull public android.net.vcn.VcnCellUnderlyingNetworkTemplate build();
+ method @NonNull public android.net.vcn.VcnCellUnderlyingNetworkTemplate.Builder setMetered(int);
+ method @NonNull public android.net.vcn.VcnCellUnderlyingNetworkTemplate.Builder setOperatorPlmnIds(@NonNull java.util.Set<java.lang.String>);
+ method @NonNull public android.net.vcn.VcnCellUnderlyingNetworkTemplate.Builder setOpportunistic(int);
+ method @NonNull public android.net.vcn.VcnCellUnderlyingNetworkTemplate.Builder setRoaming(int);
+ method @NonNull public android.net.vcn.VcnCellUnderlyingNetworkTemplate.Builder setSimSpecificCarrierIds(@NonNull java.util.Set<java.lang.Integer>);
+ }
+
public final class VcnConfig implements android.os.Parcelable {
method public int describeContents();
method @NonNull public java.util.Set<android.net.vcn.VcnGatewayConnectionConfig> getGatewayConnectionConfigs();
@@ -27701,6 +27719,7 @@
method @NonNull public String getGatewayConnectionName();
method @IntRange(from=0x500) public int getMaxMtu();
method @NonNull public long[] getRetryIntervalsMillis();
+ method @NonNull public java.util.List<android.net.vcn.VcnUnderlyingNetworkTemplate> getVcnUnderlyingNetworkPriorities();
}
public static final class VcnGatewayConnectionConfig.Builder {
@@ -27710,6 +27729,7 @@
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder removeExposedCapability(int);
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setMaxMtu(@IntRange(from=0x500) int);
method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setRetryIntervalsMillis(@NonNull long[]);
+ method @NonNull public android.net.vcn.VcnGatewayConnectionConfig.Builder setVcnUnderlyingNetworkPriorities(@NonNull java.util.List<android.net.vcn.VcnUnderlyingNetworkTemplate>);
}
public class VcnManager {
@@ -27733,6 +27753,24 @@
method public abstract void onStatusChanged(int);
}
+ public abstract class VcnUnderlyingNetworkTemplate {
+ method public int getMetered();
+ field public static final int MATCH_ANY = 0; // 0x0
+ field public static final int MATCH_FORBIDDEN = 2; // 0x2
+ field public static final int MATCH_REQUIRED = 1; // 0x1
+ }
+
+ public final class VcnWifiUnderlyingNetworkTemplate extends android.net.vcn.VcnUnderlyingNetworkTemplate {
+ method @NonNull public java.util.Set<java.lang.String> getSsids();
+ }
+
+ public static final class VcnWifiUnderlyingNetworkTemplate.Builder {
+ ctor public VcnWifiUnderlyingNetworkTemplate.Builder();
+ method @NonNull public android.net.vcn.VcnWifiUnderlyingNetworkTemplate build();
+ method @NonNull public android.net.vcn.VcnWifiUnderlyingNetworkTemplate.Builder setMetered(int);
+ method @NonNull public android.net.vcn.VcnWifiUnderlyingNetworkTemplate.Builder setSsids(@NonNull java.util.Set<java.lang.String>);
+ }
+
}
package android.nfc {
@@ -40265,6 +40303,7 @@
field public static final int PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL = 2048; // 0x800
field public static final int PROPERTY_RTT = 1024; // 0x400
field public static final int PROPERTY_SELF_MANAGED = 256; // 0x100
+ field public static final int PROPERTY_TETHERED_CALL = 32768; // 0x8000
field public static final int PROPERTY_VOIP_AUDIO_MODE = 4096; // 0x1000
field public static final int PROPERTY_WIFI = 8; // 0x8
}
@@ -40293,6 +40332,7 @@
field @NonNull public static final android.os.Parcelable.Creator<android.telecom.CallAudioState> CREATOR;
field public static final int ROUTE_BLUETOOTH = 2; // 0x2
field public static final int ROUTE_EARPIECE = 1; // 0x1
+ field public static final int ROUTE_EXTERNAL = 16; // 0x10
field public static final int ROUTE_SPEAKER = 8; // 0x8
field public static final int ROUTE_WIRED_HEADSET = 4; // 0x4
field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5
@@ -40567,6 +40607,7 @@
field public static final int PROPERTY_IS_RTT = 256; // 0x100
field public static final int PROPERTY_NETWORK_IDENTIFIED_EMERGENCY_CALL = 1024; // 0x400
field public static final int PROPERTY_SELF_MANAGED = 128; // 0x80
+ field public static final int PROPERTY_TETHERED_CALL = 16384; // 0x4000
field public static final int PROPERTY_WIFI = 8; // 0x8
field public static final int STATE_ACTIVE = 4; // 0x4
field public static final int STATE_DIALING = 3; // 0x3
@@ -41660,21 +41701,101 @@
field public static final String PROTOCOL_IPV6 = "IPV6";
}
+ public static final class CarrierConfigManager.Bsf {
+ field public static final String KEY_BSF_SERVER_FQDN_STRING = "bsf.bsf_server_fqdn_string";
+ field public static final String KEY_BSF_SERVER_PORT_INT = "bsf.bsf_server_port_int";
+ field public static final String KEY_BSF_TRANSPORT_TYPE_INT = "bsf.bsf_transport type_int";
+ field public static final String KEY_PREFIX = "bsf.";
+ }
+
public static final class CarrierConfigManager.Gps {
field public static final String KEY_PERSIST_LPP_MODE_BOOL = "gps.persist_lpp_mode_bool";
field public static final String KEY_PREFIX = "gps.";
}
public static final class CarrierConfigManager.Ims {
+ field public static final int E911_RTCP_INACTIVITY_ON_CONNECTED = 3; // 0x3
+ field public static final int E911_RTP_INACTIVITY_ON_CONNECTED = 4; // 0x4
+ field public static final int GEOLOCATION_PIDF_FOR_EMERGENCY_ON_CELLULAR = 4; // 0x4
+ field public static final int GEOLOCATION_PIDF_FOR_EMERGENCY_ON_WIFI = 2; // 0x2
+ field public static final int GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_CELLULAR = 3; // 0x3
+ field public static final int GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_WIFI = 1; // 0x1
+ field public static final int IPSEC_AUTHENTICATION_ALGORITHM_HMAC_MD5 = 0; // 0x0
+ field public static final int IPSEC_AUTHENTICATION_ALGORITHM_HMAC_SHA1 = 1; // 0x1
+ field public static final int IPSEC_ENCRYPTION_ALGORITHM_AES_CBC = 2; // 0x2
+ field public static final int IPSEC_ENCRYPTION_ALGORITHM_DES_EDE3_CBC = 1; // 0x1
+ field public static final int IPSEC_ENCRYPTION_ALGORITHM_NULL = 0; // 0x0
field public static final String KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL = "ims.enable_presence_capability_exchange_bool";
field public static final String KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL = "ims.enable_presence_group_subscribe_bool";
field public static final String KEY_ENABLE_PRESENCE_PUBLISH_BOOL = "ims.enable_presence_publish_bool";
+ field public static final String KEY_GEOLOCATION_PIDF_IN_SIP_INVITE_SUPPORT_INT_ARRAY = "ims.geolocation_pidf_in_sip_invite_support_int_array";
+ field public static final String KEY_GEOLOCATION_PIDF_IN_SIP_REGISTER_SUPPORT_INT_ARRAY = "ims.geolocation_pidf_in_sip_register_support_int_array";
+ field public static final String KEY_GRUU_ENABLED_BOOL = "ims.gruu_enabled_bool";
+ field public static final String KEY_IMS_PDN_ENABLED_IN_NO_VOPS_SUPPORT_INT_ARRAY = "ims.ims_pdn_enabled_in_no_vops_support_int_array";
field public static final String KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL = "ims.ims_single_registration_required_bool";
+ field public static final String KEY_IMS_USER_AGENT_STRING = "ims.ims_user_agent_string";
+ field public static final String KEY_IPSEC_AUTHENTICATION_ALGORITHMS_INT_ARRAY = "ims.ipsec_authentication_algorithms_int_array";
+ field public static final String KEY_IPSEC_ENCRYPTION_ALGORITHMS_INT_ARRAY = "ims.ipsec_encryption_algorithms_int_array";
+ field public static final String KEY_IPV4_SIP_MTU_SIZE_CELLULAR_INT = "ims.ipv4_sip_mtu_size_cellular_int";
+ field public static final String KEY_IPV6_SIP_MTU_SIZE_CELLULAR_INT = "ims.ipv6_sip_mtu_size_cellular_int";
+ field public static final String KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL = "ims.keep_pdn_up_in_no_vops_bool";
field public static final String KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT = "ims.non_rcs_capabilities_cache_expiration_sec_int";
+ field public static final String KEY_PHONE_CONTEXT_DOMAIN_NAME_STRING = "ims.phone_context_domain_name_string";
field public static final String KEY_PREFIX = "ims.";
field public static final String KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL = "ims.rcs_bulk_capability_exchange_bool";
field public static final String KEY_RCS_FEATURE_TAG_ALLOWED_STRING_ARRAY = "ims.rcs_feature_tag_allowed_string_array";
+ field public static final String KEY_REGISTRATION_EVENT_PACKAGE_SUPPORTED_BOOL = "ims.registration_event_package_supported_bool";
+ field public static final String KEY_REGISTRATION_EXPIRY_TIMER_SEC_INT = "ims.registration_expiry_timer_sec_int";
+ field public static final String KEY_REGISTRATION_RETRY_BASE_TIMER_MILLIS_INT = "ims.registration_retry_base_timer_millis_int";
+ field public static final String KEY_REGISTRATION_RETRY_MAX_TIMER_MILLIS_INT = "ims.registration_retry_max_timer_millis_int";
+ field public static final String KEY_REGISTRATION_SUBSCRIBE_EXPIRY_TIMER_SEC_INT = "ims.registration_subscribe_expiry_timer_sec_int";
+ field public static final String KEY_REQUEST_URI_TYPE_INT = "ims.request_uri_type_int";
+ field public static final String KEY_SIP_OVER_IPSEC_ENABLED_BOOL = "ims.sip_over_ipsec_enabled_bool";
+ field public static final String KEY_SIP_PREFERRED_TRANSPORT_INT = "ims.sip_preferred_transport_int";
+ field public static final String KEY_SIP_SERVER_PORT_NUMBER_INT = "ims.sip_server_port_number_int";
+ field public static final String KEY_SIP_TIMER_B_MILLIS_INT = "ims.sip_timer_b_millis_int";
+ field public static final String KEY_SIP_TIMER_C_MILLIS_INT = "ims.sip_timer_c_millis_int";
+ field public static final String KEY_SIP_TIMER_D_MILLIS_INT = "ims.sip_timer_d_millis_int";
+ field public static final String KEY_SIP_TIMER_F_MILLIS_INT = "ims.sip_timer_f_millis_int";
+ field public static final String KEY_SIP_TIMER_H_MILLIS_INT = "ims.sip_timer_h_millis_int";
+ field public static final String KEY_SIP_TIMER_J_MILLIS_INT = "ims.sip_timer_j_millis_int";
+ field public static final String KEY_SIP_TIMER_T1_MILLIS_INT = "ims.sip_timer_t1_millis_int";
+ field public static final String KEY_SIP_TIMER_T2_MILLIS_INT = "ims.sip_timer_t2_millis_int";
+ field public static final String KEY_SIP_TIMER_T4_MILLIS_INT = "ims.sip_timer_t4_millis_int";
field public static final String KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT = "ims.wifi_off_deferring_time_millis_int";
+ field public static final int NETWORK_TYPE_HOME = 0; // 0x0
+ field public static final int NETWORK_TYPE_ROAMING = 1; // 0x1
+ field public static final int PREFERRED_TRANSPORT_DYNAMIC_UDP_TCP = 2; // 0x2
+ field public static final int PREFERRED_TRANSPORT_TCP = 1; // 0x1
+ field public static final int PREFERRED_TRANSPORT_TLS = 3; // 0x3
+ field public static final int PREFERRED_TRANSPORT_UDP = 0; // 0x0
+ field public static final int REQUEST_URI_FORMAT_SIP = 1; // 0x1
+ field public static final int REQUEST_URI_FORMAT_TEL = 0; // 0x0
+ field public static final int RTCP_INACTIVITY_ON_CONNECTED = 1; // 0x1
+ field public static final int RTCP_INACTIVITY_ON_HOLD = 0; // 0x0
+ field public static final int RTP_INACTIVITY_ON_CONNECTED = 2; // 0x2
+ }
+
+ public static final class CarrierConfigManager.ImsEmergency {
+ field public static final String KEY_EMERGENCY_CALLBACK_MODE_SUPPORTED_BOOL = "imsemergency.emergency_callback_mode_supported_bool";
+ field public static final String KEY_EMERGENCY_OVER_IMS_SUPPORTED_RATS_INT_ARRAY = "imsemergency.emergency_over_ims_supported_rats_int_array";
+ field public static final String KEY_EMERGENCY_QOS_PRECONDITION_SUPPORTED_BOOL = "imsemergency.emergency_qos_precondition_supported_bool";
+ field public static final String KEY_EMERGENCY_REGISTRATION_TIMER_MILLIS_INT = "imsemergency.emergency_registration_timer_millis_int";
+ field public static final String KEY_PREFIX = "imsemergency.";
+ field public static final String KEY_RETRY_EMERGENCY_ON_IMS_PDN_BOOL = "imsemergency.retry_emergency_on_ims_pdn_bool";
+ }
+
+ public static final class CarrierConfigManager.ImsRtt {
+ field public static final String KEY_PREFIX = "imsrtt.";
+ field public static final String KEY_RED_PAYLOAD_TYPE_INT = "imsrtt.red_payload_type_int";
+ field public static final String KEY_T140_PAYLOAD_TYPE_INT = "imsrtt.t140_payload_type_int";
+ field public static final String KEY_TEXT_AS_BANDWIDTH_KBPS_INT = "imsrtt.text_as_bandwidth_kbps_int";
+ field public static final String KEY_TEXT_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE = "imsrtt.text_codec_capability_payload_types_bundle";
+ field public static final String KEY_TEXT_INACTIVITY_CALL_END_REASONS_INT_ARRAY = "imsrtt.text_inactivity_call_end_reasons_int_array";
+ field public static final String KEY_TEXT_ON_DEFAULT_BEARER_SUPPORTED_BOOL = "imsrtt.text_on_default_bearer_supported_bool";
+ field public static final String KEY_TEXT_QOS_PRECONDITION_SUPPORTED_BOOL = "imsrtt.text_qos_precondition_supported_bool";
+ field public static final String KEY_TEXT_RR_BANDWIDTH_BPS_INT = "imsrtt.text_rr_bandwidth_bps_int";
+ field public static final String KEY_TEXT_RS_BANDWIDTH_BPS_INT = "imsrtt.text_rs_bandwidth_bps_int";
}
public static final class CarrierConfigManager.ImsServiceEntitlement {
@@ -41685,6 +41806,167 @@
field public static final String KEY_SHOW_VOWIFI_WEBVIEW_BOOL = "imsserviceentitlement.show_vowifi_webview_bool";
}
+ public static final class CarrierConfigManager.ImsSms {
+ field public static final String KEY_PREFIX = "imssms.";
+ field public static final String KEY_SMS_CSFB_RETRY_ON_FAILURE_BOOL = "imssms.sms_csfb_retry_on_failure_bool";
+ field public static final String KEY_SMS_OVER_IMS_FORMAT_INT = "imssms.sms_over_ims_format_int";
+ field public static final String KEY_SMS_OVER_IMS_SUPPORTED_BOOL = "imssms.sms_over_ims_supported_bool";
+ field public static final String KEY_SMS_OVER_IMS_SUPPORTED_RATS_INT_ARRAY = "imssms.sms_over_ims_supported_rats_int_array";
+ field public static final int SMS_FORMAT_3GPP = 0; // 0x0
+ field public static final int SMS_FORMAT_3GPP2 = 1; // 0x1
+ }
+
+ public static final class CarrierConfigManager.ImsSs {
+ field public static final String KEY_NETWORK_INITIATED_USSD_OVER_IMS_SUPPORTED_BOOL = "imsss.network_initiated_ussd_over_ims_supported_bool";
+ field public static final String KEY_PREFIX = "imsss.";
+ field public static final String KEY_USE_CSFB_ON_XCAP_OVER_UT_FAILURE_BOOL = "imsss.use_csfb_on_xcap_over_ut_failure_bool";
+ field public static final String KEY_UT_AS_SERVER_FQDN_STRING = "imsss.ut_as_server_fqdn_string";
+ field public static final String KEY_UT_AS_SERVER_PORT_INT = "imsss.ut_as_server_port_int";
+ field public static final String KEY_UT_IPTYPE_HOME_INT = "imsss.ut_iptype_home_int";
+ field public static final String KEY_UT_IPTYPE_ROAMING_INT = "imsss.ut_iptype_roaming_int";
+ field public static final String KEY_UT_REQUIRES_IMS_REGISTRATION_BOOL = "imsss.ut_requires_ims_registration_bool";
+ field public static final String KEY_UT_SERVER_BASED_SERVICES_INT_ARRAY = "imsss.ut_server_based_services_int_array";
+ field public static final String KEY_UT_SUPPORTED_WHEN_PS_DATA_OFF_BOOL = "imsss.ut_supported_when_ps_data_off_bool";
+ field public static final String KEY_UT_TERMINAL_BASED_SERVICES_INT_ARRAY = "imsss.ut_terminal_based_services_int_array";
+ field public static final String KEY_UT_TRANSPORT_TYPE_INT = "imsss.ut_transport_type_int";
+ field public static final String KEY_XCAP_OVER_UT_SUPPORTED_RATS_INT_ARRAY = "imsss.xcap_over_ut_supported_rats_int_array";
+ field public static final int SUPPLEMENTARY_SERVICE_CB_ACR = 20; // 0x14
+ field public static final int SUPPLEMENTARY_SERVICE_CB_ALL = 12; // 0xc
+ field public static final int SUPPLEMENTARY_SERVICE_CB_BAIC = 18; // 0x12
+ field public static final int SUPPLEMENTARY_SERVICE_CB_BAOC = 14; // 0xe
+ field public static final int SUPPLEMENTARY_SERVICE_CB_BIC_ROAM = 19; // 0x13
+ field public static final int SUPPLEMENTARY_SERVICE_CB_BIL = 21; // 0x15
+ field public static final int SUPPLEMENTARY_SERVICE_CB_BOIC = 15; // 0xf
+ field public static final int SUPPLEMENTARY_SERVICE_CB_BOIC_EXHC = 16; // 0x10
+ field public static final int SUPPLEMENTARY_SERVICE_CB_IBS = 17; // 0x11
+ field public static final int SUPPLEMENTARY_SERVICE_CB_OBS = 13; // 0xd
+ field public static final int SUPPLEMENTARY_SERVICE_CF_ALL = 1; // 0x1
+ field public static final int SUPPLEMENTARY_SERVICE_CF_ALL_CONDITONAL_FORWARDING = 3; // 0x3
+ field public static final int SUPPLEMENTARY_SERVICE_CF_CFB = 4; // 0x4
+ field public static final int SUPPLEMENTARY_SERVICE_CF_CFNL = 7; // 0x7
+ field public static final int SUPPLEMENTARY_SERVICE_CF_CFNRC = 6; // 0x6
+ field public static final int SUPPLEMENTARY_SERVICE_CF_CFNRY = 5; // 0x5
+ field public static final int SUPPLEMENTARY_SERVICE_CF_CFU = 2; // 0x2
+ field public static final int SUPPLEMENTARY_SERVICE_CW = 0; // 0x0
+ field public static final int SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIP = 8; // 0x8
+ field public static final int SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIR = 10; // 0xa
+ field public static final int SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIP = 9; // 0x9
+ field public static final int SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIR = 11; // 0xb
+ }
+
+ public static final class CarrierConfigManager.ImsVoice {
+ field public static final int ALERTING_SRVCC_SUPPORT = 1; // 0x1
+ field public static final int BANDWIDTH_EFFICIENT = 0; // 0x0
+ field public static final int BASIC_SRVCC_SUPPORT = 0; // 0x0
+ field public static final int CONFERENCE_SUBSCRIBE_TYPE_IN_DIALOG = 0; // 0x0
+ field public static final int CONFERENCE_SUBSCRIBE_TYPE_OUT_OF_DIALOG = 1; // 0x1
+ field public static final int EVS_ENCODED_BW_TYPE_FB = 3; // 0x3
+ field public static final int EVS_ENCODED_BW_TYPE_NB = 0; // 0x0
+ field public static final int EVS_ENCODED_BW_TYPE_NB_WB = 4; // 0x4
+ field public static final int EVS_ENCODED_BW_TYPE_NB_WB_SWB = 5; // 0x5
+ field public static final int EVS_ENCODED_BW_TYPE_NB_WB_SWB_FB = 6; // 0x6
+ field public static final int EVS_ENCODED_BW_TYPE_SWB = 2; // 0x2
+ field public static final int EVS_ENCODED_BW_TYPE_WB = 1; // 0x1
+ field public static final int EVS_ENCODED_BW_TYPE_WB_SWB = 7; // 0x7
+ field public static final int EVS_ENCODED_BW_TYPE_WB_SWB_FB = 8; // 0x8
+ field public static final int EVS_OPERATIONAL_MODE_AMRWB_IO = 1; // 0x1
+ field public static final int EVS_OPERATIONAL_MODE_PRIMARY = 0; // 0x0
+ field public static final int EVS_PRIMARY_MODE_BITRATE_128_0_KBPS = 11; // 0xb
+ field public static final int EVS_PRIMARY_MODE_BITRATE_13_2_KBPS = 4; // 0x4
+ field public static final int EVS_PRIMARY_MODE_BITRATE_16_4_KBPS = 5; // 0x5
+ field public static final int EVS_PRIMARY_MODE_BITRATE_24_4_KBPS = 6; // 0x6
+ field public static final int EVS_PRIMARY_MODE_BITRATE_32_0_KBPS = 7; // 0x7
+ field public static final int EVS_PRIMARY_MODE_BITRATE_48_0_KBPS = 8; // 0x8
+ field public static final int EVS_PRIMARY_MODE_BITRATE_5_9_KBPS = 0; // 0x0
+ field public static final int EVS_PRIMARY_MODE_BITRATE_64_0_KBPS = 9; // 0x9
+ field public static final int EVS_PRIMARY_MODE_BITRATE_7_2_KBPS = 1; // 0x1
+ field public static final int EVS_PRIMARY_MODE_BITRATE_8_0_KBPS = 2; // 0x2
+ field public static final int EVS_PRIMARY_MODE_BITRATE_96_0_KBPS = 10; // 0xa
+ field public static final int EVS_PRIMARY_MODE_BITRATE_9_6_KBPS = 3; // 0x3
+ field public static final String KEY_AMRNB_PAYLOAD_DESCRIPTION_BUNDLE = "imsvoice.amrnb_payload_description_bundle";
+ field public static final String KEY_AMRNB_PAYLOAD_TYPE_INT_ARRAY = "imsvoice.amrnb_payload_type_int_array";
+ field public static final String KEY_AMRWB_PAYLOAD_DESCRIPTION_BUNDLE = "imsvoice.amrwb_payload_description_bundle";
+ field public static final String KEY_AMRWB_PAYLOAD_TYPE_INT_ARRAY = "imsvoice.amrwb_payload_type_int_array";
+ field public static final String KEY_AMR_CODEC_ATTRIBUTE_MODESET_INT_ARRAY = "imsvoice.amr_codec_attribute_modeset_int_array";
+ field public static final String KEY_AMR_CODEC_ATTRIBUTE_PAYLOAD_FORMAT_INT = "imsvoice.amr_codec_attribute_payload_format_int";
+ field public static final String KEY_AUDIO_AS_BANDWIDTH_KBPS_INT = "imsvoice.audio_as_bandwidth_kbps_int";
+ field public static final String KEY_AUDIO_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE = "imsvoice.audio_codec_capability_payload_types_bundle";
+ field public static final String KEY_AUDIO_INACTIVITY_CALL_END_REASONS_INT_ARRAY = "imsvoice.audio_inactivity_call_end_reasons_int_array";
+ field public static final String KEY_AUDIO_RR_BANDWIDTH_BPS_INT = "imsvoice.audio_rr_bandwidth_bps_int";
+ field public static final String KEY_AUDIO_RS_BANDWIDTH_BPS_INT = "imsvoice.audio_rs_bandwidth_bps_int";
+ field public static final String KEY_AUDIO_RTCP_INACTIVITY_TIMER_MILLIS_INT = "imsvoice.audio_rtcp_inactivity_timer_millis_int";
+ field public static final String KEY_AUDIO_RTP_INACTIVITY_TIMER_MILLIS_INT = "imsvoice.audio_rtp_inactivity_timer_millis_int";
+ field public static final String KEY_CARRIER_VOLTE_ROAMING_AVAILABLE_BOOL = "imsvoice.carrier_volte_roaming_available_bool";
+ field public static final String KEY_CODEC_ATTRIBUTE_MODE_CHANGE_CAPABILITY_INT = "imsvoice.codec_attribute_mode_change_capability_int";
+ field public static final String KEY_CODEC_ATTRIBUTE_MODE_CHANGE_NEIGHBOR_INT = "imsvoice.codec_attribute_mode_change_neighbor_int";
+ field public static final String KEY_CODEC_ATTRIBUTE_MODE_CHANGE_PERIOD_INT = "imsvoice.codec_attribute_mode_change_period_int";
+ field public static final String KEY_CONFERENCE_FACTORY_URI_STRING = "imsvoice.conference_factory_uri_string";
+ field public static final String KEY_CONFERENCE_SUBSCRIBE_TYPE_INT = "imsvoice.conference_subscribe_type_int";
+ field public static final String KEY_DEDICATED_BEARER_WAIT_TIMER_MILLIS_INT = "imsvoice.dedicated_bearer_wait_timer_millis_int";
+ field public static final String KEY_DTMFNB_PAYLOAD_TYPE_INT_ARRAY = "imsvoice.dtmfnb_payload_type_int_array";
+ field public static final String KEY_DTMFWB_PAYLOAD_TYPE_INT_ARRAY = "imsvoice.dtmfwb_payload_type_int_array";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_BANDWIDTH_INT = "imsvoice.evs_codec_attribute_bandwidth_int";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_BITRATE_INT_ARRAY = "imsvoice.evs_codec_attribute_bitrate_int_array";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_CHANNELS_INT = "imsvoice.evs_codec_attribute_channels_int";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_CH_AW_RECV_INT = "imsvoice.evs_codec_attribute_ch_aw_recv_int";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_CMR_INT = "imsvoice.codec_attribute_cmr_int";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_DTX_BOOL = "imsvoice.evs_codec_attribute_dtx_bool";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_DTX_RECV_BOOL = "imsvoice.evs_codec_attribute_dtx_recv_bool";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_HF_ONLY_INT = "imsvoice.evs_codec_attribute_hf_only_int";
+ field public static final String KEY_EVS_CODEC_ATTRIBUTE_MODE_SWITCH_INT = "imsvoice.evs_codec_attribute_mode_switch_int";
+ field public static final String KEY_EVS_PAYLOAD_DESCRIPTION_BUNDLE = "imsvoice.evs_payload_description_bundle";
+ field public static final String KEY_EVS_PAYLOAD_TYPE_INT_ARRAY = "imsvoice.evs_payload_type_int_array";
+ field public static final String KEY_INCLUDE_CALLER_ID_SERVICE_CODES_IN_SIP_INVITE_BOOL = "imsvoice.include_caller_id_service_codes_in_sip_invite_bool";
+ field public static final String KEY_MINIMUM_SESSION_EXPIRES_TIMER_SEC_INT = "imsvoice.minimum_session_expires_timer_sec_int";
+ field public static final String KEY_MO_CALL_REQUEST_TIMEOUT_MILLIS_INT = "imsvoice.mo_call_request_timeout_millis_int";
+ field public static final String KEY_MULTIENDPOINT_SUPPORTED_BOOL = "imsvoice.multiendpoint_supported_bool";
+ field public static final String KEY_OIP_SOURCE_FROM_HEADER_BOOL = "imsvoice.oip_source_from_header_bool";
+ field public static final String KEY_PRACK_SUPPORTED_FOR_18X_BOOL = "imsvoice.prack_supported_for_18x_bool";
+ field public static final String KEY_PREFIX = "imsvoice.";
+ field public static final String KEY_RINGBACK_TIMER_MILLIS_INT = "imsvoice.ringback_timer_millis_int";
+ field public static final String KEY_RINGING_TIMER_MILLIS_INT = "imsvoice.ringing_timer_millis_int";
+ field public static final String KEY_SESSION_EXPIRES_TIMER_SEC_INT = "imsvoice.session_expires_timer_sec_int";
+ field public static final String KEY_SESSION_REFRESHER_TYPE_INT = "imsvoice.session_refresher_type_int";
+ field public static final String KEY_SESSION_REFRESH_METHOD_INT = "imsvoice.session_refresh_method_int";
+ field public static final String KEY_SESSION_TIMER_SUPPORTED_BOOL = "imsvoice.session_timer_supported_bool";
+ field public static final String KEY_SRVCC_TYPE_INT_ARRAY = "imsvoice.srvcc_type_int_array";
+ field public static final String KEY_VOICE_ON_DEFAULT_BEARER_SUPPORTED_BOOL = "imsvoice.voice_on_default_bearer_supported_bool";
+ field public static final String KEY_VOICE_QOS_PRECONDITION_SUPPORTED_BOOL = "imsvoice.voice_qos_precondition_supported_bool";
+ field public static final int MIDCALL_SRVCC_SUPPORT = 3; // 0x3
+ field public static final int OCTET_ALIGNED = 1; // 0x1
+ field public static final int PREALERTING_SRVCC_SUPPORT = 2; // 0x2
+ field public static final int SESSION_REFRESHER_TYPE_UAC = 1; // 0x1
+ field public static final int SESSION_REFRESHER_TYPE_UAS = 2; // 0x2
+ field public static final int SESSION_REFRESHER_TYPE_UNKNOWN = 0; // 0x0
+ field public static final int SESSION_REFRESH_METHOD_INVITE = 0; // 0x0
+ field public static final int SESSION_REFRESH_METHOD_UPDATE_PREFERRED = 1; // 0x1
+ }
+
+ public static final class CarrierConfigManager.ImsVt {
+ field public static final String KEY_H264_PAYLOAD_DESCRIPTION_BUNDLE = "imsvt.h264_payload_description_bundle";
+ field public static final String KEY_H264_PAYLOAD_TYPE_INT_ARRAY = "imsvt.h264_payload_type_int_array";
+ field public static final String KEY_H264_VIDEO_CODEC_ATTRIBUTE_PROFILE_LEVEL_ID_STRING = "imsvt.h264_video_codec_attribute_profile_level_id_string";
+ field public static final String KEY_PREFIX = "imsvt.";
+ field public static final String KEY_VIDEO_AS_BANDWIDTH_KBPS_INT = "imsvt.video_as_bandwidth_kbps_int";
+ field public static final String KEY_VIDEO_CODEC_ATTRIBUTE_FRAME_RATE_INT = "imsvt.video_codec_attribute_frame_rate_int";
+ field public static final String KEY_VIDEO_CODEC_ATTRIBUTE_PACKETIZATION_MODE_INT = "imsvt.video_codec_attribute_packetization_mode_int";
+ field public static final String KEY_VIDEO_CODEC_ATTRIBUTE_RESOLUTION_INT_ARRAY = "imsvt.video_codec_attribute_resolution_int_array";
+ field public static final String KEY_VIDEO_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE = "imsvt.video_codec_capability_payload_types_bundle";
+ field public static final String KEY_VIDEO_ON_DEFAULT_BEARER_SUPPORTED_BOOL = "imsvt.video_on_default_bearer_supported_bool";
+ field public static final String KEY_VIDEO_QOS_PRECONDITION_SUPPORTED_BOOL = "imsvt.video_qos_precondition_supported_bool";
+ field public static final String KEY_VIDEO_RR_BANDWIDTH_BPS_INT = "imsvt.video_rr_bandwidth_bps_int";
+ field public static final String KEY_VIDEO_RS_BANDWIDTH_BPS_INT = "imsvt.video_rs_bandwidth_bps_int";
+ field public static final String KEY_VIDEO_RTCP_INACTIVITY_TIMER_MILLIS_INT = "imsvt.video_rtcp_inactivity_timer_millis_int";
+ field public static final String KEY_VIDEO_RTP_DSCP_INT = "imsvt.video_rtp_dscp_int";
+ field public static final String KEY_VIDEO_RTP_INACTIVITY_TIMER_MILLIS_INT = "imsvt.video_rtp_inactivity_timer_millis_int";
+ }
+
+ public static final class CarrierConfigManager.ImsWfc {
+ field public static final String KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL = "imswfc.emergency_call_over_emergency_pdn_bool";
+ field public static final String KEY_PIDF_SHORT_CODE_STRING_ARRAY = "imswfc.pidf_short_code_string_array";
+ field public static final String KEY_PREFIX = "imswfc.";
+ }
+
public static final class CarrierConfigManager.Iwlan {
field public static final int AUTHENTICATION_METHOD_CERT = 1; // 0x1
field public static final int AUTHENTICATION_METHOD_EAP_ONLY = 0; // 0x0
@@ -41702,6 +41984,7 @@
field public static final String KEY_CHILD_SESSION_AES_CTR_KEY_SIZE_INT_ARRAY = "iwlan.child_session_aes_ctr_key_size_int_array";
field public static final String KEY_DIFFIE_HELLMAN_GROUPS_INT_ARRAY = "iwlan.diffie_hellman_groups_int_array";
field public static final String KEY_DPD_TIMER_SEC_INT = "iwlan.dpd_timer_sec_int";
+ field public static final String KEY_ENABLE_SUPPORT_FOR_EAP_AKA_FAST_REAUTH_BOOL = "iwlan.enable_support_for_eap_aka_fast_reauth_bool";
field public static final String KEY_EPDG_ADDRESS_PRIORITY_INT_ARRAY = "iwlan.epdg_address_priority_int_array";
field public static final String KEY_EPDG_AUTHENTICATION_METHOD_INT = "iwlan.epdg_authentication_method_int";
field public static final String KEY_EPDG_PCO_ID_IPV4_INT = "iwlan.epdg_pco_id_ipv4_int";
@@ -51939,6 +52222,7 @@
field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
field public static final int TYPE_APPLICATION = 1; // 0x1
field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+ field public static final int TYPE_MAGNIFICATION_OVERLAY = 6; // 0x6
field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
field public static final int TYPE_SYSTEM = 3; // 0x3
}
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 0991e5f..1794c131 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -165,6 +165,7 @@
field public static final String MANAGE_ROLE_HOLDERS = "android.permission.MANAGE_ROLE_HOLDERS";
field public static final String MANAGE_ROLLBACKS = "android.permission.MANAGE_ROLLBACKS";
field public static final String MANAGE_ROTATION_RESOLVER = "android.permission.MANAGE_ROTATION_RESOLVER";
+ field public static final String MANAGE_SAFETY_CENTER = "android.permission.MANAGE_SAFETY_CENTER";
field public static final String MANAGE_SEARCH_UI = "android.permission.MANAGE_SEARCH_UI";
field public static final String MANAGE_SENSOR_PRIVACY = "android.permission.MANAGE_SENSOR_PRIVACY";
field public static final String MANAGE_SMARTSPACE = "android.permission.MANAGE_SMARTSPACE";
@@ -226,7 +227,6 @@
field public static final String READ_APP_SPECIFIC_LOCALES = "android.permission.READ_APP_SPECIFIC_LOCALES";
field public static final String READ_CARRIER_APP_INFO = "android.permission.READ_CARRIER_APP_INFO";
field public static final String READ_CELL_BROADCASTS = "android.permission.READ_CELL_BROADCASTS";
- field public static final String READ_COMMUNAL_STATE = "android.permission.READ_COMMUNAL_STATE";
field public static final String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS";
field public static final String READ_DEVICE_CONFIG = "android.permission.READ_DEVICE_CONFIG";
field public static final String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE";
@@ -404,6 +404,7 @@
field public static final int config_systemAmbientAudioIntelligence = 17039411; // 0x1040033
field public static final int config_systemAppProtectionService;
field public static final int config_systemAudioIntelligence = 17039412; // 0x1040034
+ field public static final int config_systemAutomotiveCalendarSyncManager;
field public static final int config_systemAutomotiveCluster = 17039400; // 0x1040028
field public static final int config_systemAutomotiveProjection = 17039401; // 0x1040029
field public static final int config_systemCompanionDeviceProvider = 17039417; // 0x1040039
@@ -1391,13 +1392,6 @@
package android.app.communal {
public final class CommunalManager {
- method @RequiresPermission(android.Manifest.permission.READ_COMMUNAL_STATE) public void addCommunalModeListener(@NonNull java.util.concurrent.Executor, @NonNull android.app.communal.CommunalManager.CommunalModeListener);
- method @RequiresPermission(android.Manifest.permission.READ_COMMUNAL_STATE) public boolean isCommunalMode();
- method @RequiresPermission(android.Manifest.permission.READ_COMMUNAL_STATE) public void removeCommunalModeListener(@NonNull android.app.communal.CommunalManager.CommunalModeListener);
- }
-
- @java.lang.FunctionalInterface public static interface CommunalManager.CommunalModeListener {
- method public void onCommunalModeChanged(boolean);
}
}
@@ -2436,6 +2430,25 @@
package android.bluetooth.le {
+ public final class AdvertiseSettings implements android.os.Parcelable {
+ method public int getOwnAddressType();
+ }
+
+ public static final class AdvertiseSettings.Builder {
+ method @NonNull public android.bluetooth.le.AdvertiseSettings.Builder setOwnAddressType(int);
+ }
+
+ public final class AdvertisingSetParameters implements android.os.Parcelable {
+ method public int getOwnAddressType();
+ field public static final int ADDRESS_TYPE_DEFAULT = -1; // 0xffffffff
+ field public static final int ADDRESS_TYPE_PUBLIC = 0; // 0x0
+ field public static final int ADDRESS_TYPE_RANDOM = 1; // 0x1
+ }
+
+ public static final class AdvertisingSetParameters.Builder {
+ method @NonNull public android.bluetooth.le.AdvertisingSetParameters.Builder setOwnAddressType(int);
+ }
+
public final class BluetoothLeScanner {
method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.UPDATE_DEVICE_STATS}) public void startScanFromSource(android.os.WorkSource, android.bluetooth.le.ScanCallback);
method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.UPDATE_DEVICE_STATS}) public void startScanFromSource(java.util.List<android.bluetooth.le.ScanFilter>, android.bluetooth.le.ScanSettings, android.os.WorkSource, android.bluetooth.le.ScanCallback);
@@ -3031,6 +3044,7 @@
method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS}) public abstract void updatePermissionFlags(@NonNull String, @NonNull String, @android.content.pm.PackageManager.PermissionFlags int, @android.content.pm.PackageManager.PermissionFlags int, @NonNull android.os.UserHandle);
method @Deprecated @RequiresPermission(android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT) public abstract void verifyIntentFilter(int, int, @NonNull java.util.List<java.lang.String>);
field public static final String ACTION_REQUEST_PERMISSIONS = "android.content.pm.action.REQUEST_PERMISSIONS";
+ field public static final String ACTION_REQUEST_PERMISSIONS_FOR_OTHER = "android.content.pm.action.REQUEST_PERMISSIONS_FOR_OTHER";
field public static final String EXTRA_REQUEST_PERMISSIONS_NAMES = "android.content.pm.extra.REQUEST_PERMISSIONS_NAMES";
field public static final String EXTRA_REQUEST_PERMISSIONS_RESULTS = "android.content.pm.extra.REQUEST_PERMISSIONS_RESULTS";
field public static final String FEATURE_BROADCAST_RADIO = "android.hardware.broadcastradio";
@@ -6720,8 +6734,8 @@
method @Nullable public String acquireSharedFilterToken();
method public void close();
method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
- method public int delayCallbackUntilBufferFilled(int);
- method public int delayCallbackUntilTimeMillis(long);
+ method public int delayCallbackUntilBytesAccumulated(int);
+ method public int delayCallbackUntilMillisElapsed(long);
method public int flush();
method public void freeSharedFilterToken(@NonNull String);
method @Deprecated public int getId();
@@ -6940,12 +6954,14 @@
}
public abstract class SectionSettings extends android.media.tv.tuner.filter.Settings {
+ method public int getBitWidthOfLengthField();
method public boolean isCrcEnabled();
method public boolean isRaw();
method public boolean isRepeat();
}
public abstract static class SectionSettings.Builder<T extends android.media.tv.tuner.filter.SectionSettings.Builder<T>> {
+ method @NonNull public T setBitWidthOfLengthField(@IntRange(from=0) int);
method @NonNull public T setCrcEnabled(boolean);
method @NonNull public T setRaw(boolean);
method @NonNull public T setRepeat(boolean);
@@ -9346,6 +9362,7 @@
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean isUserOfType(@NonNull String);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isUserUnlockingOrUnlocked(@NonNull android.os.UserHandle);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean removeUser(@NonNull android.os.UserHandle);
+ method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public int removeUserWhenPossible(@NonNull android.os.UserHandle, boolean);
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserIcon(@NonNull android.graphics.Bitmap) throws android.os.UserManager.UserOperationException;
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setUserName(@Nullable String);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean someUserHasAccount(@NonNull String, @NonNull String);
@@ -9353,6 +9370,10 @@
field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED";
field @Deprecated public static final String DISALLOW_OEM_UNLOCK = "no_oem_unlock";
field public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
+ field public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; // 0x2
+ field public static final int REMOVE_RESULT_DEFERRED = 1; // 0x1
+ field public static final int REMOVE_RESULT_ERROR = 3; // 0x3
+ field public static final int REMOVE_RESULT_REMOVED = 0; // 0x0
field public static final int RESTRICTION_NOT_SET = 0; // 0x0
field public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 2; // 0x2
field public static final int RESTRICTION_SOURCE_PROFILE_OWNER = 4; // 0x4
@@ -9530,7 +9551,7 @@
public final class StorageVolume implements android.os.Parcelable {
method @NonNull public String getId();
- method public boolean isStub();
+ method public boolean isExternallyManaged();
}
}
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 0710781..66250fce 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -36,6 +36,7 @@
field public static final String RECORD_BACKGROUND_AUDIO = "android.permission.RECORD_BACKGROUND_AUDIO";
field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS";
field public static final String RESET_APP_ERRORS = "android.permission.RESET_APP_ERRORS";
+ field public static final String REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL = "android.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL";
field public static final String SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS = "android.permission.SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS";
field public static final String START_TASKS_FROM_RECENTS = "android.permission.START_TASKS_FROM_RECENTS";
field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS";
@@ -66,6 +67,7 @@
public static final class R.string {
field public static final int config_defaultAssistant = 17039393; // 0x1040021
field public static final int config_defaultDialer = 17039395; // 0x1040023
+ field public static final int config_systemAutomotiveCalendarSyncManager;
field public static final int config_systemAutomotiveCluster = 17039400; // 0x1040028
field public static final int config_systemAutomotiveProjection = 17039401; // 0x1040029
field public static final int config_systemGallery = 17039399; // 0x1040027
@@ -1822,13 +1824,21 @@
public static final class VibrationEffect.WaveformBuilder {
method @NonNull public android.os.VibrationEffect.WaveformBuilder addRamp(@FloatRange(from=0.0f, to=1.0f) float, @IntRange(from=0) int);
- method @NonNull public android.os.VibrationEffect.WaveformBuilder addRamp(@FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=-1.0F, to=1.0f) float, @IntRange(from=0) int);
+ method @NonNull public android.os.VibrationEffect.WaveformBuilder addRamp(@FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=1.0f) float, @IntRange(from=0) int);
method @NonNull public android.os.VibrationEffect.WaveformBuilder addStep(@FloatRange(from=0.0f, to=1.0f) float, @IntRange(from=0) int);
- method @NonNull public android.os.VibrationEffect.WaveformBuilder addStep(@FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=-1.0F, to=1.0f) float, @IntRange(from=0) int);
+ method @NonNull public android.os.VibrationEffect.WaveformBuilder addStep(@FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=1.0f) float, @IntRange(from=0) int);
method @NonNull public android.os.VibrationEffect build();
method @NonNull public android.os.VibrationEffect build(int);
}
+ public abstract class Vibrator {
+ method public int getDefaultVibrationIntensity(int);
+ field public static final int VIBRATION_INTENSITY_HIGH = 3; // 0x3
+ field public static final int VIBRATION_INTENSITY_LOW = 1; // 0x1
+ field public static final int VIBRATION_INTENSITY_MEDIUM = 2; // 0x2
+ field public static final int VIBRATION_INTENSITY_OFF = 0; // 0x0
+ }
+
public class VintfObject {
method public static String[] getHalNamesAndVersions();
method @NonNull public static String getPlatformSepolicyVersion();
@@ -1982,9 +1992,9 @@
method public int describeContents();
method public long getDuration();
method public float getEndAmplitude();
- method public float getEndFrequency();
+ method public float getEndFrequencyHz();
method public float getStartAmplitude();
- method public float getStartFrequency();
+ method public float getStartFrequencyHz();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.os.vibrator.RampSegment> CREATOR;
}
@@ -1993,7 +2003,7 @@
method public int describeContents();
method public float getAmplitude();
method public long getDuration();
- method public float getFrequency();
+ method public float getFrequencyHz();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.os.vibrator.StepSegment> CREATOR;
}
@@ -2036,6 +2046,7 @@
method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.permission.PermGroupUsage> getIndicatorAppOpUsageData();
method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List<android.permission.PermGroupUsage> getIndicatorAppOpUsageData(boolean);
method @NonNull public android.content.AttributionSource registerAttributionSource(@NonNull android.content.AttributionSource);
+ method public void revokePostNotificationPermissionWithoutKillForTest(@NonNull String, int);
}
}
@@ -2309,6 +2320,7 @@
method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
method public abstract void onStartDream(@NonNull android.view.WindowManager.LayoutParams);
method public final void requestExit();
+ method public final boolean shouldShowComplications();
}
}
diff --git a/core/java/android/accessibilityservice/GestureDescription.java b/core/java/android/accessibilityservice/GestureDescription.java
index a821dad..857c541 100644
--- a/core/java/android/accessibilityservice/GestureDescription.java
+++ b/core/java/android/accessibilityservice/GestureDescription.java
@@ -525,7 +525,7 @@
public GestureStep(Parcel parcel) {
timeSinceGestureStart = parcel.readLong();
Parcelable[] parcelables =
- parcel.readParcelableArray(TouchPoint.class.getClassLoader());
+ parcel.readParcelableArray(TouchPoint.class.getClassLoader(), TouchPoint.class);
numTouchPoints = (parcelables == null) ? 0 : parcelables.length;
touchPoints = new TouchPoint[numTouchPoints];
for (int i = 0; i < numTouchPoints; i++) {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1778ea4..d90010e 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4178,15 +4178,20 @@
view.requestLayout();
view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
+ private boolean mHandled = false;
@Override
public void onDraw() {
+ if (mHandled) {
+ return;
+ }
+ mHandled = true;
// Transfer the splash screen view from shell to client.
// Call syncTransferSplashscreenViewTransaction at the first onDraw so we can ensure
// the client view is ready to show and we can use applyTransactionOnDraw to make
// all transitions happen at the same frame.
syncTransferSplashscreenViewTransaction(
view, r.token, decorView, startingWindowLeash);
- view.postOnAnimation(() -> view.getViewTreeObserver().removeOnDrawListener(this));
+ view.post(() -> view.getViewTreeObserver().removeOnDrawListener(this));
}
});
}
@@ -4645,12 +4650,14 @@
}
private void handleDumpGfxInfo(DumpComponentInfo info) {
+ final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
try {
ThreadedRenderer.handleDumpGfxInfo(info.fd.getFileDescriptor(), info.args);
} catch (Exception e) {
Log.w(TAG, "Caught exception from dumpGfxInfo()", e);
} finally {
IoUtils.closeQuietly(info.fd);
+ StrictMode.setThreadPolicy(oldPolicy);
}
}
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index b052bc5..a9ec11e 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -178,17 +178,16 @@
Point getAppTaskThumbnailSize();
/**
* Only callable from the system. This token grants a temporary permission to call
- * #startActivityAsCallerWithToken. The token will time out after
- * START_AS_CALLER_TOKEN_TIMEOUT if it is not used.
+ * #startActivityAsCaller. The token will time out after START_AS_CALLER_TOKEN_TIMEOUT
+ * if it is not used.
*
- * @param delegatorToken The Binder token referencing the system Activity that wants to delegate
- * the #startActivityAsCaller to another app. The "caller" will be the caller of this
- * activity's token, not the delegate's caller (which is probably the delegator itself).
+ * @param componentName The component name of the delegated component that is allowed to
+ * call #startActivityAsCaller with the returned token.
*
* @return Returns a token that can be given to a "delegate" app that may call
* #startActivityAsCaller
*/
- IBinder requestStartActivityPermissionToken(in IBinder delegatorToken);
+ IBinder requestStartActivityPermissionToken(in ComponentName componentName);
oneway void releaseSomeActivities(in IApplicationThread app);
Bitmap getTaskDescriptionIcon(in String filename, int userId);
diff --git a/core/java/android/app/communal/CommunalManager.java b/core/java/android/app/communal/CommunalManager.java
index 22bd9d1..c7368ad 100644
--- a/core/java/android/app/communal/CommunalManager.java
+++ b/core/java/android/app/communal/CommunalManager.java
@@ -17,7 +17,6 @@
package android.app.communal;
import android.Manifest;
-import android.annotation.NonNull;
import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
@@ -26,9 +25,6 @@
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.RemoteException;
-import android.util.ArrayMap;
-
-import java.util.concurrent.Executor;
/**
* System private class for talking with the
@@ -41,12 +37,10 @@
@RequiresFeature(PackageManager.FEATURE_COMMUNAL_MODE)
public final class CommunalManager {
private final ICommunalManager mService;
- private final ArrayMap<CommunalModeListener, ICommunalModeListener> mCommunalModeListeners;
/** @hide */
public CommunalManager(ICommunalManager service) {
mService = service;
- mCommunalModeListeners = new ArrayMap<>();
}
/**
@@ -65,72 +59,4 @@
throw e.rethrowFromSystemServer();
}
}
-
- /**
- * Checks whether or not the communal view is currently showing over the lockscreen.
- */
- @RequiresPermission(Manifest.permission.READ_COMMUNAL_STATE)
- public boolean isCommunalMode() {
- try {
- return mService.isCommunalMode();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Listener for communal state changes.
- */
- @FunctionalInterface
- public interface CommunalModeListener {
- /**
- * Callback function that executes when the communal state changes.
- */
- void onCommunalModeChanged(boolean isCommunalMode);
- }
-
- /**
- * Registers a callback to execute when the communal state changes.
- *
- * @param listener The listener to add to receive communal state changes.
- * @param executor {@link Executor} to dispatch to. To dispatch the callback to the main
- * thread of your application, use
- * {@link android.content.Context#getMainExecutor()}.
- */
- @RequiresPermission(Manifest.permission.READ_COMMUNAL_STATE)
- public void addCommunalModeListener(@NonNull Executor executor,
- @NonNull CommunalModeListener listener) {
- synchronized (mCommunalModeListeners) {
- try {
- ICommunalModeListener iListener = new ICommunalModeListener.Stub() {
- @Override
- public void onCommunalModeChanged(boolean isCommunalMode) {
- executor.execute(() -> listener.onCommunalModeChanged(isCommunalMode));
- }
- };
- mService.addCommunalModeListener(iListener);
- mCommunalModeListeners.put(listener, iListener);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
- }
-
- /**
- * Unregisters a callback that executes when communal state changes.
- */
- @RequiresPermission(Manifest.permission.READ_COMMUNAL_STATE)
- public void removeCommunalModeListener(@NonNull CommunalModeListener listener) {
- synchronized (mCommunalModeListeners) {
- ICommunalModeListener iListener = mCommunalModeListeners.get(listener);
- if (iListener != null) {
- try {
- mService.removeCommunalModeListener(iListener);
- mCommunalModeListeners.remove(listener);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
- }
- }
}
diff --git a/core/java/android/app/communal/ICommunalManager.aidl b/core/java/android/app/communal/ICommunalManager.aidl
index 869891e..df9d7ce 100644
--- a/core/java/android/app/communal/ICommunalManager.aidl
+++ b/core/java/android/app/communal/ICommunalManager.aidl
@@ -16,8 +16,6 @@
package android.app.communal;
-import android.app.communal.ICommunalModeListener;
-
/**
* System private API for talking with the communal manager service that handles communal mode
* state.
@@ -26,7 +24,4 @@
*/
interface ICommunalManager {
oneway void setCommunalViewShowing(boolean isShowing);
- boolean isCommunalMode();
- void addCommunalModeListener(in ICommunalModeListener listener);
- void removeCommunalModeListener(in ICommunalModeListener listener);
}
\ No newline at end of file
diff --git a/core/java/android/app/trust/TrustManager.java b/core/java/android/app/trust/TrustManager.java
index 65b2775..177de83 100644
--- a/core/java/android/app/trust/TrustManager.java
+++ b/core/java/android/app/trust/TrustManager.java
@@ -156,7 +156,7 @@
@Override
public void onTrustError(CharSequence message) {
- Message m = mHandler.obtainMessage(MSG_TRUST_ERROR);
+ Message m = mHandler.obtainMessage(MSG_TRUST_ERROR, trustListener);
m.getData().putCharSequence(DATA_MESSAGE, message);
m.sendToTarget();
}
diff --git a/core/java/android/bluetooth/BluetoothLeCallControl.java b/core/java/android/bluetooth/BluetoothLeCallControl.java
index 5283e08..fb080c9 100644
--- a/core/java/android/bluetooth/BluetoothLeCallControl.java
+++ b/core/java/android/bluetooth/BluetoothLeCallControl.java
@@ -312,14 +312,11 @@
@Override
public void onBearerRegistered(int ccid) {
- synchronized (mServerIfLock) {
- if (mCallback != null) {
- mCcid = ccid;
- mServerIfLock.notifyAll();
- } else {
- // registration timeout
- Log.e(TAG, "onBearerRegistered: mCallback is null");
- }
+ if (mCallback != null) {
+ mCcid = ccid;
+ } else {
+ // registration timeout
+ Log.e(TAG, "onBearerRegistered: mCallback is null");
}
}
@@ -396,7 +393,6 @@
private int mCcid = 0;
private String mToken;
private Callback mCallback = null;
- private Object mServerIfLock = new Object();
private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
new IBluetoothStateChangeCallback.Stub() {
@@ -573,38 +569,30 @@
final IBluetoothLeCallControl service = getService();
if (service != null) {
- synchronized (mServerIfLock) {
- if (mCallback != null) {
- Log.e(TAG, "Bearer can be opened only once");
- return false;
- }
-
- mCallback = callback;
- try {
- CallbackWrapper callbackWrapper = new CallbackWrapper(executor, callback);
- service.registerBearer(mToken, callbackWrapper, uci, uriSchemes, capabilities,
- provider, technology);
- } catch (RemoteException e) {
- Log.e(TAG, "", e);
- mCallback = null;
- return false;
- }
-
- try {
- mServerIfLock.wait(REG_TIMEOUT);
- } catch (InterruptedException e) {
- Log.e(TAG, "" + e);
- mCallback = null;
- }
-
- if (mCcid == 0) {
- mCallback = null;
- return false;
- }
-
- return true;
+ if (mCallback != null) {
+ Log.e(TAG, "Bearer can be opened only once");
+ return false;
}
+
+ mCallback = callback;
+ try {
+ CallbackWrapper callbackWrapper = new CallbackWrapper(executor, callback);
+ service.registerBearer(mToken, callbackWrapper, uci, uriSchemes, capabilities,
+ provider, technology);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ mCallback = null;
+ return false;
+ }
+
+ if (mCcid == 0) {
+ mCallback = null;
+ return false;
+ }
+
+ return true;
}
+
if (service == null) {
Log.w(TAG, "Proxy not attached to service");
}
diff --git a/core/java/android/bluetooth/le/AdvertiseSettings.java b/core/java/android/bluetooth/le/AdvertiseSettings.java
index 7129d76..c52a6ee 100644
--- a/core/java/android/bluetooth/le/AdvertiseSettings.java
+++ b/core/java/android/bluetooth/le/AdvertiseSettings.java
@@ -16,6 +16,9 @@
package android.bluetooth.le;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.bluetooth.le.AdvertisingSetParameters.AddressTypeStatus;
import android.os.Parcel;
import android.os.Parcelable;
@@ -70,17 +73,21 @@
*/
private static final int LIMITED_ADVERTISING_MAX_MILLIS = 180 * 1000;
+
private final int mAdvertiseMode;
private final int mAdvertiseTxPowerLevel;
private final int mAdvertiseTimeoutMillis;
private final boolean mAdvertiseConnectable;
+ private final int mOwnAddressType;
private AdvertiseSettings(int advertiseMode, int advertiseTxPowerLevel,
- boolean advertiseConnectable, int advertiseTimeout) {
+ boolean advertiseConnectable, int advertiseTimeout,
+ @AddressTypeStatus int ownAddressType) {
mAdvertiseMode = advertiseMode;
mAdvertiseTxPowerLevel = advertiseTxPowerLevel;
mAdvertiseConnectable = advertiseConnectable;
mAdvertiseTimeoutMillis = advertiseTimeout;
+ mOwnAddressType = ownAddressType;
}
private AdvertiseSettings(Parcel in) {
@@ -88,6 +95,7 @@
mAdvertiseTxPowerLevel = in.readInt();
mAdvertiseConnectable = in.readInt() != 0;
mAdvertiseTimeoutMillis = in.readInt();
+ mOwnAddressType = in.readInt();
}
/**
@@ -118,12 +126,23 @@
return mAdvertiseTimeoutMillis;
}
+ /**
+ * @return the own address type for advertising
+ *
+ * @hide
+ */
+ @SystemApi
+ public @AddressTypeStatus int getOwnAddressType() {
+ return mOwnAddressType;
+ }
+
@Override
public String toString() {
return "Settings [mAdvertiseMode=" + mAdvertiseMode
+ ", mAdvertiseTxPowerLevel=" + mAdvertiseTxPowerLevel
+ ", mAdvertiseConnectable=" + mAdvertiseConnectable
- + ", mAdvertiseTimeoutMillis=" + mAdvertiseTimeoutMillis + "]";
+ + ", mAdvertiseTimeoutMillis=" + mAdvertiseTimeoutMillis
+ + ", mOwnAddressType=" + mOwnAddressType + "]";
}
@Override
@@ -137,6 +156,7 @@
dest.writeInt(mAdvertiseTxPowerLevel);
dest.writeInt(mAdvertiseConnectable ? 1 : 0);
dest.writeInt(mAdvertiseTimeoutMillis);
+ dest.writeInt(mOwnAddressType);
}
public static final @android.annotation.NonNull Parcelable.Creator<AdvertiseSettings> CREATOR =
@@ -160,6 +180,7 @@
private int mTxPowerLevel = ADVERTISE_TX_POWER_MEDIUM;
private int mTimeoutMillis = 0;
private boolean mConnectable = true;
+ private int mOwnAddressType = AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT;
/**
* Set advertise mode to control the advertising power and latency.
@@ -226,10 +247,31 @@
}
/**
+ * Set own address type for advertising to control public or privacy mode. If used to set
+ * address type anything other than {@link AdvertisingSetParameters#ADDRESS_TYPE_DEFAULT},
+ * then it will require BLUETOOTH_PRIVILEGED permission and will be checked at the
+ * time of starting advertising.
+ *
+ * @throws IllegalArgumentException If the {@code ownAddressType} is invalid
+ *
+ * @hide
+ */
+ @SystemApi
+ public @NonNull Builder setOwnAddressType(@AddressTypeStatus int ownAddressType) {
+ if (ownAddressType < AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT
+ || ownAddressType > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM) {
+ throw new IllegalArgumentException("unknown address type " + ownAddressType);
+ }
+ mOwnAddressType = ownAddressType;
+ return this;
+ }
+
+ /**
* Build the {@link AdvertiseSettings} object.
*/
public AdvertiseSettings build() {
- return new AdvertiseSettings(mMode, mTxPowerLevel, mConnectable, mTimeoutMillis);
+ return new AdvertiseSettings(mMode, mTxPowerLevel, mConnectable, mTimeoutMillis,
+ mOwnAddressType);
}
}
}
diff --git a/core/java/android/bluetooth/le/AdvertisingSetParameters.java b/core/java/android/bluetooth/le/AdvertisingSetParameters.java
index e39b198..5c8fae6 100644
--- a/core/java/android/bluetooth/le/AdvertisingSetParameters.java
+++ b/core/java/android/bluetooth/le/AdvertisingSetParameters.java
@@ -16,11 +16,17 @@
package android.bluetooth.le;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.Parcel;
import android.os.Parcelable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* The {@link AdvertisingSetParameters} provide a way to adjust advertising
* preferences for each
@@ -97,6 +103,39 @@
*/
private static final int LIMITED_ADVERTISING_MAX_MILLIS = 180 * 1000;
+ /** @hide */
+ @IntDef(prefix = "ADDRESS_TYPE_", value = {
+ ADDRESS_TYPE_DEFAULT,
+ ADDRESS_TYPE_PUBLIC,
+ ADDRESS_TYPE_RANDOM
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AddressTypeStatus {}
+
+ /**
+ * Advertise own address type that corresponds privacy settings of the device.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final int ADDRESS_TYPE_DEFAULT = -1;
+
+ /**
+ * Advertise own public address type.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final int ADDRESS_TYPE_PUBLIC = 0;
+
+ /**
+ * Generate and adverise own resolvable private address.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final int ADDRESS_TYPE_RANDOM = 1;
+
private final boolean mIsLegacy;
private final boolean mIsAnonymous;
private final boolean mIncludeTxPower;
@@ -106,11 +145,12 @@
private final boolean mScannable;
private final int mInterval;
private final int mTxPowerLevel;
+ private final int mOwnAddressType;
private AdvertisingSetParameters(boolean connectable, boolean scannable, boolean isLegacy,
boolean isAnonymous, boolean includeTxPower,
int primaryPhy, int secondaryPhy,
- int interval, int txPowerLevel) {
+ int interval, int txPowerLevel, @AddressTypeStatus int ownAddressType) {
mConnectable = connectable;
mScannable = scannable;
mIsLegacy = isLegacy;
@@ -120,6 +160,7 @@
mSecondaryPhy = secondaryPhy;
mInterval = interval;
mTxPowerLevel = txPowerLevel;
+ mOwnAddressType = ownAddressType;
}
private AdvertisingSetParameters(Parcel in) {
@@ -132,6 +173,7 @@
mSecondaryPhy = in.readInt();
mInterval = in.readInt();
mTxPowerLevel = in.readInt();
+ mOwnAddressType = in.readInt();
}
/**
@@ -197,6 +239,16 @@
return mTxPowerLevel;
}
+ /**
+ * @return the own address type for advertising
+ *
+ * @hide
+ */
+ @SystemApi
+ public @AddressTypeStatus int getOwnAddressType() {
+ return mOwnAddressType;
+ }
+
@Override
public String toString() {
return "AdvertisingSetParameters [connectable=" + mConnectable
@@ -206,7 +258,8 @@
+ ", primaryPhy=" + mPrimaryPhy
+ ", secondaryPhy=" + mSecondaryPhy
+ ", interval=" + mInterval
- + ", txPowerLevel=" + mTxPowerLevel + "]";
+ + ", txPowerLevel=" + mTxPowerLevel
+ + ", ownAddressType=" + mOwnAddressType + "]";
}
@Override
@@ -225,6 +278,7 @@
dest.writeInt(mSecondaryPhy);
dest.writeInt(mInterval);
dest.writeInt(mTxPowerLevel);
+ dest.writeInt(mOwnAddressType);
}
public static final @android.annotation.NonNull Parcelable.Creator<AdvertisingSetParameters> CREATOR =
@@ -253,6 +307,7 @@
private int mSecondaryPhy = BluetoothDevice.PHY_LE_1M;
private int mInterval = INTERVAL_LOW;
private int mTxPowerLevel = TX_POWER_MEDIUM;
+ private int mOwnAddressType = ADDRESS_TYPE_DEFAULT;
/**
* Set whether the advertisement type should be connectable or
@@ -399,6 +454,26 @@
}
/**
+ * Set own address type for advertising to control public or privacy mode. If used to set
+ * address type anything other than {@link AdvertisingSetParameters#ADDRESS_TYPE_DEFAULT},
+ * then it will require BLUETOOTH_PRIVILEGED permission and will be checked at the
+ * time of starting advertising.
+ *
+ * @throws IllegalArgumentException If the {@code ownAddressType} is invalid
+ *
+ * @hide
+ */
+ @SystemApi
+ public @NonNull Builder setOwnAddressType(@AddressTypeStatus int ownAddressType) {
+ if (ownAddressType < AdvertisingSetParameters.ADDRESS_TYPE_DEFAULT
+ || ownAddressType > AdvertisingSetParameters.ADDRESS_TYPE_RANDOM) {
+ throw new IllegalArgumentException("unknown address type " + ownAddressType);
+ }
+ mOwnAddressType = ownAddressType;
+ return this;
+ }
+
+ /**
* Build the {@link AdvertisingSetParameters} object.
*
* @throws IllegalStateException if invalid combination of parameters is used.
@@ -431,7 +506,8 @@
}
return new AdvertisingSetParameters(mConnectable, mScannable, mIsLegacy, mIsAnonymous,
- mIncludeTxPower, mPrimaryPhy, mSecondaryPhy, mInterval, mTxPowerLevel);
+ mIncludeTxPower, mPrimaryPhy, mSecondaryPhy, mInterval, mTxPowerLevel,
+ mOwnAddressType);
}
}
}
diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
index b9f8a57..879dcee 100644
--- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
+++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
@@ -138,6 +138,7 @@
parameters.setLegacyMode(true);
parameters.setConnectable(isConnectable);
parameters.setScannable(true); // legacy advertisements we support are always scannable
+ parameters.setOwnAddressType(settings.getOwnAddressType());
if (settings.getMode() == AdvertiseSettings.ADVERTISE_MODE_LOW_POWER) {
parameters.setInterval(1600); // 1s
} else if (settings.getMode() == AdvertiseSettings.ADVERTISE_MODE_BALANCED) {
diff --git a/core/java/android/companion/AssociationInfo.java b/core/java/android/companion/AssociationInfo.java
index 78d5137..f0566b8 100644
--- a/core/java/android/companion/AssociationInfo.java
+++ b/core/java/android/companion/AssociationInfo.java
@@ -36,6 +36,10 @@
*/
public final class AssociationInfo implements Parcelable {
/**
+ * A String indicates the selfManaged device is not connected.
+ */
+ private static final String LAST_TIME_CONNECTED_NONE = "None";
+ /**
* A unique ID of this Association record.
* Disclosed to the clients (ie. companion applications) for referring to this record (eg. in
* {@code disassociate()} API call).
@@ -52,6 +56,11 @@
private final boolean mSelfManaged;
private boolean mNotifyOnDeviceNearby;
private final long mTimeApprovedMs;
+ /**
+ * A long value indicates the last time connected reported by selfManaged devices
+ * Default value is Long.MAX_VALUE.
+ */
+ private long mLastTimeConnectedMs;
/**
* Creates a new Association.
@@ -62,7 +71,7 @@
public AssociationInfo(int id, @UserIdInt int userId, @NonNull String packageName,
@Nullable MacAddress macAddress, @Nullable CharSequence displayName,
@Nullable String deviceProfile, boolean selfManaged, boolean notifyOnDeviceNearby,
- long timeApprovedMs) {
+ long timeApprovedMs, long lastTimeConnectedMs) {
if (id <= 0) {
throw new IllegalArgumentException("Association ID should be greater than 0");
}
@@ -83,6 +92,7 @@
mSelfManaged = selfManaged;
mNotifyOnDeviceNearby = notifyOnDeviceNearby;
mTimeApprovedMs = timeApprovedMs;
+ mLastTimeConnectedMs = lastTimeConnectedMs;
}
/**
@@ -151,13 +161,21 @@
}
/**
- * Should only be used by the CdmService.
+ * Should only be used by the CompanionDeviceManagerService.
* @hide
*/
public void setNotifyOnDeviceNearby(boolean notifyOnDeviceNearby) {
mNotifyOnDeviceNearby = notifyOnDeviceNearby;
}
+ /**
+ * Should only be used by the CompanionDeviceManagerService.
+ * @hide
+ */
+ public void setLastTimeConnected(long lastTimeConnectedMs) {
+ mLastTimeConnectedMs = lastTimeConnectedMs;
+ }
+
/** @hide */
public boolean isNotifyOnDeviceNearby() {
return mNotifyOnDeviceNearby;
@@ -174,6 +192,14 @@
}
/**
+ * @return the last time self reported disconnected for selfManaged only.
+ * @hide
+ */
+ public Long getLastTimeConnectedMs() {
+ return mLastTimeConnectedMs;
+ }
+
+ /**
* Utility method for checking if the association represents a device with the given MAC
* address.
*
@@ -223,6 +249,9 @@
+ ", mSelfManaged=" + mSelfManaged
+ ", mNotifyOnDeviceNearby=" + mNotifyOnDeviceNearby
+ ", mTimeApprovedMs=" + new Date(mTimeApprovedMs)
+ + ", mLastTimeConnectedMs=" + (
+ mLastTimeConnectedMs == Long.MAX_VALUE
+ ? LAST_TIME_CONNECTED_NONE : new Date(mLastTimeConnectedMs))
+ '}';
}
@@ -236,6 +265,7 @@
&& mSelfManaged == that.mSelfManaged
&& mNotifyOnDeviceNearby == that.mNotifyOnDeviceNearby
&& mTimeApprovedMs == that.mTimeApprovedMs
+ && mLastTimeConnectedMs == that.mLastTimeConnectedMs
&& Objects.equals(mPackageName, that.mPackageName)
&& Objects.equals(mDeviceMacAddress, that.mDeviceMacAddress)
&& Objects.equals(mDisplayName, that.mDisplayName)
@@ -245,7 +275,8 @@
@Override
public int hashCode() {
return Objects.hash(mId, mUserId, mPackageName, mDeviceMacAddress, mDisplayName,
- mDeviceProfile, mSelfManaged, mNotifyOnDeviceNearby, mTimeApprovedMs);
+ mDeviceProfile, mSelfManaged, mNotifyOnDeviceNearby, mTimeApprovedMs,
+ mLastTimeConnectedMs);
}
@Override
@@ -267,6 +298,7 @@
dest.writeBoolean(mSelfManaged);
dest.writeBoolean(mNotifyOnDeviceNearby);
dest.writeLong(mTimeApprovedMs);
+ dest.writeLong(mLastTimeConnectedMs);
}
private AssociationInfo(@NonNull Parcel in) {
@@ -282,6 +314,7 @@
mSelfManaged = in.readBoolean();
mNotifyOnDeviceNearby = in.readBoolean();
mTimeApprovedMs = in.readLong();
+ mLastTimeConnectedMs = in.readLong();
}
@NonNull
diff --git a/core/java/android/companion/CompanionDeviceService.java b/core/java/android/companion/CompanionDeviceService.java
index 3237f7c..12ced96 100644
--- a/core/java/android/companion/CompanionDeviceService.java
+++ b/core/java/android/companion/CompanionDeviceService.java
@@ -28,9 +28,6 @@
import android.os.IBinder;
import android.util.Log;
-
-import com.android.internal.util.function.pooled.PooledLambda;
-
import java.util.Objects;
/**
@@ -185,31 +182,24 @@
public void onBindCompanionDeviceService(@NonNull Intent intent) {
}
- class Stub extends ICompanionDeviceService.Stub {
+ private class Stub extends ICompanionDeviceService.Stub {
+ final Handler mMainHandler = Handler.getMain();
+ final CompanionDeviceService mService = CompanionDeviceService.this;
@Override
public void onDeviceAppeared(AssociationInfo associationInfo) {
- Handler.getMain().post(
- () -> CompanionDeviceService.this.onDeviceAppeared(associationInfo));
+ mMainHandler.postAtFrontOfQueue(() -> mService.onDeviceAppeared(associationInfo));
}
@Override
public void onDeviceDisappeared(AssociationInfo associationInfo) {
- Handler.getMain().post(
- () -> CompanionDeviceService.this.onDeviceDisappeared(associationInfo));
+ mMainHandler.postAtFrontOfQueue(() -> mService.onDeviceDisappeared(associationInfo));
}
+ @Override
public void onDispatchMessage(int messageId, int associationId, @NonNull byte[] message) {
- Handler.getMain().sendMessage(PooledLambda.obtainMessage(
- CompanionDeviceService::onDispatchMessage,
- CompanionDeviceService.this, messageId, associationId, message));
- }
-
- public final void dispatchMessage(int messageId, int associationId,
- @NonNull byte[] message) {
- Handler.getMain().sendMessage(PooledLambda.obtainMessage(
- CompanionDeviceService::dispatchMessage,
- CompanionDeviceService.this, messageId, associationId, message));
+ mMainHandler.postAtFrontOfQueue(
+ () -> mService.onDispatchMessage(messageId, associationId, message));
}
}
}
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 01d231c..7b9d37e 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -2670,6 +2670,9 @@
* {@link ContentObserver#onChange(boolean, Collection, int, UserHandle)} should be
* overwritten to get the corresponding {@link UserHandle} for that notification.
*
+ * <p> If you don't hold the {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL}
+ * permission, you can register the {@link ContentObserver} only for current user.
+ *
* @param uri The URI to watch for changes. This can be a specific row URI,
* or a base URI for a whole class of content.
* @param notifyForDescendants When false, the observer will be notified
diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java
index 32827ae..b3435b1 100644
--- a/core/java/android/content/IntentFilter.java
+++ b/core/java/android/content/IntentFilter.java
@@ -1182,7 +1182,7 @@
public int match(Uri data, boolean wildcardSupported) {
String host = data.getHost();
if (host == null) {
- if (wildcardSupported && mWild) {
+ if (wildcardSupported && mWild && mHost.isEmpty()) {
// special case, if no host is provided, but the Authority is wildcard, match
return MATCH_CATEGORY_HOST;
} else {
diff --git a/core/java/android/content/RestrictionEntry.java b/core/java/android/content/RestrictionEntry.java
index 63fcb49..8fd41f2 100644
--- a/core/java/android/content/RestrictionEntry.java
+++ b/core/java/android/content/RestrictionEntry.java
@@ -505,7 +505,7 @@
mChoiceValues = in.readStringArray();
mCurrentValue = in.readString();
mCurrentValues = in.readStringArray();
- Parcelable[] parcelables = in.readParcelableArray(null);
+ Parcelable[] parcelables = in.readParcelableArray(null, RestrictionEntry.class);
if (parcelables != null) {
mRestrictions = new RestrictionEntry[parcelables.length];
for (int i = 0; i < parcelables.length; i++) {
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 819cbb0..a6d846b 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -4064,6 +4064,15 @@
@TestApi
public static final String FEATURE_COMMUNAL_MODE = "android.software.communal_mode";
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device
+ * supports dream overlay feature, which is an informational layer shown on top of dreams.
+ *
+ * @hide
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_DREAM_OVERLAY = "android.software.dream_overlay";
+
/** @hide */
public static final boolean APP_ENUMERATION_ENABLED_BY_DEFAULT = true;
@@ -4221,6 +4230,17 @@
"android.content.pm.action.REQUEST_PERMISSIONS";
/**
+ * The action used to request that the user approve a permission request
+ * from the application. Sent from an application other than the one whose permissions
+ * will be granted. Can only be used by the system server.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String ACTION_REQUEST_PERMISSIONS_FOR_OTHER =
+ "android.content.pm.action.REQUEST_PERMISSIONS_FOR_OTHER";
+
+ /**
* The names of the requested permissions.
* <p>
* <strong>Type:</strong> String[]
@@ -4328,8 +4348,9 @@
public static final int FLAG_PERMISSION_GRANTED_BY_DEFAULT = 1 << 5;
/**
- * Permission flag: The permission has to be reviewed before any of
- * the app components can run.
+ * Permission flag: If app targetSDK < M, then the permission has to be reviewed before any of
+ * the app components can run. If app targetSDK >= M, then the system might need to show a
+ * request dialog for this permission on behalf of an app.
*
* @hide
*/
diff --git a/core/java/android/content/pm/SharedLibraryInfo.java b/core/java/android/content/pm/SharedLibraryInfo.java
index 3443c75..43a4b17 100644
--- a/core/java/android/content/pm/SharedLibraryInfo.java
+++ b/core/java/android/content/pm/SharedLibraryInfo.java
@@ -34,9 +34,10 @@
/**
* This class provides information for a shared library. There are
- * three types of shared libraries: builtin - non-updatable part of
+ * four types of shared libraries: builtin - non-updatable part of
* the OS; dynamic - updatable backwards-compatible dynamically linked;
- * static - non backwards-compatible emulating static linking.
+ * static - non backwards-compatible emulating static linking;
+ * SDK - updatable backwards-incompatible dynamically loaded.
*/
public final class SharedLibraryInfo implements Parcelable {
@@ -45,6 +46,7 @@
TYPE_BUILTIN,
TYPE_DYNAMIC,
TYPE_STATIC,
+ TYPE_SDK,
})
@Retention(RetentionPolicy.SOURCE)
@interface Type{}
diff --git a/core/java/android/content/pm/TEST_MAPPING b/core/java/android/content/pm/TEST_MAPPING
index 77b8be3..d04c97c 100644
--- a/core/java/android/content/pm/TEST_MAPPING
+++ b/core/java/android/content/pm/TEST_MAPPING
@@ -37,6 +37,9 @@
"name": "CarrierAppIntegrationTestCases"
},
{
+ "name": "ApkVerityTest"
+ },
+ {
"name": "CtsIncrementalInstallHostTestCases",
"options": [
{
@@ -135,6 +138,9 @@
"include-filter": "android.appsecurity.cts.AppSecurityTests#testPermissionDiffCert"
}
]
+ },
+ {
+ "name": "CtsInstallHostTestCases"
}
]
}
diff --git a/core/java/android/content/pm/parsing/ParsingPackageImpl.java b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
index dbd3d5c..23cae4c 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageImpl.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageImpl.java
@@ -1152,7 +1152,7 @@
*/
@Nullable
private ArrayMap<String, String> buildAppClassNamesByProcess() {
- if (processes == null) {
+ if (ArrayUtils.size(processes) == 0) {
return null;
}
final ArrayMap<String, String> ret = new ArrayMap<>(4);
diff --git a/core/java/android/content/res/TEST_MAPPING b/core/java/android/content/res/TEST_MAPPING
index 535afd36..3703f2e 100644
--- a/core/java/android/content/res/TEST_MAPPING
+++ b/core/java/android/content/res/TEST_MAPPING
@@ -1,4 +1,12 @@
{
+ "imports": [
+ {
+ "path": "frameworks/base/core/tests/coretests/src/android/content/res"
+ },
+ {
+ "path": "frameworks/base/core/tests/coretests/src/com/android/internal/content/res"
+ }
+ ],
"presubmit": [
{
"name": "CtsResourcesLoaderTests"
diff --git a/core/java/android/debug/AdbManager.java b/core/java/android/debug/AdbManager.java
index 7714dd8..243f801 100644
--- a/core/java/android/debug/AdbManager.java
+++ b/core/java/android/debug/AdbManager.java
@@ -38,6 +38,7 @@
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
public static final String WIRELESS_DEBUG_STATE_CHANGED_ACTION =
"com.android.server.adb.WIRELESS_DEBUG_STATUS";
@@ -46,6 +47,7 @@
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
public static final String WIRELESS_DEBUG_PAIRED_DEVICES_ACTION =
"com.android.server.adb.WIRELESS_DEBUG_PAIRED_DEVICES";
@@ -59,6 +61,7 @@
*
* @hide
*/
+ @RequiresPermission(android.Manifest.permission.MANAGE_DEBUGGING)
public static final String WIRELESS_DEBUG_PAIRING_RESULT_ACTION =
"com.android.server.adb.WIRELESS_DEBUG_PAIRING_RESULT";
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 86ae3a3..5df64e3 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -599,7 +599,8 @@
synchronized (mSurfacesLock) {
mSurfaceSet.clear();
- Parcelable[] parcelableArray = in.readParcelableArray(Surface.class.getClassLoader());
+ Parcelable[] parcelableArray = in.readParcelableArray(Surface.class.getClassLoader(),
+ Surface.class);
if (parcelableArray != null) {
for (Parcelable p : parcelableArray) {
Surface s = (Surface) p;
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 0037464..de5c9ad 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -1206,6 +1206,17 @@
}
/**
+ * Returns whether the specified display supports DISPLAY_DECORATION.
+ *
+ * @param displayId The display to query support.
+ *
+ * @hide
+ */
+ public boolean getDisplayDecorationSupport(int displayId) {
+ return mGlobal.getDisplayDecorationSupport(displayId);
+ }
+
+ /**
* Returns the user preference for "Match content frame rate".
* <p>
* Never: Even if the app requests it, the device will never try to match its output to the
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 616c42a..bf6e665 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -812,6 +812,21 @@
}
/**
+ * Report whether the display supports DISPLAY_DECORATION.
+ *
+ * @param displayId The display whose support is being queried.
+ *
+ * @hide
+ */
+ public boolean getDisplayDecorationSupport(int displayId) {
+ try {
+ return mDm.getDisplayDecorationSupport(displayId);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Gets the brightness of the display.
*
* @param displayId The display from which to get the brightness
diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl
index 82b31d4..d38d388 100644
--- a/core/java/android/hardware/display/IDisplayManager.aidl
+++ b/core/java/android/hardware/display/IDisplayManager.aidl
@@ -180,4 +180,7 @@
// Returns the refresh rate switching type.
int getRefreshRateSwitchingType();
+
+ // Query for DISPLAY_DECORATION support.
+ boolean getDisplayDecorationSupport(int displayId);
}
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index 6ea2ac4..4cc001a 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -436,7 +436,8 @@
mNumAudioSources = in.readInt();
mIsInitializationRequired = in.readInt() == 1;
mIsCaptureSupported = in.readInt() == 1;
- Parcelable[] tmp = in.readParcelableArray(BandDescriptor.class.getClassLoader());
+ Parcelable[] tmp = in.readParcelableArray(BandDescriptor.class.getClassLoader(),
+ BandDescriptor.class);
mBands = new BandDescriptor[tmp.length];
for (int i = 0; i < tmp.length; i++) {
mBands[i] = (BandDescriptor) tmp[i];
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index afaa085..93573d1 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -523,6 +523,7 @@
private Handler mHandler;
private boolean mImeSurfaceScheduledForRemoval;
private ImsConfigurationTracker mConfigTracker = new ImsConfigurationTracker();
+ private boolean mDestroyed;
/**
* An opaque {@link Binder} token of window requesting {@link InputMethodImpl#showSoftInput}
@@ -599,6 +600,11 @@
@Override
public final void initializeInternal(@NonNull IBinder token,
IInputMethodPrivilegedOperations privilegedOperations, int configChanges) {
+ if (mDestroyed) {
+ Log.i(TAG, "The InputMethodService has already onDestroyed()."
+ + "Ignore the initialization.");
+ return;
+ }
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.initializeInternal");
mConfigTracker.onInitialize(configChanges);
mPrivOps.set(privilegedOperations);
@@ -1435,6 +1441,7 @@
}
@Override public void onDestroy() {
+ mDestroyed = true;
super.onDestroy();
mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(
mInsetsComputer);
@@ -1811,15 +1818,19 @@
void updateExtractFrameVisibility() {
final int vis;
+ updateCandidatesVisibility(mCandidatesVisibility == View.VISIBLE);
+
if (isFullscreenMode()) {
vis = mExtractViewHidden ? View.INVISIBLE : View.VISIBLE;
// "vis" should be applied for the extract frame as well in the fullscreen mode.
mExtractFrame.setVisibility(vis);
} else {
- vis = View.VISIBLE;
+ // mFullscreenArea visibility will according the candidate frame visibility once the
+ // extract frame is gone.
+ vis = mCandidatesVisibility;
mExtractFrame.setVisibility(View.GONE);
}
- updateCandidatesVisibility(mCandidatesVisibility == View.VISIBLE);
+
if (mDecorViewWasVisible && mFullscreenArea.getVisibility() != vis) {
int animRes = mThemeAttrs.getResourceId(vis == View.VISIBLE
? com.android.internal.R.styleable.InputMethodService_imeExtractEnterAnimation
diff --git a/core/java/android/net/Ikev2VpnProfile.java b/core/java/android/net/Ikev2VpnProfile.java
index fab692c..5554137 100644
--- a/core/java/android/net/Ikev2VpnProfile.java
+++ b/core/java/android/net/Ikev2VpnProfile.java
@@ -35,6 +35,7 @@
import android.annotation.RequiresFeature;
import android.content.pm.PackageManager;
import android.security.Credentials;
+import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.net.VpnProfile;
@@ -70,6 +71,7 @@
* Exchange, Version 2 (IKEv2)</a>
*/
public final class Ikev2VpnProfile extends PlatformVpnProfile {
+ private static final String TAG = Ikev2VpnProfile.class.getSimpleName();
/** Prefix for when a Private Key is an alias to look for in KeyStore @hide */
public static final String PREFIX_KEYSTORE_ALIAS = "KEYSTORE_ALIAS:";
/** Prefix for when a Private Key is stored directly in the profile @hide */
@@ -163,6 +165,10 @@
// UnmodifiableList doesn't make a defensive copy by default.
mAllowedAlgorithms = Collections.unmodifiableList(new ArrayList<>(allowedAlgorithms));
+ if (excludeLocalRoutes && !isBypassable) {
+ throw new IllegalArgumentException(
+ "Vpn should be byassable if excludeLocalRoutes is set");
+ }
mIsBypassable = isBypassable;
mIsMetered = isMetered;
@@ -520,7 +526,10 @@
throw new IllegalArgumentException("Invalid auth method set");
}
- builder.setExcludeLocalRoutes(profile.excludeLocalRoutes);
+ if (profile.excludeLocalRoutes && !profile.isBypassable) {
+ Log.w(TAG, "ExcludeLocalRoutes should only be set in the bypassable VPN");
+ }
+ builder.setExcludeLocalRoutes(profile.excludeLocalRoutes && profile.isBypassable);
return builder.build();
}
@@ -907,9 +916,23 @@
}
/**
- * Sets whether the local traffic is exempted from the VPN.
+ * Sets whether the local traffic is exempted from the VPN.
*
- * @hide TODO(184750836): unhide once the implementation is completed
+ * When this is set, the system will not use the VPN network when an app
+ * tries to send traffic for an IP address that is on a local network.
+ *
+ * Note that there are important security implications. In particular, the
+ * networks that the device connects to typically decides what IP addresses
+ * are part of the local network. This means that for VPNs setting this
+ * flag, it is possible for anybody to set up a public network in such a
+ * way that traffic to arbitrary IP addresses will bypass the VPN, including
+ * traffic to services like DNS. When using this API, please consider the
+ * security implications for your particular case.
+ *
+ * Note that because the local traffic will always bypass the VPN,
+ * it is not possible to set this flag on a non-bypassable VPN.
+ *
+ * @hide TODO(184750836): unhide once the implementation is completed
*/
@NonNull
@RequiresFeature(PackageManager.FEATURE_IPSEC_TUNNELS)
diff --git a/core/java/android/net/vcn/VcnCellUnderlyingNetworkPriority.java b/core/java/android/net/vcn/VcnCellUnderlyingNetworkPriority.java
deleted file mode 100644
index b3f7345..0000000
--- a/core/java/android/net/vcn/VcnCellUnderlyingNetworkPriority.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * 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.
- */
-package android.net.vcn;
-
-import static com.android.internal.annotations.VisibleForTesting.Visibility;
-import static com.android.server.vcn.util.PersistableBundleUtils.INTEGER_DESERIALIZER;
-import static com.android.server.vcn.util.PersistableBundleUtils.INTEGER_SERIALIZER;
-import static com.android.server.vcn.util.PersistableBundleUtils.STRING_DESERIALIZER;
-import static com.android.server.vcn.util.PersistableBundleUtils.STRING_SERIALIZER;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.PersistableBundle;
-import android.telephony.SubscriptionInfo;
-import android.telephony.TelephonyManager;
-import android.util.ArraySet;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.server.vcn.util.PersistableBundleUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Objects;
-import java.util.Set;
-
-// TODO: Add documents
-/** @hide */
-public final class VcnCellUnderlyingNetworkPriority extends VcnUnderlyingNetworkPriority {
- private static final String ALLOWED_NETWORK_PLMN_IDS_KEY = "mAllowedNetworkPlmnIds";
- @NonNull private final Set<String> mAllowedNetworkPlmnIds;
- private static final String ALLOWED_SPECIFIC_CARRIER_IDS_KEY = "mAllowedSpecificCarrierIds";
- @NonNull private final Set<Integer> mAllowedSpecificCarrierIds;
-
- private static final String ALLOW_ROAMING_KEY = "mAllowRoaming";
- private final boolean mAllowRoaming;
-
- private static final String REQUIRE_OPPORTUNISTIC_KEY = "mRequireOpportunistic";
- private final boolean mRequireOpportunistic;
-
- private VcnCellUnderlyingNetworkPriority(
- int networkQuality,
- boolean allowMetered,
- Set<String> allowedNetworkPlmnIds,
- Set<Integer> allowedSpecificCarrierIds,
- boolean allowRoaming,
- boolean requireOpportunistic) {
- super(NETWORK_PRIORITY_TYPE_CELL, networkQuality, allowMetered);
- mAllowedNetworkPlmnIds = new ArraySet<>(allowedNetworkPlmnIds);
- mAllowedSpecificCarrierIds = new ArraySet<>(allowedSpecificCarrierIds);
- mAllowRoaming = allowRoaming;
- mRequireOpportunistic = requireOpportunistic;
-
- validate();
- }
-
- /** @hide */
- @Override
- protected void validate() {
- super.validate();
- validatePlmnIds(mAllowedNetworkPlmnIds);
- Objects.requireNonNull(mAllowedSpecificCarrierIds, "allowedCarrierIds is null");
- }
-
- private static void validatePlmnIds(Set<String> allowedNetworkPlmnIds) {
- Objects.requireNonNull(allowedNetworkPlmnIds, "allowedNetworkPlmnIds is null");
-
- // A valid PLMN is a concatenation of MNC and MCC, and thus consists of 5 or 6 decimal
- // digits.
- for (String id : allowedNetworkPlmnIds) {
- if ((id.length() == 5 || id.length() == 6) && id.matches("[0-9]+")) {
- continue;
- } else {
- throw new IllegalArgumentException("Found invalid PLMN ID: " + id);
- }
- }
- }
-
- /** @hide */
- @NonNull
- @VisibleForTesting(visibility = Visibility.PROTECTED)
- public static VcnCellUnderlyingNetworkPriority fromPersistableBundle(
- @NonNull PersistableBundle in) {
- Objects.requireNonNull(in, "PersistableBundle is null");
-
- final int networkQuality = in.getInt(NETWORK_QUALITY_KEY);
- final boolean allowMetered = in.getBoolean(ALLOW_METERED_KEY);
-
- final PersistableBundle plmnIdsBundle =
- in.getPersistableBundle(ALLOWED_NETWORK_PLMN_IDS_KEY);
- Objects.requireNonNull(plmnIdsBundle, "plmnIdsBundle is null");
- final Set<String> allowedNetworkPlmnIds =
- new ArraySet<String>(
- PersistableBundleUtils.toList(plmnIdsBundle, STRING_DESERIALIZER));
-
- final PersistableBundle specificCarrierIdsBundle =
- in.getPersistableBundle(ALLOWED_SPECIFIC_CARRIER_IDS_KEY);
- Objects.requireNonNull(specificCarrierIdsBundle, "specificCarrierIdsBundle is null");
- final Set<Integer> allowedSpecificCarrierIds =
- new ArraySet<Integer>(
- PersistableBundleUtils.toList(
- specificCarrierIdsBundle, INTEGER_DESERIALIZER));
-
- final boolean allowRoaming = in.getBoolean(ALLOW_ROAMING_KEY);
- final boolean requireOpportunistic = in.getBoolean(REQUIRE_OPPORTUNISTIC_KEY);
-
- return new VcnCellUnderlyingNetworkPriority(
- networkQuality,
- allowMetered,
- allowedNetworkPlmnIds,
- allowedSpecificCarrierIds,
- allowRoaming,
- requireOpportunistic);
- }
-
- /** @hide */
- @Override
- @NonNull
- @VisibleForTesting(visibility = Visibility.PROTECTED)
- public PersistableBundle toPersistableBundle() {
- final PersistableBundle result = super.toPersistableBundle();
-
- final PersistableBundle plmnIdsBundle =
- PersistableBundleUtils.fromList(
- new ArrayList<>(mAllowedNetworkPlmnIds), STRING_SERIALIZER);
- result.putPersistableBundle(ALLOWED_NETWORK_PLMN_IDS_KEY, plmnIdsBundle);
-
- final PersistableBundle specificCarrierIdsBundle =
- PersistableBundleUtils.fromList(
- new ArrayList<>(mAllowedSpecificCarrierIds), INTEGER_SERIALIZER);
- result.putPersistableBundle(ALLOWED_SPECIFIC_CARRIER_IDS_KEY, specificCarrierIdsBundle);
-
- result.putBoolean(ALLOW_ROAMING_KEY, mAllowRoaming);
- result.putBoolean(REQUIRE_OPPORTUNISTIC_KEY, mRequireOpportunistic);
-
- return result;
- }
-
- /** Retrieve the allowed PLMN IDs, or an empty set if any PLMN ID is acceptable. */
- @NonNull
- public Set<String> getAllowedOperatorPlmnIds() {
- return Collections.unmodifiableSet(mAllowedNetworkPlmnIds);
- }
-
- /**
- * Retrieve the allowed specific carrier IDs, or an empty set if any specific carrier ID is
- * acceptable.
- */
- @NonNull
- public Set<Integer> getAllowedSpecificCarrierIds() {
- return Collections.unmodifiableSet(mAllowedSpecificCarrierIds);
- }
-
- /** Return if roaming is allowed. */
- public boolean allowRoaming() {
- return mAllowRoaming;
- }
-
- /** Return if requiring an opportunistic network. */
- public boolean requireOpportunistic() {
- return mRequireOpportunistic;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(
- super.hashCode(),
- mAllowedNetworkPlmnIds,
- mAllowedSpecificCarrierIds,
- mAllowRoaming,
- mRequireOpportunistic);
- }
-
- @Override
- public boolean equals(@Nullable Object other) {
- if (!super.equals(other)) {
- return false;
- }
-
- if (!(other instanceof VcnCellUnderlyingNetworkPriority)) {
- return false;
- }
-
- final VcnCellUnderlyingNetworkPriority rhs = (VcnCellUnderlyingNetworkPriority) other;
- return Objects.equals(mAllowedNetworkPlmnIds, rhs.mAllowedNetworkPlmnIds)
- && Objects.equals(mAllowedSpecificCarrierIds, rhs.mAllowedSpecificCarrierIds)
- && mAllowRoaming == rhs.mAllowRoaming
- && mRequireOpportunistic == rhs.mRequireOpportunistic;
- }
-
- /** @hide */
- @Override
- void dumpTransportSpecificFields(IndentingPrintWriter pw) {
- pw.println("mAllowedNetworkPlmnIds: " + mAllowedNetworkPlmnIds.toString());
- pw.println("mAllowedSpecificCarrierIds: " + mAllowedSpecificCarrierIds.toString());
- pw.println("mAllowRoaming: " + mAllowRoaming);
- pw.println("mRequireOpportunistic: " + mRequireOpportunistic);
- }
-
- /** This class is used to incrementally build WifiNetworkPriority objects. */
- public static final class Builder extends VcnUnderlyingNetworkPriority.Builder<Builder> {
- @NonNull private final Set<String> mAllowedNetworkPlmnIds = new ArraySet<>();
- @NonNull private final Set<Integer> mAllowedSpecificCarrierIds = new ArraySet<>();
-
- private boolean mAllowRoaming = false;
- private boolean mRequireOpportunistic = false;
-
- /** Construct a Builder object. */
- public Builder() {}
-
- /**
- * Set allowed operator PLMN IDs.
- *
- * <p>This is used to distinguish cases where roaming agreements may dictate a different
- * priority from a partner's networks.
- *
- * @param allowedNetworkPlmnIds the allowed operator PLMN IDs in String. Defaults to an
- * empty set, allowing ANY PLMN ID. A valid PLMN is a concatenation of MNC and MCC, and
- * thus consists of 5 or 6 decimal digits. See {@link SubscriptionInfo#getMccString()}
- * and {@link SubscriptionInfo#getMncString()}.
- */
- @NonNull
- public Builder setAllowedOperatorPlmnIds(@NonNull Set<String> allowedNetworkPlmnIds) {
- validatePlmnIds(allowedNetworkPlmnIds);
-
- mAllowedNetworkPlmnIds.clear();
- mAllowedNetworkPlmnIds.addAll(allowedNetworkPlmnIds);
- return this;
- }
-
- /**
- * Set allowed specific carrier IDs.
- *
- * @param allowedSpecificCarrierIds the allowed specific carrier IDs. Defaults to an empty
- * set, allowing ANY carrier ID. See {@link TelephonyManager#getSimSpecificCarrierId()}.
- */
- @NonNull
- public Builder setAllowedSpecificCarrierIds(
- @NonNull Set<Integer> allowedSpecificCarrierIds) {
- Objects.requireNonNull(allowedSpecificCarrierIds, "allowedCarrierIds is null");
- mAllowedSpecificCarrierIds.clear();
- mAllowedSpecificCarrierIds.addAll(allowedSpecificCarrierIds);
- return this;
- }
-
- /**
- * Set if roaming is allowed.
- *
- * @param allowRoaming the flag to indicate if roaming is allowed. Defaults to {@code
- * false}.
- */
- @NonNull
- public Builder setAllowRoaming(boolean allowRoaming) {
- mAllowRoaming = allowRoaming;
- return this;
- }
-
- /**
- * Set if requiring an opportunistic network.
- *
- * @param requireOpportunistic the flag to indicate if caller requires an opportunistic
- * network. Defaults to {@code false}.
- */
- @NonNull
- public Builder setRequireOpportunistic(boolean requireOpportunistic) {
- mRequireOpportunistic = requireOpportunistic;
- return this;
- }
-
- /** Build the VcnCellUnderlyingNetworkPriority. */
- @NonNull
- public VcnCellUnderlyingNetworkPriority build() {
- return new VcnCellUnderlyingNetworkPriority(
- mNetworkQuality,
- mAllowMetered,
- mAllowedNetworkPlmnIds,
- mAllowedSpecificCarrierIds,
- mAllowRoaming,
- mRequireOpportunistic);
- }
-
- /** @hide */
- @Override
- Builder self() {
- return this;
- }
- }
-}
diff --git a/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java
new file mode 100644
index 0000000..125b573
--- /dev/null
+++ b/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java
@@ -0,0 +1,384 @@
+/*
+ * 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.
+ */
+package android.net.vcn;
+
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_ANY;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.getMatchCriteriaString;
+
+import static com.android.internal.annotations.VisibleForTesting.Visibility;
+import static com.android.server.vcn.util.PersistableBundleUtils.INTEGER_DESERIALIZER;
+import static com.android.server.vcn.util.PersistableBundleUtils.INTEGER_SERIALIZER;
+import static com.android.server.vcn.util.PersistableBundleUtils.STRING_DESERIALIZER;
+import static com.android.server.vcn.util.PersistableBundleUtils.STRING_SERIALIZER;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.net.NetworkCapabilities;
+import android.net.vcn.VcnUnderlyingNetworkTemplate.MatchCriteria;
+import android.os.PersistableBundle;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.ArraySet;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.vcn.util.PersistableBundleUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * This class represents a configuration for a network template class of underlying cellular
+ * networks.
+ *
+ * <p>See {@link VcnUnderlyingNetworkTemplate}
+ */
+public final class VcnCellUnderlyingNetworkTemplate extends VcnUnderlyingNetworkTemplate {
+ private static final String ALLOWED_NETWORK_PLMN_IDS_KEY = "mAllowedNetworkPlmnIds";
+ @NonNull private final Set<String> mAllowedNetworkPlmnIds;
+ private static final String ALLOWED_SPECIFIC_CARRIER_IDS_KEY = "mAllowedSpecificCarrierIds";
+ @NonNull private final Set<Integer> mAllowedSpecificCarrierIds;
+
+ private static final String ROAMING_MATCH_KEY = "mRoamingMatchCriteria";
+ private final int mRoamingMatchCriteria;
+
+ private static final String OPPORTUNISTIC_MATCH_KEY = "mOpportunisticMatchCriteria";
+ private final int mOpportunisticMatchCriteria;
+
+ private VcnCellUnderlyingNetworkTemplate(
+ int networkQuality,
+ int meteredMatchCriteria,
+ Set<String> allowedNetworkPlmnIds,
+ Set<Integer> allowedSpecificCarrierIds,
+ int roamingMatchCriteria,
+ int opportunisticMatchCriteria) {
+ super(NETWORK_PRIORITY_TYPE_CELL, networkQuality, meteredMatchCriteria);
+ mAllowedNetworkPlmnIds = new ArraySet<>(allowedNetworkPlmnIds);
+ mAllowedSpecificCarrierIds = new ArraySet<>(allowedSpecificCarrierIds);
+ mRoamingMatchCriteria = roamingMatchCriteria;
+ mOpportunisticMatchCriteria = opportunisticMatchCriteria;
+
+ validate();
+ }
+
+ /** @hide */
+ @Override
+ protected void validate() {
+ super.validate();
+ validatePlmnIds(mAllowedNetworkPlmnIds);
+ Objects.requireNonNull(mAllowedSpecificCarrierIds, "matchingCarrierIds is null");
+ validateMatchCriteria(mRoamingMatchCriteria, "mRoamingMatchCriteria");
+ validateMatchCriteria(mOpportunisticMatchCriteria, "mOpportunisticMatchCriteria");
+ }
+
+ private static void validatePlmnIds(Set<String> matchingOperatorPlmnIds) {
+ Objects.requireNonNull(matchingOperatorPlmnIds, "matchingOperatorPlmnIds is null");
+
+ // A valid PLMN is a concatenation of MNC and MCC, and thus consists of 5 or 6 decimal
+ // digits.
+ for (String id : matchingOperatorPlmnIds) {
+ if ((id.length() == 5 || id.length() == 6) && id.matches("[0-9]+")) {
+ continue;
+ } else {
+ throw new IllegalArgumentException("Found invalid PLMN ID: " + id);
+ }
+ }
+ }
+
+ /** @hide */
+ @NonNull
+ @VisibleForTesting(visibility = Visibility.PROTECTED)
+ public static VcnCellUnderlyingNetworkTemplate fromPersistableBundle(
+ @NonNull PersistableBundle in) {
+ Objects.requireNonNull(in, "PersistableBundle is null");
+
+ final int networkQuality = in.getInt(NETWORK_QUALITY_KEY);
+ final int meteredMatchCriteria = in.getInt(METERED_MATCH_KEY);
+
+ final PersistableBundle plmnIdsBundle =
+ in.getPersistableBundle(ALLOWED_NETWORK_PLMN_IDS_KEY);
+ Objects.requireNonNull(plmnIdsBundle, "plmnIdsBundle is null");
+ final Set<String> allowedNetworkPlmnIds =
+ new ArraySet<String>(
+ PersistableBundleUtils.toList(plmnIdsBundle, STRING_DESERIALIZER));
+
+ final PersistableBundle specificCarrierIdsBundle =
+ in.getPersistableBundle(ALLOWED_SPECIFIC_CARRIER_IDS_KEY);
+ Objects.requireNonNull(specificCarrierIdsBundle, "specificCarrierIdsBundle is null");
+ final Set<Integer> allowedSpecificCarrierIds =
+ new ArraySet<Integer>(
+ PersistableBundleUtils.toList(
+ specificCarrierIdsBundle, INTEGER_DESERIALIZER));
+
+ final int roamingMatchCriteria = in.getInt(ROAMING_MATCH_KEY);
+ final int opportunisticMatchCriteria = in.getInt(OPPORTUNISTIC_MATCH_KEY);
+
+ return new VcnCellUnderlyingNetworkTemplate(
+ networkQuality,
+ meteredMatchCriteria,
+ allowedNetworkPlmnIds,
+ allowedSpecificCarrierIds,
+ roamingMatchCriteria,
+ opportunisticMatchCriteria);
+ }
+
+ /** @hide */
+ @Override
+ @NonNull
+ @VisibleForTesting(visibility = Visibility.PROTECTED)
+ public PersistableBundle toPersistableBundle() {
+ final PersistableBundle result = super.toPersistableBundle();
+
+ final PersistableBundle plmnIdsBundle =
+ PersistableBundleUtils.fromList(
+ new ArrayList<>(mAllowedNetworkPlmnIds), STRING_SERIALIZER);
+ result.putPersistableBundle(ALLOWED_NETWORK_PLMN_IDS_KEY, plmnIdsBundle);
+
+ final PersistableBundle specificCarrierIdsBundle =
+ PersistableBundleUtils.fromList(
+ new ArrayList<>(mAllowedSpecificCarrierIds), INTEGER_SERIALIZER);
+ result.putPersistableBundle(ALLOWED_SPECIFIC_CARRIER_IDS_KEY, specificCarrierIdsBundle);
+
+ result.putInt(ROAMING_MATCH_KEY, mRoamingMatchCriteria);
+ result.putInt(OPPORTUNISTIC_MATCH_KEY, mOpportunisticMatchCriteria);
+
+ return result;
+ }
+
+ /**
+ * Retrieve the matching operator PLMN IDs, or an empty set if any PLMN ID is acceptable.
+ *
+ * @see Builder#setOperatorPlmnIds(Set)
+ */
+ @NonNull
+ public Set<String> getOperatorPlmnIds() {
+ return Collections.unmodifiableSet(mAllowedNetworkPlmnIds);
+ }
+
+ /**
+ * Retrieve the matching sim specific carrier IDs, or an empty set if any sim specific carrier
+ * ID is acceptable.
+ *
+ * @see Builder#setSimSpecificCarrierIds(Set)
+ */
+ @NonNull
+ public Set<Integer> getSimSpecificCarrierIds() {
+ return Collections.unmodifiableSet(mAllowedSpecificCarrierIds);
+ }
+
+ /**
+ * Return the matching criteria for roaming networks.
+ *
+ * @see Builder#setRoaming(int)
+ */
+ @MatchCriteria
+ public int getRoaming() {
+ return mRoamingMatchCriteria;
+ }
+
+ /**
+ * Return the matching criteria for opportunistic cellular subscriptions.
+ *
+ * @see Builder#setOpportunistic(int)
+ */
+ @MatchCriteria
+ public int getOpportunistic() {
+ return mOpportunisticMatchCriteria;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(
+ super.hashCode(),
+ mAllowedNetworkPlmnIds,
+ mAllowedSpecificCarrierIds,
+ mRoamingMatchCriteria,
+ mOpportunisticMatchCriteria);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object other) {
+ if (!super.equals(other)) {
+ return false;
+ }
+
+ if (!(other instanceof VcnCellUnderlyingNetworkTemplate)) {
+ return false;
+ }
+
+ final VcnCellUnderlyingNetworkTemplate rhs = (VcnCellUnderlyingNetworkTemplate) other;
+ return Objects.equals(mAllowedNetworkPlmnIds, rhs.mAllowedNetworkPlmnIds)
+ && Objects.equals(mAllowedSpecificCarrierIds, rhs.mAllowedSpecificCarrierIds)
+ && mRoamingMatchCriteria == rhs.mRoamingMatchCriteria
+ && mOpportunisticMatchCriteria == rhs.mOpportunisticMatchCriteria;
+ }
+
+ /** @hide */
+ @Override
+ void dumpTransportSpecificFields(IndentingPrintWriter pw) {
+ pw.println("mAllowedNetworkPlmnIds: " + mAllowedNetworkPlmnIds.toString());
+ pw.println("mAllowedSpecificCarrierIds: " + mAllowedSpecificCarrierIds.toString());
+ pw.println("mRoamingMatchCriteria: " + getMatchCriteriaString(mRoamingMatchCriteria));
+ pw.println(
+ "mOpportunisticMatchCriteria: "
+ + getMatchCriteriaString(mOpportunisticMatchCriteria));
+ }
+
+ /** This class is used to incrementally build VcnCellUnderlyingNetworkTemplate objects. */
+ public static final class Builder {
+ private int mNetworkQuality = NETWORK_QUALITY_ANY;
+ private int mMeteredMatchCriteria = MATCH_ANY;
+
+ @NonNull private final Set<String> mAllowedNetworkPlmnIds = new ArraySet<>();
+ @NonNull private final Set<Integer> mAllowedSpecificCarrierIds = new ArraySet<>();
+
+ private int mRoamingMatchCriteria = MATCH_ANY;
+ private int mOpportunisticMatchCriteria = MATCH_ANY;
+
+ /** Construct a Builder object. */
+ public Builder() {}
+
+ /**
+ * Set the required network quality to match this template.
+ *
+ * <p>Network quality is a aggregation of multiple signals that reflect the network link
+ * metrics. For example, the network validation bit (see {@link
+ * NetworkCapabilities#NET_CAPABILITY_VALIDATED}), estimated first hop transport bandwidth
+ * and signal strength.
+ *
+ * @param networkQuality the required network quality. Defaults to NETWORK_QUALITY_ANY
+ * @hide
+ */
+ @NonNull
+ public Builder setNetworkQuality(@NetworkQuality int networkQuality) {
+ validateNetworkQuality(networkQuality);
+
+ mNetworkQuality = networkQuality;
+ return this;
+ }
+
+ /**
+ * Set the matching criteria for metered networks.
+ *
+ * <p>A template where setMetered(MATCH_REQUIRED) will only match metered networks (one
+ * without NET_CAPABILITY_NOT_METERED). A template where setMetered(MATCH_FORBIDDEN) will
+ * only match a network that is not metered (one with NET_CAPABILITY_NOT_METERED).
+ *
+ * @param matchCriteria the matching criteria for metered networks. Defaults to {@link
+ * #MATCH_ANY}.
+ * @see NetworkCapabilities#NET_CAPABILITY_NOT_METERED
+ */
+ // The matching getter is defined in the super class. Please see {@link
+ // VcnUnderlyingNetworkTemplate#getMetered()}
+ @SuppressLint("MissingGetterMatchingBuilder")
+ @NonNull
+ public Builder setMetered(@MatchCriteria int matchCriteria) {
+ validateMatchCriteria(matchCriteria, "setMetered");
+
+ mMeteredMatchCriteria = matchCriteria;
+ return this;
+ }
+
+ /**
+ * Set operator PLMN IDs with which a network can match this template.
+ *
+ * <p>This is used to distinguish cases where roaming agreements may dictate a different
+ * priority from a partner's networks.
+ *
+ * @param operatorPlmnIds the matching operator PLMN IDs in String. Network with one of the
+ * matching PLMN IDs can match this template. If the set is empty, any PLMN ID will
+ * match. The default is an empty set. A valid PLMN is a concatenation of MNC and MCC,
+ * and thus consists of 5 or 6 decimal digits.
+ * @see SubscriptionInfo#getMccString()
+ * @see SubscriptionInfo#getMncString()
+ */
+ @NonNull
+ public Builder setOperatorPlmnIds(@NonNull Set<String> operatorPlmnIds) {
+ validatePlmnIds(operatorPlmnIds);
+
+ mAllowedNetworkPlmnIds.clear();
+ mAllowedNetworkPlmnIds.addAll(operatorPlmnIds);
+ return this;
+ }
+
+ /**
+ * Set sim specific carrier IDs with which a network can match this template.
+ *
+ * @param simSpecificCarrierIds the matching sim specific carrier IDs. Network with one of
+ * the sim specific carrier IDs can match this template. If the set is empty, any
+ * carrier ID will match. The default is an empty set.
+ * @see TelephonyManager#getSimSpecificCarrierId()
+ */
+ @NonNull
+ public Builder setSimSpecificCarrierIds(@NonNull Set<Integer> simSpecificCarrierIds) {
+ Objects.requireNonNull(simSpecificCarrierIds, "simSpecificCarrierIds is null");
+
+ mAllowedSpecificCarrierIds.clear();
+ mAllowedSpecificCarrierIds.addAll(simSpecificCarrierIds);
+ return this;
+ }
+
+ /**
+ * Set the matching criteria for roaming networks.
+ *
+ * <p>A template where setRoaming(MATCH_REQUIRED) will only match roaming networks (one
+ * without NET_CAPABILITY_NOT_ROAMING). A template where setRoaming(MATCH_FORBIDDEN) will
+ * only match a network that is not roaming (one with NET_CAPABILITY_NOT_ROAMING).
+ *
+ * @param matchCriteria the matching criteria for roaming networks. Defaults to {@link
+ * #MATCH_ANY}.
+ * @see NetworkCapabilities#NET_CAPABILITY_NOT_ROAMING
+ */
+ @NonNull
+ public Builder setRoaming(@MatchCriteria int matchCriteria) {
+ validateMatchCriteria(matchCriteria, "setRoaming");
+
+ mRoamingMatchCriteria = matchCriteria;
+ return this;
+ }
+
+ /**
+ * Set the matching criteria for opportunistic cellular subscriptions.
+ *
+ * @param matchCriteria the matching criteria for opportunistic cellular subscriptions.
+ * Defaults to {@link #MATCH_ANY}.
+ * @see SubscriptionManager#setOpportunistic(boolean, int)
+ */
+ @NonNull
+ public Builder setOpportunistic(@MatchCriteria int matchCriteria) {
+ validateMatchCriteria(matchCriteria, "setOpportunistic");
+
+ mOpportunisticMatchCriteria = matchCriteria;
+ return this;
+ }
+
+ /** Build the VcnCellUnderlyingNetworkTemplate. */
+ @NonNull
+ public VcnCellUnderlyingNetworkTemplate build() {
+ return new VcnCellUnderlyingNetworkTemplate(
+ mNetworkQuality,
+ mMeteredMatchCriteria,
+ mAllowedNetworkPlmnIds,
+ mAllowedSpecificCarrierIds,
+ mRoamingMatchCriteria,
+ mOpportunisticMatchCriteria);
+ }
+ }
+}
diff --git a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
index 55d3ecd..92956e8 100644
--- a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
+++ b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
@@ -16,7 +16,8 @@
package android.net.vcn;
import static android.net.ipsec.ike.IkeSessionParams.IKE_OPTION_MOBIKE;
-import static android.net.vcn.VcnUnderlyingNetworkPriority.NETWORK_QUALITY_OK;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_REQUIRED;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.NETWORK_QUALITY_OK;
import static com.android.internal.annotations.VisibleForTesting.Visibility;
@@ -42,7 +43,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
@@ -162,30 +163,24 @@
/** @hide */
@VisibleForTesting(visibility = Visibility.PRIVATE)
- public static final LinkedHashSet<VcnUnderlyingNetworkPriority>
- DEFAULT_UNDERLYING_NETWORK_PRIORITIES = new LinkedHashSet<>();
+ public static final List<VcnUnderlyingNetworkTemplate> DEFAULT_UNDERLYING_NETWORK_TEMPLATES =
+ new ArrayList<>();
static {
- DEFAULT_UNDERLYING_NETWORK_PRIORITIES.add(
- new VcnCellUnderlyingNetworkPriority.Builder()
+ DEFAULT_UNDERLYING_NETWORK_TEMPLATES.add(
+ new VcnCellUnderlyingNetworkTemplate.Builder()
.setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(true /* allowMetered */)
- .setAllowRoaming(true /* allowRoaming */)
- .setRequireOpportunistic(true /* requireOpportunistic */)
+ .setOpportunistic(MATCH_REQUIRED)
.build());
- DEFAULT_UNDERLYING_NETWORK_PRIORITIES.add(
- new VcnWifiUnderlyingNetworkPriority.Builder()
+ DEFAULT_UNDERLYING_NETWORK_TEMPLATES.add(
+ new VcnWifiUnderlyingNetworkTemplate.Builder()
.setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(true /* allowMetered */)
.build());
- DEFAULT_UNDERLYING_NETWORK_PRIORITIES.add(
- new VcnCellUnderlyingNetworkPriority.Builder()
+ DEFAULT_UNDERLYING_NETWORK_TEMPLATES.add(
+ new VcnCellUnderlyingNetworkTemplate.Builder()
.setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(true /* allowMetered */)
- .setAllowRoaming(true /* allowRoaming */)
- .setRequireOpportunistic(false /* requireOpportunistic */)
.build());
}
@@ -200,9 +195,9 @@
/** @hide */
@VisibleForTesting(visibility = Visibility.PRIVATE)
- public static final String UNDERLYING_NETWORK_PRIORITIES_KEY = "mUnderlyingNetworkPriorities";
+ public static final String UNDERLYING_NETWORK_TEMPLATES_KEY = "mUnderlyingNetworkTemplates";
- @NonNull private final LinkedHashSet<VcnUnderlyingNetworkPriority> mUnderlyingNetworkPriorities;
+ @NonNull private final List<VcnUnderlyingNetworkTemplate> mUnderlyingNetworkTemplates;
private static final String MAX_MTU_KEY = "mMaxMtu";
private final int mMaxMtu;
@@ -215,7 +210,7 @@
@NonNull String gatewayConnectionName,
@NonNull IkeTunnelConnectionParams tunnelConnectionParams,
@NonNull Set<Integer> exposedCapabilities,
- @NonNull LinkedHashSet<VcnUnderlyingNetworkPriority> underlyingNetworkPriorities,
+ @NonNull List<VcnUnderlyingNetworkTemplate> underlyingNetworkTemplates,
@NonNull long[] retryIntervalsMs,
@IntRange(from = MIN_MTU_V6) int maxMtu) {
mGatewayConnectionName = gatewayConnectionName;
@@ -224,9 +219,9 @@
mRetryIntervalsMs = retryIntervalsMs;
mMaxMtu = maxMtu;
- mUnderlyingNetworkPriorities = new LinkedHashSet<>(underlyingNetworkPriorities);
- if (mUnderlyingNetworkPriorities.isEmpty()) {
- mUnderlyingNetworkPriorities.addAll(DEFAULT_UNDERLYING_NETWORK_PRIORITIES);
+ mUnderlyingNetworkTemplates = new ArrayList<>(underlyingNetworkTemplates);
+ if (mUnderlyingNetworkTemplates.isEmpty()) {
+ mUnderlyingNetworkTemplates.addAll(DEFAULT_UNDERLYING_NETWORK_TEMPLATES);
}
validate();
@@ -250,22 +245,19 @@
mExposedCapabilities = new TreeSet<>(PersistableBundleUtils.toList(
exposedCapsBundle, PersistableBundleUtils.INTEGER_DESERIALIZER));
- final PersistableBundle networkPrioritiesBundle =
- in.getPersistableBundle(UNDERLYING_NETWORK_PRIORITIES_KEY);
+ final PersistableBundle networkTemplatesBundle =
+ in.getPersistableBundle(UNDERLYING_NETWORK_TEMPLATES_KEY);
- if (networkPrioritiesBundle == null) {
- // UNDERLYING_NETWORK_PRIORITIES_KEY was added in Android T. Thus
+ if (networkTemplatesBundle == null) {
+ // UNDERLYING_NETWORK_TEMPLATES_KEY was added in Android T. Thus
// VcnGatewayConnectionConfig created on old platforms will not have this data and will
// be assigned with the default value
- mUnderlyingNetworkPriorities =
- new LinkedHashSet<>(DEFAULT_UNDERLYING_NETWORK_PRIORITIES);
-
+ mUnderlyingNetworkTemplates = new ArrayList<>(DEFAULT_UNDERLYING_NETWORK_TEMPLATES);
} else {
- mUnderlyingNetworkPriorities =
- new LinkedHashSet<>(
- PersistableBundleUtils.toList(
- networkPrioritiesBundle,
- VcnUnderlyingNetworkPriority::fromPersistableBundle));
+ mUnderlyingNetworkTemplates =
+ PersistableBundleUtils.toList(
+ networkTemplatesBundle,
+ VcnUnderlyingNetworkTemplate::fromPersistableBundle);
}
mRetryIntervalsMs = in.getLongArray(RETRY_INTERVAL_MS_KEY);
@@ -285,7 +277,7 @@
checkValidCapability(cap);
}
- Objects.requireNonNull(mUnderlyingNetworkPriorities, "underlyingNetworkPriorities is null");
+ validateNetworkTemplateList(mUnderlyingNetworkTemplates);
Objects.requireNonNull(mRetryIntervalsMs, "retryIntervalsMs was null");
validateRetryInterval(mRetryIntervalsMs);
@@ -314,6 +306,19 @@
}
}
+ private static void validateNetworkTemplateList(
+ List<VcnUnderlyingNetworkTemplate> networkPriorityRules) {
+ Objects.requireNonNull(networkPriorityRules, "networkPriorityRules is null");
+
+ Set<VcnUnderlyingNetworkTemplate> existingRules = new ArraySet<>();
+ for (VcnUnderlyingNetworkTemplate rule : networkPriorityRules) {
+ Objects.requireNonNull(rule, "Found null value VcnUnderlyingNetworkTemplate");
+ if (!existingRules.add(rule)) {
+ throw new IllegalArgumentException("Found duplicate VcnUnderlyingNetworkTemplate");
+ }
+ }
+ }
+
/**
* Returns the configured Gateway Connection name.
*
@@ -368,15 +373,13 @@
}
/**
- * Retrieve the configured VcnUnderlyingNetworkPriority list, or a default list if it is not
- * configured.
+ * Retrieve the VcnUnderlyingNetworkTemplate list, or a default list if it is not configured.
*
- * @see Builder#setVcnUnderlyingNetworkPriorities(LinkedHashSet<VcnUnderlyingNetworkPriority>)
- * @hide
+ * @see Builder#setVcnUnderlyingNetworkPriorities(List)
*/
@NonNull
- public LinkedHashSet<VcnUnderlyingNetworkPriority> getVcnUnderlyingNetworkPriorities() {
- return new LinkedHashSet<>(mUnderlyingNetworkPriorities);
+ public List<VcnUnderlyingNetworkTemplate> getVcnUnderlyingNetworkPriorities() {
+ return new ArrayList<>(mUnderlyingNetworkTemplates);
}
/**
@@ -415,15 +418,15 @@
PersistableBundleUtils.fromList(
new ArrayList<>(mExposedCapabilities),
PersistableBundleUtils.INTEGER_SERIALIZER);
- final PersistableBundle networkPrioritiesBundle =
+ final PersistableBundle networkTemplatesBundle =
PersistableBundleUtils.fromList(
- new ArrayList<>(mUnderlyingNetworkPriorities),
- VcnUnderlyingNetworkPriority::toPersistableBundle);
+ mUnderlyingNetworkTemplates,
+ VcnUnderlyingNetworkTemplate::toPersistableBundle);
result.putString(GATEWAY_CONNECTION_NAME_KEY, mGatewayConnectionName);
result.putPersistableBundle(TUNNEL_CONNECTION_PARAMS_KEY, tunnelConnectionParamsBundle);
result.putPersistableBundle(EXPOSED_CAPABILITIES_KEY, exposedCapsBundle);
- result.putPersistableBundle(UNDERLYING_NETWORK_PRIORITIES_KEY, networkPrioritiesBundle);
+ result.putPersistableBundle(UNDERLYING_NETWORK_TEMPLATES_KEY, networkTemplatesBundle);
result.putLongArray(RETRY_INTERVAL_MS_KEY, mRetryIntervalsMs);
result.putInt(MAX_MTU_KEY, mMaxMtu);
@@ -436,7 +439,7 @@
mGatewayConnectionName,
mTunnelConnectionParams,
mExposedCapabilities,
- mUnderlyingNetworkPriorities,
+ mUnderlyingNetworkTemplates,
Arrays.hashCode(mRetryIntervalsMs),
mMaxMtu);
}
@@ -451,7 +454,7 @@
return mGatewayConnectionName.equals(rhs.mGatewayConnectionName)
&& mTunnelConnectionParams.equals(rhs.mTunnelConnectionParams)
&& mExposedCapabilities.equals(rhs.mExposedCapabilities)
- && mUnderlyingNetworkPriorities.equals(rhs.mUnderlyingNetworkPriorities)
+ && mUnderlyingNetworkTemplates.equals(rhs.mUnderlyingNetworkTemplates)
&& Arrays.equals(mRetryIntervalsMs, rhs.mRetryIntervalsMs)
&& mMaxMtu == rhs.mMaxMtu;
}
@@ -465,8 +468,8 @@
@NonNull private final Set<Integer> mExposedCapabilities = new ArraySet();
@NonNull
- private final LinkedHashSet<VcnUnderlyingNetworkPriority> mUnderlyingNetworkPriorities =
- new LinkedHashSet<>(DEFAULT_UNDERLYING_NETWORK_PRIORITIES);
+ private final List<VcnUnderlyingNetworkTemplate> mUnderlyingNetworkTemplates =
+ new ArrayList<>(DEFAULT_UNDERLYING_NETWORK_TEMPLATES);
@NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS;
private int mMaxMtu = DEFAULT_MAX_MTU;
@@ -539,27 +542,37 @@
}
/**
- * Set the VcnUnderlyingNetworkPriority list.
+ * Set the list of templates to match underlying networks against, in high-to-low priority
+ * order.
*
- * @param underlyingNetworkPriorities a list of unique VcnUnderlyingNetworkPriorities that
- * are ordered from most to least preferred, or an empty list to use the default
- * prioritization. The default network prioritization is Opportunistic cellular, Carrier
- * WiFi and Macro cellular
- * @return
+ * <p>To select the VCN underlying network, the VCN connection will go through all the
+ * network candidates and return a network matching the highest priority rule.
+ *
+ * <p>If multiple networks match the same rule, the VCN will prefer an already-selected
+ * network as opposed to a new/unselected network. However, if both are new/unselected
+ * networks, a network will be chosen arbitrarily amongst the networks matching the highest
+ * priority rule.
+ *
+ * <p>If all networks fail to match the rules provided, an underlying network will still be
+ * selected (at random if necessary).
+ *
+ * @param underlyingNetworkTemplates a list of unique VcnUnderlyingNetworkTemplates that are
+ * ordered from most to least preferred, or an empty list to use the default
+ * prioritization. The default network prioritization order is Opportunistic cellular,
+ * Carrier WiFi and then Macro cellular.
+ * @return this {@link Builder} instance, for chaining
*/
- /** @hide */
@NonNull
public Builder setVcnUnderlyingNetworkPriorities(
- @NonNull LinkedHashSet<VcnUnderlyingNetworkPriority> underlyingNetworkPriorities) {
- Objects.requireNonNull(
- mUnderlyingNetworkPriorities, "underlyingNetworkPriorities is null");
+ @NonNull List<VcnUnderlyingNetworkTemplate> underlyingNetworkTemplates) {
+ validateNetworkTemplateList(underlyingNetworkTemplates);
- mUnderlyingNetworkPriorities.clear();
+ mUnderlyingNetworkTemplates.clear();
- if (underlyingNetworkPriorities.isEmpty()) {
- mUnderlyingNetworkPriorities.addAll(DEFAULT_UNDERLYING_NETWORK_PRIORITIES);
+ if (underlyingNetworkTemplates.isEmpty()) {
+ mUnderlyingNetworkTemplates.addAll(DEFAULT_UNDERLYING_NETWORK_TEMPLATES);
} else {
- mUnderlyingNetworkPriorities.addAll(underlyingNetworkPriorities);
+ mUnderlyingNetworkTemplates.addAll(underlyingNetworkTemplates);
}
return this;
@@ -629,7 +642,7 @@
mGatewayConnectionName,
mTunnelConnectionParams,
mExposedCapabilities,
- mUnderlyingNetworkPriorities,
+ mUnderlyingNetworkTemplates,
mRetryIntervalsMs,
mMaxMtu);
}
diff --git a/core/java/android/net/vcn/VcnUnderlyingNetworkPriority.java b/core/java/android/net/vcn/VcnUnderlyingNetworkPriority.java
deleted file mode 100644
index 551f757..0000000
--- a/core/java/android/net/vcn/VcnUnderlyingNetworkPriority.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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.
- */
-package android.net.vcn;
-
-import static com.android.internal.annotations.VisibleForTesting.Visibility;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.PersistableBundle;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-import com.android.internal.util.Preconditions;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-// TODO: Add documents
-/** @hide */
-public abstract class VcnUnderlyingNetworkPriority {
- /** @hide */
- protected static final int NETWORK_PRIORITY_TYPE_WIFI = 1;
- /** @hide */
- protected static final int NETWORK_PRIORITY_TYPE_CELL = 2;
-
- /** Denotes that any network quality is acceptable */
- public static final int NETWORK_QUALITY_ANY = 0;
- /** Denotes that network quality needs to be OK */
- public static final int NETWORK_QUALITY_OK = 100000;
-
- private static final SparseArray<String> NETWORK_QUALITY_TO_STRING_MAP = new SparseArray<>();
-
- static {
- NETWORK_QUALITY_TO_STRING_MAP.put(NETWORK_QUALITY_ANY, "NETWORK_QUALITY_ANY");
- NETWORK_QUALITY_TO_STRING_MAP.put(NETWORK_QUALITY_OK, "NETWORK_QUALITY_OK");
- }
-
- /** @hide */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({NETWORK_QUALITY_OK, NETWORK_QUALITY_ANY})
- public @interface NetworkQuality {}
-
- private static final String NETWORK_PRIORITY_TYPE_KEY = "mNetworkPriorityType";
- private final int mNetworkPriorityType;
-
- /** @hide */
- protected static final String NETWORK_QUALITY_KEY = "mNetworkQuality";
- private final int mNetworkQuality;
-
- /** @hide */
- protected static final String ALLOW_METERED_KEY = "mAllowMetered";
- private final boolean mAllowMetered;
-
- /** @hide */
- protected VcnUnderlyingNetworkPriority(
- int networkPriorityType, int networkQuality, boolean allowMetered) {
- mNetworkPriorityType = networkPriorityType;
- mNetworkQuality = networkQuality;
- mAllowMetered = allowMetered;
- }
-
- private static void validateNetworkQuality(int networkQuality) {
- Preconditions.checkArgument(
- networkQuality == NETWORK_QUALITY_ANY || networkQuality == NETWORK_QUALITY_OK,
- "Invalid networkQuality:" + networkQuality);
- }
-
- /** @hide */
- protected void validate() {
- validateNetworkQuality(mNetworkQuality);
- }
-
- /** @hide */
- @NonNull
- @VisibleForTesting(visibility = Visibility.PROTECTED)
- public static VcnUnderlyingNetworkPriority fromPersistableBundle(
- @NonNull PersistableBundle in) {
- Objects.requireNonNull(in, "PersistableBundle is null");
-
- final int networkPriorityType = in.getInt(NETWORK_PRIORITY_TYPE_KEY);
- switch (networkPriorityType) {
- case NETWORK_PRIORITY_TYPE_WIFI:
- return VcnWifiUnderlyingNetworkPriority.fromPersistableBundle(in);
- case NETWORK_PRIORITY_TYPE_CELL:
- return VcnCellUnderlyingNetworkPriority.fromPersistableBundle(in);
- default:
- throw new IllegalArgumentException(
- "Invalid networkPriorityType:" + networkPriorityType);
- }
- }
-
- /** @hide */
- @NonNull
- PersistableBundle toPersistableBundle() {
- final PersistableBundle result = new PersistableBundle();
-
- result.putInt(NETWORK_PRIORITY_TYPE_KEY, mNetworkPriorityType);
- result.putInt(NETWORK_QUALITY_KEY, mNetworkQuality);
- result.putBoolean(ALLOW_METERED_KEY, mAllowMetered);
-
- return result;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mNetworkPriorityType, mNetworkQuality, mAllowMetered);
- }
-
- @Override
- public boolean equals(@Nullable Object other) {
- if (!(other instanceof VcnUnderlyingNetworkPriority)) {
- return false;
- }
-
- final VcnUnderlyingNetworkPriority rhs = (VcnUnderlyingNetworkPriority) other;
- return mNetworkPriorityType == rhs.mNetworkPriorityType
- && mNetworkQuality == rhs.mNetworkQuality
- && mAllowMetered == rhs.mAllowMetered;
- }
-
- /** @hide */
- abstract void dumpTransportSpecificFields(IndentingPrintWriter pw);
-
- /**
- * Dumps the state of this record for logging and debugging purposes.
- *
- * @hide
- */
- public void dump(IndentingPrintWriter pw) {
- pw.println(this.getClass().getSimpleName() + ":");
- pw.increaseIndent();
-
- pw.println(
- "mNetworkQuality: "
- + NETWORK_QUALITY_TO_STRING_MAP.get(
- mNetworkQuality, "Invalid value " + mNetworkQuality));
- pw.println("mAllowMetered: " + mAllowMetered);
- dumpTransportSpecificFields(pw);
-
- pw.decreaseIndent();
- }
-
- /** Retrieve the required network quality. */
- @NetworkQuality
- public int getNetworkQuality() {
- return mNetworkQuality;
- }
-
- /** Return if a metered network is allowed. */
- public boolean allowMetered() {
- return mAllowMetered;
- }
-
- /**
- * This class is used to incrementally build VcnUnderlyingNetworkPriority objects.
- *
- * @param <T> The subclass to be built.
- */
- public abstract static class Builder<T extends Builder<T>> {
- /** @hide */
- protected int mNetworkQuality = NETWORK_QUALITY_ANY;
- /** @hide */
- protected boolean mAllowMetered = false;
-
- /** @hide */
- protected Builder() {}
-
- /**
- * Set the required network quality.
- *
- * @param networkQuality the required network quality. Defaults to NETWORK_QUALITY_ANY
- */
- @NonNull
- public T setNetworkQuality(@NetworkQuality int networkQuality) {
- validateNetworkQuality(networkQuality);
-
- mNetworkQuality = networkQuality;
- return self();
- }
-
- /**
- * Set if a metered network is allowed.
- *
- * @param allowMetered the flag to indicate if a metered network is allowed, defaults to
- * {@code false}
- */
- @NonNull
- public T setAllowMetered(boolean allowMetered) {
- mAllowMetered = allowMetered;
- return self();
- }
-
- /** @hide */
- abstract T self();
- }
-}
diff --git a/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java
new file mode 100644
index 0000000..60fc936
--- /dev/null
+++ b/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java
@@ -0,0 +1,246 @@
+/*
+ * 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.
+ */
+package android.net.vcn;
+
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_ANY;
+
+import static com.android.internal.annotations.VisibleForTesting.Visibility;
+
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.PersistableBundle;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
+/**
+ * This class represents a template containing set of underlying network requirements for doing
+ * route selection.
+ *
+ * <p>Apps provisioning a VCN can configure the underlying network priority for each Gateway
+ * Connection by setting a list (in priority order, most to least preferred) of the appropriate
+ * subclasses in the VcnGatewayConnectionConfig. See {@link
+ * VcnGatewayConnectionConfig.Builder#setVcnUnderlyingNetworkPriorities}
+ */
+public abstract class VcnUnderlyingNetworkTemplate {
+ /** @hide */
+ static final int NETWORK_PRIORITY_TYPE_WIFI = 1;
+ /** @hide */
+ static final int NETWORK_PRIORITY_TYPE_CELL = 2;
+
+ /** Denotes that any network quality is acceptable. @hide */
+ public static final int NETWORK_QUALITY_ANY = 0;
+ /** Denotes that network quality needs to be OK. @hide */
+ public static final int NETWORK_QUALITY_OK = 100000;
+
+ private static final SparseArray<String> NETWORK_QUALITY_TO_STRING_MAP = new SparseArray<>();
+
+ static {
+ NETWORK_QUALITY_TO_STRING_MAP.put(NETWORK_QUALITY_ANY, "NETWORK_QUALITY_ANY");
+ NETWORK_QUALITY_TO_STRING_MAP.put(NETWORK_QUALITY_OK, "NETWORK_QUALITY_OK");
+ }
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({NETWORK_QUALITY_OK, NETWORK_QUALITY_ANY})
+ public @interface NetworkQuality {}
+
+ /**
+ * Used to configure the matching criteria of a network characteristic. This may include network
+ * capabilities, or cellular subscription information. Denotes that networks with or without the
+ * characteristic are both acceptable to match this template.
+ */
+ public static final int MATCH_ANY = 0;
+
+ /**
+ * Used to configure the matching criteria of a network characteristic. This may include network
+ * capabilities, or cellular subscription information. Denotes that a network MUST have the
+ * capability in order to match this template.
+ */
+ public static final int MATCH_REQUIRED = 1;
+
+ /**
+ * Used to configure the matching criteria of a network characteristic. This may include network
+ * capabilities, or cellular subscription information. Denotes that a network MUST NOT have the
+ * capability in order to match this template.
+ */
+ public static final int MATCH_FORBIDDEN = 2;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({MATCH_ANY, MATCH_REQUIRED, MATCH_FORBIDDEN})
+ public @interface MatchCriteria {}
+
+ private static final SparseArray<String> MATCH_CRITERIA_TO_STRING_MAP = new SparseArray<>();
+
+ static {
+ MATCH_CRITERIA_TO_STRING_MAP.put(MATCH_ANY, "MATCH_ANY");
+ MATCH_CRITERIA_TO_STRING_MAP.put(MATCH_REQUIRED, "MATCH_REQUIRED");
+ MATCH_CRITERIA_TO_STRING_MAP.put(MATCH_FORBIDDEN, "MATCH_FORBIDDEN");
+ }
+
+ private static final String NETWORK_PRIORITY_TYPE_KEY = "mNetworkPriorityType";
+ private final int mNetworkPriorityType;
+
+ /** @hide */
+ static final String NETWORK_QUALITY_KEY = "mNetworkQuality";
+
+ private final int mNetworkQuality;
+
+ /** @hide */
+ static final String METERED_MATCH_KEY = "mMeteredMatchCriteria";
+
+ private final int mMeteredMatchCriteria;
+
+ /** @hide */
+ VcnUnderlyingNetworkTemplate(
+ int networkPriorityType, int networkQuality, int meteredMatchCriteria) {
+ mNetworkPriorityType = networkPriorityType;
+ mNetworkQuality = networkQuality;
+ mMeteredMatchCriteria = meteredMatchCriteria;
+ }
+
+ /** @hide */
+ static void validateNetworkQuality(int networkQuality) {
+ Preconditions.checkArgument(
+ networkQuality == NETWORK_QUALITY_ANY || networkQuality == NETWORK_QUALITY_OK,
+ "Invalid networkQuality:" + networkQuality);
+ }
+
+ /** @hide */
+ static void validateMatchCriteria(int meteredMatchCriteria, String matchingCapability) {
+ Preconditions.checkArgument(
+ MATCH_CRITERIA_TO_STRING_MAP.contains(meteredMatchCriteria),
+ "Invalid matching criteria: "
+ + meteredMatchCriteria
+ + " for "
+ + matchingCapability);
+ }
+
+ /** @hide */
+ protected void validate() {
+ validateNetworkQuality(mNetworkQuality);
+ validateMatchCriteria(mMeteredMatchCriteria, "mMeteredMatchCriteria");
+ }
+
+ /** @hide */
+ @NonNull
+ @VisibleForTesting(visibility = Visibility.PROTECTED)
+ public static VcnUnderlyingNetworkTemplate fromPersistableBundle(
+ @NonNull PersistableBundle in) {
+ Objects.requireNonNull(in, "PersistableBundle is null");
+
+ final int networkPriorityType = in.getInt(NETWORK_PRIORITY_TYPE_KEY);
+ switch (networkPriorityType) {
+ case NETWORK_PRIORITY_TYPE_WIFI:
+ return VcnWifiUnderlyingNetworkTemplate.fromPersistableBundle(in);
+ case NETWORK_PRIORITY_TYPE_CELL:
+ return VcnCellUnderlyingNetworkTemplate.fromPersistableBundle(in);
+ default:
+ throw new IllegalArgumentException(
+ "Invalid networkPriorityType:" + networkPriorityType);
+ }
+ }
+
+ /** @hide */
+ @NonNull
+ PersistableBundle toPersistableBundle() {
+ final PersistableBundle result = new PersistableBundle();
+
+ result.putInt(NETWORK_PRIORITY_TYPE_KEY, mNetworkPriorityType);
+ result.putInt(NETWORK_QUALITY_KEY, mNetworkQuality);
+ result.putInt(METERED_MATCH_KEY, mMeteredMatchCriteria);
+
+ return result;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mNetworkPriorityType, mNetworkQuality, mMeteredMatchCriteria);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object other) {
+ if (!(other instanceof VcnUnderlyingNetworkTemplate)) {
+ return false;
+ }
+
+ final VcnUnderlyingNetworkTemplate rhs = (VcnUnderlyingNetworkTemplate) other;
+ return mNetworkPriorityType == rhs.mNetworkPriorityType
+ && mNetworkQuality == rhs.mNetworkQuality
+ && mMeteredMatchCriteria == rhs.mMeteredMatchCriteria;
+ }
+
+ /** @hide */
+ static String getNameString(SparseArray<String> toStringMap, int key) {
+ return toStringMap.get(key, "Invalid value " + key);
+ }
+
+ /** @hide */
+ static String getMatchCriteriaString(int meteredMatchCriteria) {
+ return getNameString(MATCH_CRITERIA_TO_STRING_MAP, meteredMatchCriteria);
+ }
+
+ /** @hide */
+ abstract void dumpTransportSpecificFields(IndentingPrintWriter pw);
+
+ /**
+ * Dumps the state of this record for logging and debugging purposes.
+ *
+ * @hide
+ */
+ public void dump(IndentingPrintWriter pw) {
+ pw.println(this.getClass().getSimpleName() + ":");
+ pw.increaseIndent();
+
+ pw.println(
+ "mNetworkQuality: "
+ + getNameString(NETWORK_QUALITY_TO_STRING_MAP, mNetworkQuality));
+ pw.println("mMeteredMatchCriteria: " + getMatchCriteriaString(mMeteredMatchCriteria));
+ dumpTransportSpecificFields(pw);
+
+ pw.decreaseIndent();
+ }
+
+ /**
+ * Retrieve the required network quality to match this template.
+ *
+ * @see Builder#setNetworkQuality(int)
+ * @hide
+ */
+ @NetworkQuality
+ public int getNetworkQuality() {
+ return mNetworkQuality;
+ }
+
+ /**
+ * Return the matching criteria for metered networks.
+ *
+ * @see VcnWifiUnderlyingNetworkTemplate.Builder#setMetered(int)
+ * @see VcnCellUnderlyingNetworkTemplate.Builder#setMetered(int)
+ */
+ @MatchCriteria
+ public int getMetered() {
+ return mMeteredMatchCriteria;
+ }
+}
diff --git a/core/java/android/net/vcn/VcnWifiUnderlyingNetworkPriority.java b/core/java/android/net/vcn/VcnWifiUnderlyingNetworkPriority.java
deleted file mode 100644
index 85eb100..0000000
--- a/core/java/android/net/vcn/VcnWifiUnderlyingNetworkPriority.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.
- */
-package android.net.vcn;
-
-import static com.android.internal.annotations.VisibleForTesting.Visibility;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.PersistableBundle;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.IndentingPrintWriter;
-
-import java.util.Objects;
-
-// TODO: Add documents
-/** @hide */
-public final class VcnWifiUnderlyingNetworkPriority extends VcnUnderlyingNetworkPriority {
- private static final String SSID_KEY = "mSsid";
- @Nullable private final String mSsid;
-
- private VcnWifiUnderlyingNetworkPriority(
- int networkQuality, boolean allowMetered, String ssid) {
- super(NETWORK_PRIORITY_TYPE_WIFI, networkQuality, allowMetered);
- mSsid = ssid;
-
- validate();
- }
-
- /** @hide */
- @NonNull
- @VisibleForTesting(visibility = Visibility.PROTECTED)
- public static VcnWifiUnderlyingNetworkPriority fromPersistableBundle(
- @NonNull PersistableBundle in) {
- Objects.requireNonNull(in, "PersistableBundle is null");
-
- final int networkQuality = in.getInt(NETWORK_QUALITY_KEY);
- final boolean allowMetered = in.getBoolean(ALLOW_METERED_KEY);
- final String ssid = in.getString(SSID_KEY);
- return new VcnWifiUnderlyingNetworkPriority(networkQuality, allowMetered, ssid);
- }
-
- /** @hide */
- @Override
- @NonNull
- @VisibleForTesting(visibility = Visibility.PROTECTED)
- public PersistableBundle toPersistableBundle() {
- final PersistableBundle result = super.toPersistableBundle();
- result.putString(SSID_KEY, mSsid);
- return result;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(super.hashCode(), mSsid);
- }
-
- @Override
- public boolean equals(@Nullable Object other) {
- if (!super.equals(other)) {
- return false;
- }
-
- if (!(other instanceof VcnWifiUnderlyingNetworkPriority)) {
- return false;
- }
-
- final VcnWifiUnderlyingNetworkPriority rhs = (VcnWifiUnderlyingNetworkPriority) other;
- return mSsid.equals(rhs.mSsid);
- }
-
- /** @hide */
- @Override
- void dumpTransportSpecificFields(IndentingPrintWriter pw) {
- pw.println("mSsid: " + mSsid);
- }
-
- /** Retrieve the required SSID, or {@code null} if there is no requirement on SSID. */
- @Nullable
- public String getSsid() {
- return mSsid;
- }
-
- /** This class is used to incrementally build VcnWifiUnderlyingNetworkPriority objects. */
- public static class Builder extends VcnUnderlyingNetworkPriority.Builder<Builder> {
- @Nullable private String mSsid;
-
- /** Construct a Builder object. */
- public Builder() {}
-
- /**
- * Set the required SSID.
- *
- * @param ssid the required SSID, or {@code null} if any SSID is acceptable.
- */
- @NonNull
- public Builder setSsid(@Nullable String ssid) {
- mSsid = ssid;
- return this;
- }
-
- /** Build the VcnWifiUnderlyingNetworkPriority. */
- @NonNull
- public VcnWifiUnderlyingNetworkPriority build() {
- return new VcnWifiUnderlyingNetworkPriority(mNetworkQuality, mAllowMetered, mSsid);
- }
-
- /** @hide */
- @Override
- Builder self() {
- return this;
- }
- }
-}
diff --git a/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java
new file mode 100644
index 0000000..272ca9d
--- /dev/null
+++ b/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java
@@ -0,0 +1,210 @@
+/*
+ * 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.
+ */
+package android.net.vcn;
+
+import static com.android.internal.annotations.VisibleForTesting.Visibility;
+import static com.android.server.vcn.util.PersistableBundleUtils.STRING_DESERIALIZER;
+import static com.android.server.vcn.util.PersistableBundleUtils.STRING_SERIALIZER;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
+import android.net.NetworkCapabilities;
+import android.os.PersistableBundle;
+import android.util.ArraySet;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.vcn.util.PersistableBundleUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * This class represents a configuration for a network template class of underlying Carrier WiFi
+ * networks.
+ *
+ * <p>See {@link VcnUnderlyingNetworkTemplate}
+ */
+public final class VcnWifiUnderlyingNetworkTemplate extends VcnUnderlyingNetworkTemplate {
+ private static final String SSIDS_KEY = "mSsids";
+ @Nullable private final Set<String> mSsids;
+
+ private VcnWifiUnderlyingNetworkTemplate(
+ int networkQuality, int meteredMatchCriteria, Set<String> ssids) {
+ super(NETWORK_PRIORITY_TYPE_WIFI, networkQuality, meteredMatchCriteria);
+ mSsids = new ArraySet<>(ssids);
+
+ validate();
+ }
+
+ /** @hide */
+ @Override
+ protected void validate() {
+ super.validate();
+ validateSsids(mSsids);
+ }
+
+ private static void validateSsids(Set<String> ssids) {
+ Objects.requireNonNull(ssids, "ssids is null");
+
+ for (String ssid : ssids) {
+ Objects.requireNonNull(ssid, "found null value ssid");
+ }
+ }
+
+ /** @hide */
+ @NonNull
+ @VisibleForTesting(visibility = Visibility.PROTECTED)
+ public static VcnWifiUnderlyingNetworkTemplate fromPersistableBundle(
+ @NonNull PersistableBundle in) {
+ Objects.requireNonNull(in, "PersistableBundle is null");
+
+ final int networkQuality = in.getInt(NETWORK_QUALITY_KEY);
+ final int meteredMatchCriteria = in.getInt(METERED_MATCH_KEY);
+
+ final PersistableBundle ssidsBundle = in.getPersistableBundle(SSIDS_KEY);
+ Objects.requireNonNull(ssidsBundle, "ssidsBundle is null");
+ final Set<String> ssids =
+ new ArraySet<String>(
+ PersistableBundleUtils.toList(ssidsBundle, STRING_DESERIALIZER));
+ return new VcnWifiUnderlyingNetworkTemplate(networkQuality, meteredMatchCriteria, ssids);
+ }
+
+ /** @hide */
+ @Override
+ @NonNull
+ @VisibleForTesting(visibility = Visibility.PROTECTED)
+ public PersistableBundle toPersistableBundle() {
+ final PersistableBundle result = super.toPersistableBundle();
+
+ final PersistableBundle ssidsBundle =
+ PersistableBundleUtils.fromList(new ArrayList<>(mSsids), STRING_SERIALIZER);
+ result.putPersistableBundle(SSIDS_KEY, ssidsBundle);
+
+ return result;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), mSsids);
+ }
+
+ @Override
+ public boolean equals(@Nullable Object other) {
+ if (!super.equals(other)) {
+ return false;
+ }
+
+ if (!(other instanceof VcnWifiUnderlyingNetworkTemplate)) {
+ return false;
+ }
+
+ final VcnWifiUnderlyingNetworkTemplate rhs = (VcnWifiUnderlyingNetworkTemplate) other;
+ return mSsids.equals(rhs.mSsids);
+ }
+
+ /** @hide */
+ @Override
+ void dumpTransportSpecificFields(IndentingPrintWriter pw) {
+ pw.println("mSsids: " + mSsids);
+ }
+
+ /**
+ * Retrieve the matching SSIDs, or an empty set if any SSID is acceptable.
+ *
+ * @see Builder#setSsids(Set)
+ */
+ @NonNull
+ public Set<String> getSsids() {
+ return Collections.unmodifiableSet(mSsids);
+ }
+
+ /** This class is used to incrementally build VcnWifiUnderlyingNetworkTemplate objects. */
+ public static final class Builder {
+ private int mNetworkQuality = NETWORK_QUALITY_ANY;
+ private int mMeteredMatchCriteria = MATCH_ANY;
+ @NonNull private final Set<String> mSsids = new ArraySet<>();
+
+ /** Construct a Builder object. */
+ public Builder() {}
+
+ /**
+ * Set the required network quality to match this template.
+ *
+ * <p>Network quality is a aggregation of multiple signals that reflect the network link
+ * metrics. For example, the network validation bit (see {@link
+ * NetworkCapabilities#NET_CAPABILITY_VALIDATED}), estimated first hop transport bandwidth
+ * and signal strength.
+ *
+ * @param networkQuality the required network quality. Defaults to NETWORK_QUALITY_ANY
+ * @hide
+ */
+ @NonNull
+ public Builder setNetworkQuality(@NetworkQuality int networkQuality) {
+ validateNetworkQuality(networkQuality);
+
+ mNetworkQuality = networkQuality;
+ return this;
+ }
+
+ /**
+ * Set the matching criteria for metered networks.
+ *
+ * <p>A template where setMetered(MATCH_REQUIRED) will only match metered networks (one
+ * without NET_CAPABILITY_NOT_METERED). A template where setMetered(MATCH_FORBIDDEN) will
+ * only match a network that is not metered (one with NET_CAPABILITY_NOT_METERED).
+ *
+ * @param matchCriteria the matching criteria for metered networks. Defaults to {@link
+ * #MATCH_ANY}.
+ * @see NetworkCapabilities#NET_CAPABILITY_NOT_METERED
+ */
+ // The matching getter is defined in the super class. Please see {@link
+ // VcnUnderlyingNetworkTemplate#getMetered()}
+ @SuppressLint("MissingGetterMatchingBuilder")
+ @NonNull
+ public Builder setMetered(@MatchCriteria int matchCriteria) {
+ validateMatchCriteria(matchCriteria, "setMetered");
+
+ mMeteredMatchCriteria = matchCriteria;
+ return this;
+ }
+
+ /**
+ * Set the SSIDs with which a network can match this priority rule.
+ *
+ * @param ssids the matching SSIDs. Network with one of the matching SSIDs can match this
+ * priority rule. If the set is empty, any SSID will match. The default is an empty set.
+ */
+ @NonNull
+ public Builder setSsids(@NonNull Set<String> ssids) {
+ validateSsids(ssids);
+
+ mSsids.clear();
+ mSsids.addAll(ssids);
+ return this;
+ }
+
+ /** Build the VcnWifiUnderlyingNetworkTemplate. */
+ @NonNull
+ public VcnWifiUnderlyingNetworkTemplate build() {
+ return new VcnWifiUnderlyingNetworkTemplate(
+ mNetworkQuality, mMeteredMatchCriteria, mSsids);
+ }
+ }
+}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 92d652d..d4a338b 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -335,6 +335,12 @@
public static final int USER_ACTIVITY_EVENT_FACE_DOWN = 5;
/**
+ * User activity event type: There is a change in the device state.
+ * @hide
+ */
+ public static final int USER_ACTIVITY_EVENT_DEVICE_STATE = 6;
+
+ /**
* User activity flag: If already dimmed, extend the dim timeout
* but do not brighten. This flag is useful for keeping the screen on
* a little longer without causing a visible change such as when
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index b4f3fa0..edf6280 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1657,41 +1657,49 @@
public @interface UserSwitchabilityResult {}
/**
- * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified
- * user has been successfully removed.
+ * A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
+ * the specified user has been successfully removed.
+ *
* @hide
*/
+ @SystemApi
public static final int REMOVE_RESULT_REMOVED = 0;
/**
- * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified
- * user has had its {@link UserInfo#FLAG_EPHEMERAL} flag set to {@code true}, so that it will be
- * removed when the user is stopped or on boot.
+ * A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
+ * the specified user is marked so that it will be removed when the user is stopped or on boot.
+ *
* @hide
*/
- public static final int REMOVE_RESULT_SET_EPHEMERAL = 1;
+ @SystemApi
+ public static final int REMOVE_RESULT_DEFERRED = 1;
/**
- * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified
- * user is already in the process of being removed.
+ * A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
+ * the specified user is already in the process of being removed.
+ *
* @hide
*/
+ @SystemApi
public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2;
/**
- * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that an error occurred
- * that prevented the user from being removed or set as ephemeral.
+ * A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
+ * an error occurred that prevented the user from being removed or set as ephemeral.
+ *
* @hide
*/
+ @SystemApi
public static final int REMOVE_RESULT_ERROR = 3;
/**
- * Possible response codes from {@link #removeUserOrSetEphemeral(int)}.
+ * Possible response codes from {@link #removeUserWhenPossible(UserHandle, boolean)}.
+ *
* @hide
*/
@IntDef(prefix = { "REMOVE_RESULT_" }, value = {
REMOVE_RESULT_REMOVED,
- REMOVE_RESULT_SET_EPHEMERAL,
+ REMOVE_RESULT_DEFERRED,
REMOVE_RESULT_ALREADY_BEING_REMOVED,
REMOVE_RESULT_ERROR,
})
@@ -4728,12 +4736,42 @@
* the current user, then set the user as ephemeral so that it will be removed when it is
* stopped.
*
- * @param evenWhenDisallowed when {@code true}, user is removed even if the caller user has the
+ * @param overrideDevicePolicy when {@code true}, user is removed even if the caller has
+ * the {@link #DISALLOW_REMOVE_USER} or {@link #DISALLOW_REMOVE_MANAGED_PROFILE} restriction
+ *
+ * @return the result code {@link #REMOVE_RESULT_REMOVED}, {@link #REMOVE_RESULT_DEFERRED},
+ * {@link #REMOVE_RESULT_ALREADY_BEING_REMOVED}, or {@link #REMOVE_RESULT_ERROR}.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS,
+ Manifest.permission.CREATE_USERS})
+ public int removeUserWhenPossible(@NonNull UserHandle user,
+ boolean overrideDevicePolicy) {
+ try {
+ return mService.removeUserOrSetEphemeral(user.getIdentifier(), overrideDevicePolicy);
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Immediately removes the user or, if the user cannot be removed, such as when the user is
+ * the current user, then set the user as ephemeral so that it will be removed when it is
+ * stopped.
+ *
+ * @param evenWhenDisallowed when {@code true}, user is removed even if the caller has the
* {@link #DISALLOW_REMOVE_USER} or {@link #DISALLOW_REMOVE_MANAGED_PROFILE} restriction
*
* @return the {@link RemoveResult} code
+ *
+ * @deprecated TODO(b/199446770): remove this call after converting all calls to
+ * removeUserWhenPossible(UserHandle, boolean)
+ *
* @hide
*/
+ @Deprecated
@RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS,
Manifest.permission.CREATE_USERS})
public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId,
diff --git a/core/java/android/os/VibrationAttributes.java b/core/java/android/os/VibrationAttributes.java
index 5831573..8834725 100644
--- a/core/java/android/os/VibrationAttributes.java
+++ b/core/java/android/os/VibrationAttributes.java
@@ -32,32 +32,30 @@
public final class VibrationAttributes implements Parcelable {
private static final String TAG = "VibrationAttributes";
- /**
- * @hide
- */
+ /** @hide */
@IntDef(prefix = { "USAGE_CLASS_" }, value = {
USAGE_CLASS_UNKNOWN,
USAGE_CLASS_ALARM,
USAGE_CLASS_FEEDBACK,
})
@Retention(RetentionPolicy.SOURCE)
- public @interface UsageClass{}
+ public @interface UsageClass {}
- /**
- * @hide
- */
+ /** @hide */
@IntDef(prefix = { "USAGE_" }, value = {
USAGE_UNKNOWN,
+ USAGE_ACCESSIBILITY,
USAGE_ALARM,
- USAGE_RINGTONE,
- USAGE_NOTIFICATION,
USAGE_COMMUNICATION_REQUEST,
- USAGE_TOUCH,
- USAGE_PHYSICAL_EMULATION,
USAGE_HARDWARE_FEEDBACK,
+ USAGE_MEDIA,
+ USAGE_NOTIFICATION,
+ USAGE_PHYSICAL_EMULATION,
+ USAGE_RINGTONE,
+ USAGE_TOUCH,
})
@Retention(RetentionPolicy.SOURCE)
- public @interface Usage{}
+ public @interface Usage {}
/**
* Vibration usage filter value to match all usages.
diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java
index 41ab062..ae37a71 100644
--- a/core/java/android/os/VibrationEffect.java
+++ b/core/java/android/os/VibrationEffect.java
@@ -260,7 +260,7 @@
for (int i = 0; i < timings.length; i++) {
float parsedAmplitude = amplitudes[i] == DEFAULT_AMPLITUDE
? DEFAULT_AMPLITUDE : (float) amplitudes[i] / MAX_AMPLITUDE;
- segments.add(new StepSegment(parsedAmplitude, /* frequency= */ 0, (int) timings[i]));
+ segments.add(new StepSegment(parsedAmplitude, /* frequencyHz= */ 0, (int) timings[i]));
}
VibrationEffect effect = new Composed(segments, repeat);
effect.validate();
@@ -866,7 +866,7 @@
Preconditions.checkArgumentNonnegative(delay);
if (delay > 0) {
// Created a segment sustaining the zero amplitude to represent the delay.
- addSegment(new StepSegment(/* amplitude= */ 0, /* frequency= */ 0,
+ addSegment(new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0,
/* duration= */ delay));
}
return addSegments(effect);
@@ -1033,26 +1033,27 @@
@NonNull
public WaveformBuilder addStep(@FloatRange(from = 0f, to = 1f) float amplitude,
@IntRange(from = 0) int duration) {
- return addStep(amplitude, getPreviousFrequency(), duration);
+ mSegments.add(new StepSegment(amplitude, getPreviousFrequencyHz(), duration));
+ return this;
}
/**
- * Vibrate with given amplitude for the given duration, in millis, keeping the previous
- * vibration frequency the same.
+ * Vibrate with given amplitude and frequency for the given duration, in millis.
*
* <p>If the duration is zero the vibrator will jump to new amplitude.
*
* @param amplitude The amplitude for this step
- * @param frequency The frequency for this step
+ * @param frequencyHz The frequency for this step, in hertz
* @param duration The duration of this step in milliseconds
* @return The {@link WaveformBuilder} object to enable adding multiple steps in chain.
*/
@SuppressLint("MissingGetterMatchingBuilder")
@NonNull
public WaveformBuilder addStep(@FloatRange(from = 0f, to = 1f) float amplitude,
- @FloatRange(from = -1f, to = 1f) float frequency,
+ @FloatRange(from = 1f) float frequencyHz,
@IntRange(from = 0) int duration) {
- mSegments.add(new StepSegment(amplitude, frequency, duration));
+ Preconditions.checkArgument(frequencyHz >= 1, "Frequency must be >= 1");
+ mSegments.add(new StepSegment(amplitude, frequencyHz, duration));
return this;
}
@@ -1070,7 +1071,9 @@
@NonNull
public WaveformBuilder addRamp(@FloatRange(from = 0f, to = 1f) float amplitude,
@IntRange(from = 0) int duration) {
- return addRamp(amplitude, getPreviousFrequency(), duration);
+ mSegments.add(new RampSegment(getPreviousAmplitude(), amplitude,
+ getPreviousFrequencyHz(), getPreviousFrequencyHz(), duration));
+ return this;
}
/**
@@ -1080,22 +1083,23 @@
* <p>If the duration is zero the vibrator will jump to new amplitude and frequency.
*
* @param amplitude The final amplitude this ramp should reach
- * @param frequency The final frequency this ramp should reach
+ * @param frequencyHz The final frequency this ramp should reach, in hertz
* @param duration The duration of this ramp in milliseconds
* @return The {@link WaveformBuilder} object to enable adding multiple steps in chain.
*/
@SuppressLint("MissingGetterMatchingBuilder")
@NonNull
public WaveformBuilder addRamp(@FloatRange(from = 0f, to = 1f) float amplitude,
- @FloatRange(from = -1f, to = 1f) float frequency,
+ @FloatRange(from = 1f) float frequencyHz,
@IntRange(from = 0) int duration) {
- mSegments.add(new RampSegment(getPreviousAmplitude(), amplitude, getPreviousFrequency(),
- frequency, duration));
+ Preconditions.checkArgument(frequencyHz >= 1, "Frequency must be >= 1");
+ mSegments.add(new RampSegment(getPreviousAmplitude(), amplitude,
+ getPreviousFrequencyHz(), frequencyHz, duration));
return this;
}
/**
- * Compose all of the steps together into a single {@link VibrationEffect}.
+ * Compose all the steps together into a single {@link VibrationEffect}.
*
* The {@link WaveformBuilder} object is still valid after this call, so you can
* continue adding more primitives to it and generating more {@link VibrationEffect}s by
@@ -1109,7 +1113,7 @@
}
/**
- * Compose all of the steps together into a single {@link VibrationEffect}.
+ * Compose all the steps together into a single {@link VibrationEffect}.
*
* <p>To cause the pattern to repeat, pass the index at which to start the repetition
* (starting at 0), or -1 to disable repeating.
@@ -1131,13 +1135,13 @@
return effect;
}
- private float getPreviousFrequency() {
+ private float getPreviousFrequencyHz() {
if (!mSegments.isEmpty()) {
VibrationEffectSegment segment = mSegments.get(mSegments.size() - 1);
if (segment instanceof StepSegment) {
- return ((StepSegment) segment).getFrequency();
+ return ((StepSegment) segment).getFrequencyHz();
} else if (segment instanceof RampSegment) {
- return ((RampSegment) segment).getEndFrequency();
+ return ((RampSegment) segment).getEndFrequencyHz();
}
}
return 0;
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index c67c82e..eba9ff1 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -17,20 +17,21 @@
package android.os;
import android.annotation.CallbackExecutor;
-import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.app.ActivityThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
+import android.content.res.Resources;
import android.hardware.vibrator.IVibrator;
import android.media.AudioAttributes;
+import android.os.vibrator.VibrationConfig;
import android.util.Log;
-import android.util.Range;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -51,6 +52,7 @@
*
* @hide
*/
+ @TestApi
public static final int VIBRATION_INTENSITY_OFF = 0;
/**
@@ -58,6 +60,7 @@
*
* @hide
*/
+ @TestApi
public static final int VIBRATION_INTENSITY_LOW = 1;
/**
@@ -65,6 +68,7 @@
*
* @hide
*/
+ @TestApi
public static final int VIBRATION_INTENSITY_MEDIUM = 2;
/**
@@ -72,6 +76,7 @@
*
* @hide
*/
+ @TestApi
public static final int VIBRATION_INTENSITY_HIGH = 3;
/**
@@ -117,16 +122,12 @@
}
private final String mPackageName;
- // The default vibration intensity level for haptic feedback.
- @VibrationIntensity
- private int mDefaultHapticFeedbackIntensity;
- // The default vibration intensity level for notifications.
- @VibrationIntensity
- private int mDefaultNotificationVibrationIntensity;
- // The default vibration intensity level for ringtones.
- @VibrationIntensity
- private int mDefaultRingVibrationIntensity;
- private float mHapticChannelMaxVibrationAmplitude;
+ @Nullable
+ private final Resources mResources;
+
+ // This is lazily loaded only for the few clients that need this (e. Settings app).
+ @Nullable
+ private volatile VibrationConfig mVibrationConfig;
/**
* @hide to prevent subclassing from outside of the framework
@@ -134,8 +135,7 @@
@UnsupportedAppUsage
public Vibrator() {
mPackageName = ActivityThread.currentPackageName();
- final Context ctx = ActivityThread.currentActivityThread().getSystemContext();
- loadVibrationConfig(ctx);
+ mResources = null;
}
/**
@@ -143,26 +143,7 @@
*/
protected Vibrator(Context context) {
mPackageName = context.getOpPackageName();
- loadVibrationConfig(context);
- }
-
- private void loadVibrationConfig(Context context) {
- mDefaultHapticFeedbackIntensity = loadDefaultIntensity(context,
- com.android.internal.R.integer.config_defaultHapticFeedbackIntensity);
- mDefaultNotificationVibrationIntensity = loadDefaultIntensity(context,
- com.android.internal.R.integer.config_defaultNotificationVibrationIntensity);
- mDefaultRingVibrationIntensity = loadDefaultIntensity(context,
- com.android.internal.R.integer.config_defaultRingVibrationIntensity);
- mHapticChannelMaxVibrationAmplitude = loadFloat(context,
- com.android.internal.R.dimen.config_hapticChannelMaxVibrationAmplitude, 0);
- }
-
- private int loadDefaultIntensity(Context ctx, int resId) {
- return ctx != null ? ctx.getResources().getInteger(resId) : VIBRATION_INTENSITY_MEDIUM;
- }
-
- private float loadFloat(Context ctx, int resId, float defaultValue) {
- return ctx != null ? ctx.getResources().getFloat(resId) : defaultValue;
+ mResources = context.getResources();
}
/**
@@ -174,31 +155,30 @@
return VibratorInfo.EMPTY_VIBRATOR_INFO;
}
- /**
- * Get the default vibration intensity for haptic feedback.
- *
- * @hide
- */
- public int getDefaultHapticFeedbackIntensity() {
- return mDefaultHapticFeedbackIntensity;
+ /** Get the static vibrator configuration from config.xml. */
+ private VibrationConfig getConfig() {
+ if (mVibrationConfig == null) {
+ Resources resources = mResources;
+ if (resources == null) {
+ final Context ctx = ActivityThread.currentActivityThread().getSystemContext();
+ resources = ctx != null ? ctx.getResources() : null;
+ }
+ // This might be constructed more than once, but it only loads static config data from a
+ // xml file, so it would be ok.
+ mVibrationConfig = new VibrationConfig(resources);
+ }
+ return mVibrationConfig;
}
/**
- * Get the default vibration intensity for notifications.
+ * Get the default vibration intensity for given usage.
*
* @hide
*/
- public int getDefaultNotificationVibrationIntensity() {
- return mDefaultNotificationVibrationIntensity;
- }
-
- /**
- * Get the default vibration intensity for ringtones.
- *
- * @hide
- */
- public int getDefaultRingVibrationIntensity() {
- return mDefaultRingVibrationIntensity;
+ @TestApi
+ @VibrationIntensity
+ public int getDefaultVibrationIntensity(@VibrationAttributes.Usage int usage) {
+ return getConfig().getDefaultVibrationIntensity(usage);
}
/**
@@ -271,43 +251,6 @@
}
/**
- * Return a range of relative frequency values supported by the vibrator.
- *
- * <p>These values can be used to create waveforms that controls the vibration frequency via
- * {@link VibrationEffect.WaveformBuilder}.
- *
- * @return A range of relative frequency values supported. The range will always contain the
- * value 0, representing the device resonant frequency. Devices without frequency control will
- * return the range [0,0]. Devices with frequency control will always return a range containing
- * the safe range [-1, 1].
- * @hide
- */
- public Range<Float> getRelativeFrequencyRange() {
- return getInfo().getFrequencyRange();
- }
-
- /**
- * Return the maximum amplitude the vibrator can play at given relative frequency.
- *
- * <p>Devices without frequency control will return 1 for the input zero (resonant frequency),
- * and 0 to any other input.
- *
- * <p>Devices with frequency control will return the supported value, for input in
- * {@link #getRelativeFrequencyRange()}, and 0 for any other input.
- *
- * <p>These values can be used to create waveforms that plays vibrations outside the resonant
- * frequency via {@link VibrationEffect.WaveformBuilder}.
- *
- * @return a value in [0,1] representing the maximum amplitude the device can play at given
- * relative frequency.
- * @hide
- */
- @FloatRange(from = 0, to = 1)
- public float getMaximumAmplitude(float relativeFrequency) {
- return getInfo().getMaxAmplitude(relativeFrequency);
- }
-
- /**
* Return the maximum amplitude the vibrator can play using the audio haptic channels.
*
* <p>This is a positive value, or {@link Float#NaN NaN} if it's unknown. If this returns a
@@ -319,10 +262,7 @@
* @hide
*/
public float getHapticChannelMaximumAmplitude() {
- if (mHapticChannelMaxVibrationAmplitude <= 0) {
- return Float.NaN;
- }
- return mHapticChannelMaxVibrationAmplitude;
+ return getConfig().getHapticChannelMaximumAmplitude();
}
/**
diff --git a/core/java/android/os/VibratorInfo.java b/core/java/android/os/VibratorInfo.java
index 0a0e3c8..5271c4d 100644
--- a/core/java/android/os/VibratorInfo.java
+++ b/core/java/android/os/VibratorInfo.java
@@ -21,7 +21,6 @@
import android.annotation.Nullable;
import android.hardware.vibrator.Braking;
import android.hardware.vibrator.IVibrator;
-import android.util.Log;
import android.util.MathUtils;
import android.util.Range;
import android.util.SparseBooleanArray;
@@ -345,49 +344,31 @@
}
/**
- * Return a range of relative frequency values supported by the vibrator.
+ * Return a range of frequency values supported by the vibrator.
*
- * @return A range of relative frequency values supported. The range will always contain the
- * value 0, representing the device resonant frequency. Devices without frequency control will
- * return the range [0,0]. Devices with frequency control will always return a range containing
- * the safe range [-1, 1].
+ * @return A range of frequency values supported, in hertz. The range will always contain the
+ * device resonant frequency. Devices without frequency control will return null.
* @hide
*/
- public Range<Float> getFrequencyRange() {
- return mFrequencyMapping.mRelativeFrequencyRange;
+ @Nullable
+ public Range<Float> getFrequencyRangeHz() {
+ return mFrequencyMapping.mFrequencyRangeHz;
}
/**
- * Return the maximum amplitude the vibrator can play at given relative frequency.
+ * Return the maximum amplitude the vibrator can play at given frequency.
*
+ * @param frequencyHz The frequency, in hertz, for query.
+
* @return a value in [0,1] representing the maximum amplitude the device can play at given
- * relative frequency. Devices without frequency control will return 1 for the input zero
- * (resonant frequency), and 0 to any other input. Devices with frequency control will return
- * the supported value, for input in {@code #getFrequencyRange()}, and 0 for any other input.
+ * frequency. Devices without frequency control will return 0 to any input. Devices with
+ * frequency control will return the supported value, for input in
+ * {@link #getFrequencyRangeHz()}, and 0 for any other input.
* @hide
*/
@FloatRange(from = 0, to = 1)
- public float getMaxAmplitude(float relativeFrequency) {
- if (mFrequencyMapping.isEmpty()) {
- // The vibrator has not provided values for frequency mapping.
- // Return the expected behavior for devices without frequency control.
- return Float.compare(relativeFrequency, 0) == 0 ? 1 : 0;
- }
- return mFrequencyMapping.getMaxAmplitude(relativeFrequency);
- }
-
- /**
- * Return absolute frequency value for this vibrator, in hertz, that corresponds to given
- * relative frequency.
- *
- * @retur a value in hertz that corresponds to given relative frequency. Input values outside
- * {@link #getFrequencyRange()} will return {@link Float#NaN}. Devices without frequency control
- * will return {@link Float#NaN} for any input.
- * @hide
- */
- @FloatRange(from = 0)
- public float getAbsoluteFrequency(float relativeFrequency) {
- return mFrequencyMapping.toHertz(relativeFrequency);
+ public float getMaxAmplitude(float frequencyHz) {
+ return mFrequencyMapping.getMaxAmplitude(frequencyHz);
}
protected long getCapabilities() {
@@ -468,134 +449,96 @@
}
/**
- * Describes how frequency should be mapped to absolute values for a specific {@link Vibrator}.
+ * Describes the maximum relative output acceleration that can be achieved for each supported
+ * frequency in a specific vibrator.
*
* <p>This mapping is defined by the following parameters:
*
* <ol>
- * <li>{@code minFrequency}, {@code resonantFrequency} and {@code frequencyResolution}, in
- * hertz, provided by the vibrator.
+ * <li>{@code minFrequencyHz}, {@code resonantFrequencyHz} and {@code frequencyResolutionHz}
+ * provided by the vibrator in hertz.
* <li>{@code maxAmplitudes} a list of values in [0,1] provided by the vibrator, where
* {@code maxAmplitudes[i]} represents max supported amplitude at frequency
- * {@code minFrequency + frequencyResolution * i}.
- * <li>{@code maxFrequency = minFrequency + frequencyResolution * (maxAmplitudes.length-1)}
- * <li>{@code suggestedSafeRangeHz} is the suggested frequency range in hertz that should be
- * mapped to relative values -1 and 1, where 0 maps to {@code resonantFrequency}.
- * </ol>
- *
- * <p>The mapping is defined linearly by the following points:
- *
- * <ol>
- * <li>{@code toHertz(relativeMinFrequency) = minFrequency}
- * <li>{@code toHertz(-1) = resonantFrequency - safeRange / 2}
- * <li>{@code toHertz(0) = resonantFrequency}
- * <li>{@code toHertz(1) = resonantFrequency + safeRange / 2}
- * <li>{@code toHertz(relativeMaxFrequency) = maxFrequency}
+ * {@code minFrequencyHz + frequencyResolutionHz * i}.
+ * <li>{@code maxFrequencyHz = minFrequencyHz
+ * + frequencyResolutionHz * (maxAmplitudes.length-1)}
* </ol>
*
* @hide
*/
public static final class FrequencyMapping implements Parcelable {
+ @Nullable
+ private final Range<Float> mFrequencyRangeHz;
private final float mMinFrequencyHz;
private final float mResonantFrequencyHz;
private final float mFrequencyResolutionHz;
- private final float mSuggestedSafeRangeHz;
private final float[] mMaxAmplitudes;
- // Relative fields calculated from input values:
- private final Range<Float> mRelativeFrequencyRange;
-
FrequencyMapping(Parcel in) {
- this(in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat(),
- in.createFloatArray());
+ this(in.readFloat(), in.readFloat(), in.readFloat(), in.createFloatArray());
}
/**
* Default constructor.
*
- * @param minFrequencyHz Minimum supported frequency, in hertz.
* @param resonantFrequencyHz The vibrator resonant frequency, in hertz.
+ * @param minFrequencyHz Minimum supported frequency, in hertz.
* @param frequencyResolutionHz The frequency resolution, in hertz, used by the max
* amplitudes mapping.
- * @param suggestedSafeRangeHz The suggested range, in hertz, for the safe relative
- * frequency range represented by [-1, 1].
* @param maxAmplitudes The max amplitude supported by each supported frequency,
* starting at minimum frequency with jumps of frequency
* resolution.
* @hide
*/
- public FrequencyMapping(float minFrequencyHz, float resonantFrequencyHz,
- float frequencyResolutionHz, float suggestedSafeRangeHz, float[] maxAmplitudes) {
+ public FrequencyMapping(float resonantFrequencyHz, float minFrequencyHz,
+ float frequencyResolutionHz, float[] maxAmplitudes) {
mMinFrequencyHz = minFrequencyHz;
mResonantFrequencyHz = resonantFrequencyHz;
mFrequencyResolutionHz = frequencyResolutionHz;
- mSuggestedSafeRangeHz = suggestedSafeRangeHz;
mMaxAmplitudes = new float[maxAmplitudes == null ? 0 : maxAmplitudes.length];
if (maxAmplitudes != null) {
System.arraycopy(maxAmplitudes, 0, mMaxAmplitudes, 0, maxAmplitudes.length);
}
- float maxFrequencyHz =
- minFrequencyHz + frequencyResolutionHz * (mMaxAmplitudes.length - 1);
- if (Float.isNaN(resonantFrequencyHz) || Float.isNaN(minFrequencyHz)
- || Float.isNaN(frequencyResolutionHz) || Float.isNaN(suggestedSafeRangeHz)
- || resonantFrequencyHz < minFrequencyHz
- || resonantFrequencyHz > maxFrequencyHz) {
- // Some required fields are undefined or have bad values.
- // Leave this mapping empty.
- mRelativeFrequencyRange = Range.create(0f, 0f);
- return;
- }
+ // If any required field is undefined then leave this mapping empty.
+ boolean isValid = !Float.isNaN(resonantFrequencyHz)
+ && !Float.isNaN(minFrequencyHz)
+ && !Float.isNaN(frequencyResolutionHz)
+ && (mMaxAmplitudes.length > 0);
- // Calculate actual safe range, limiting the suggested one by the device supported range
- float safeDelta = MathUtils.min(
- suggestedSafeRangeHz / 2,
- resonantFrequencyHz - minFrequencyHz,
- maxFrequencyHz - resonantFrequencyHz);
- mRelativeFrequencyRange = Range.create(
- (minFrequencyHz - resonantFrequencyHz) / safeDelta,
- (maxFrequencyHz - resonantFrequencyHz) / safeDelta);
+ float maxFrequencyHz = isValid
+ ? minFrequencyHz + frequencyResolutionHz * (mMaxAmplitudes.length - 1)
+ : Float.NaN;
+
+ // If the non-empty mapping does not have min < resonant < max frequency respected
+ // then leave this mapping empty.
+ isValid &= !Float.isNaN(maxFrequencyHz)
+ && (resonantFrequencyHz >= minFrequencyHz)
+ && (resonantFrequencyHz <= maxFrequencyHz)
+ && (minFrequencyHz < maxFrequencyHz);
+
+ mFrequencyRangeHz = isValid ? Range.create(minFrequencyHz, maxFrequencyHz) : null;
}
/**
- * Returns true if this frequency mapping is empty, i.e. the only supported relative
- * frequency is 0 (resonant frequency).
+ * Returns true if this frequency mapping is empty, i.e. the only supported is the resonant
+ * frequency.
*/
public boolean isEmpty() {
- return Float.compare(mRelativeFrequencyRange.getLower(),
- mRelativeFrequencyRange.getUpper()) == 0;
+ return mFrequencyRangeHz == null;
}
/**
- * Returns the frequency value in hertz that is mapped to the given relative frequency.
+ * Returns the maximum relative amplitude the vibrator can reach while playing at the
+ * given frequency.
*
- * @return The mapped frequency, in hertz, or {@link Float#NaN} is value outside the device
- * supported range.
+ * @param frequencyHz frequency, in hertz, for query.
+ * @return A value in [0,1] representing the max relative amplitude supported at the given
+ * frequency. This will return 0 if the frequency is outside the supported range, or if the
+ * mapping is empty.
*/
- public float toHertz(float relativeFrequency) {
- if (!mRelativeFrequencyRange.contains(relativeFrequency)) {
- return Float.NaN;
- }
- float relativeMinFrequency = mRelativeFrequencyRange.getLower();
- if (Float.compare(relativeMinFrequency, 0) == 0) {
- // relative supported range is [0,0], so toHertz(0) should be the resonant frequency
- return mResonantFrequencyHz;
- }
- float shift = (mMinFrequencyHz - mResonantFrequencyHz) / relativeMinFrequency;
- return mResonantFrequencyHz + relativeFrequency * shift;
- }
-
- /**
- * Returns the maximum amplitude the vibrator can reach while playing at given relative
- * frequency.
- *
- * @return A value in [0,1] representing the max amplitude supported at given relative
- * frequency. This will return 0 if frequency is outside supported range, or if max
- * amplitude mapping is empty.
- */
- public float getMaxAmplitude(float relativeFrequency) {
- float frequencyHz = toHertz(relativeFrequency);
- if (Float.isNaN(frequencyHz)) {
+ public float getMaxAmplitude(float frequencyHz) {
+ if (isEmpty() || Float.isNaN(frequencyHz)) {
// Unsupported frequency requested, vibrator cannot play at this frequency.
return 0;
}
@@ -603,13 +546,6 @@
int floorIndex = (int) Math.floor(position);
int ceilIndex = (int) Math.ceil(position);
if (floorIndex < 0 || floorIndex >= mMaxAmplitudes.length) {
- if (mMaxAmplitudes.length > 0) {
- // This should never happen if the setup of relative frequencies was correct.
- Log.w(TAG, "Max amplitudes has " + mMaxAmplitudes.length
- + " entries and was expected to cover the frequency " + frequencyHz
- + " Hz when starting at min frequency of " + mMinFrequencyHz
- + " Hz with resolution of " + mFrequencyResolutionHz + " Hz.");
- }
return 0;
}
if (floorIndex != ceilIndex && ceilIndex < mMaxAmplitudes.length) {
@@ -621,10 +557,9 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeFloat(mMinFrequencyHz);
dest.writeFloat(mResonantFrequencyHz);
+ dest.writeFloat(mMinFrequencyHz);
dest.writeFloat(mFrequencyResolutionHz);
- dest.writeFloat(mSuggestedSafeRangeHz);
dest.writeFloatArray(mMaxAmplitudes);
}
@@ -645,14 +580,13 @@
return Float.compare(mMinFrequencyHz, that.mMinFrequencyHz) == 0
&& Float.compare(mResonantFrequencyHz, that.mResonantFrequencyHz) == 0
&& Float.compare(mFrequencyResolutionHz, that.mFrequencyResolutionHz) == 0
- && Float.compare(mSuggestedSafeRangeHz, that.mSuggestedSafeRangeHz) == 0
&& Arrays.equals(mMaxAmplitudes, that.mMaxAmplitudes);
}
@Override
public int hashCode() {
int hashCode = Objects.hash(mMinFrequencyHz, mFrequencyResolutionHz,
- mFrequencyResolutionHz, mSuggestedSafeRangeHz);
+ mFrequencyResolutionHz);
hashCode = 31 * hashCode + Arrays.hashCode(mMaxAmplitudes);
return hashCode;
}
@@ -660,13 +594,10 @@
@Override
public String toString() {
return "FrequencyMapping{"
- + "mRelativeFrequencyRange=" + mRelativeFrequencyRange
+ + "mFrequencyRange=" + mFrequencyRangeHz
+ ", mMinFrequency=" + mMinFrequencyHz
+ ", mResonantFrequency=" + mResonantFrequencyHz
- + ", mMaxFrequency="
- + (mMinFrequencyHz + mFrequencyResolutionHz * (mMaxAmplitudes.length - 1))
+ ", mFrequencyResolution=" + mFrequencyResolutionHz
- + ", mSuggestedSafeRange=" + mSuggestedSafeRangeHz
+ ", mMaxAmplitudes count=" + mMaxAmplitudes.length
+ '}';
}
@@ -699,7 +630,7 @@
private int mPwleSizeMax;
private float mQFactor = Float.NaN;
private FrequencyMapping mFrequencyMapping =
- new FrequencyMapping(Float.NaN, Float.NaN, Float.NaN, Float.NaN, null);
+ new FrequencyMapping(Float.NaN, Float.NaN, Float.NaN, null);
/** A builder class for a {@link VibratorInfo}. */
public Builder(int id) {
diff --git a/core/java/android/os/storage/StorageVolume.java b/core/java/android/os/storage/StorageVolume.java
index 19e04e6..8ee52c2 100644
--- a/core/java/android/os/storage/StorageVolume.java
+++ b/core/java/android/os/storage/StorageVolume.java
@@ -99,7 +99,7 @@
@UnsupportedAppUsage
private final boolean mRemovable;
private final boolean mEmulated;
- private final boolean mStub;
+ private final boolean mExternallyManaged;
private final boolean mAllowMassStorage;
private final long mMaxFileSize;
private final UserHandle mOwner;
@@ -138,7 +138,7 @@
/** {@hide} */
public StorageVolume(String id, File path, File internalPath, String description,
- boolean primary, boolean removable, boolean emulated, boolean stub,
+ boolean primary, boolean removable, boolean emulated, boolean externallyManaged,
boolean allowMassStorage, long maxFileSize, UserHandle owner, UUID uuid, String fsUuid,
String state) {
mId = Preconditions.checkNotNull(id);
@@ -148,7 +148,7 @@
mPrimary = primary;
mRemovable = removable;
mEmulated = emulated;
- mStub = stub;
+ mExternallyManaged = externallyManaged;
mAllowMassStorage = allowMassStorage;
mMaxFileSize = maxFileSize;
mOwner = Preconditions.checkNotNull(owner);
@@ -165,7 +165,7 @@
mPrimary = in.readInt() != 0;
mRemovable = in.readInt() != 0;
mEmulated = in.readInt() != 0;
- mStub = in.readInt() != 0;
+ mExternallyManaged = in.readInt() != 0;
mAllowMassStorage = in.readInt() != 0;
mMaxFileSize = in.readLong();
mOwner = in.readParcelable(null, android.os.UserHandle.class);
@@ -275,13 +275,13 @@
}
/**
- * Returns true if the volume is a stub volume (a volume managed from outside Android).
+ * Returns true if the volume is managed from outside Android.
*
* @hide
*/
@SystemApi
- public boolean isStub() {
- return mStub;
+ public boolean isExternallyManaged() {
+ return mExternallyManaged;
}
/**
@@ -520,7 +520,7 @@
pw.printPair("mPrimary", mPrimary);
pw.printPair("mRemovable", mRemovable);
pw.printPair("mEmulated", mEmulated);
- pw.printPair("mStub", mStub);
+ pw.printPair("mExternallyManaged", mExternallyManaged);
pw.printPair("mAllowMassStorage", mAllowMassStorage);
pw.printPair("mMaxFileSize", mMaxFileSize);
pw.printPair("mOwner", mOwner);
@@ -555,7 +555,7 @@
parcel.writeInt(mPrimary ? 1 : 0);
parcel.writeInt(mRemovable ? 1 : 0);
parcel.writeInt(mEmulated ? 1 : 0);
- parcel.writeInt(mStub ? 1 : 0);
+ parcel.writeInt(mExternallyManaged ? 1 : 0);
parcel.writeInt(mAllowMassStorage ? 1 : 0);
parcel.writeLong(mMaxFileSize);
parcel.writeParcelable(mOwner, flags);
@@ -637,7 +637,7 @@
mPrimary,
mRemovable,
mEmulated,
- /* stub= */ false,
+ /* externallyManaged= */ false,
/* allowMassStorage= */ false,
/* maxFileSize= */ 0,
mOwner,
diff --git a/core/java/android/os/storage/VolumeInfo.java b/core/java/android/os/storage/VolumeInfo.java
index ebd143c..84b6b5e 100644
--- a/core/java/android/os/storage/VolumeInfo.java
+++ b/core/java/android/os/storage/VolumeInfo.java
@@ -404,7 +404,7 @@
final boolean removable;
final boolean emulated;
- final boolean stub = type == TYPE_STUB;
+ final boolean externallyManaged = type == TYPE_STUB;
final boolean allowMassStorage = false;
final String envState = reportUnmounted
? Environment.MEDIA_UNMOUNTED : getEnvironmentForState(state);
@@ -460,8 +460,8 @@
}
return new StorageVolume(id, userPath, internalPath, description, isPrimary(), removable,
- emulated, stub, allowMassStorage, maxFileSize, new UserHandle(userId), uuid,
- derivedFsUuid, envState);
+ emulated, externallyManaged, allowMassStorage, maxFileSize, new UserHandle(userId),
+ uuid, derivedFsUuid, envState);
}
@UnsupportedAppUsage
diff --git a/core/java/android/os/storage/VolumeRecord.java b/core/java/android/os/storage/VolumeRecord.java
index eac09aa..1e5cdd7 100644
--- a/core/java/android/os/storage/VolumeRecord.java
+++ b/core/java/android/os/storage/VolumeRecord.java
@@ -105,7 +105,7 @@
final boolean primary = false;
final boolean removable = true;
final boolean emulated = false;
- final boolean stub = false;
+ final boolean externallyManaged = false;
final boolean allowMassStorage = false;
final long maxFileSize = 0;
final UserHandle user = new UserHandle(UserHandle.USER_NULL);
@@ -117,8 +117,8 @@
}
return new StorageVolume(id, userPath, internalPath, description, primary, removable,
- emulated, stub, allowMassStorage, maxFileSize, user, null /* uuid */, fsUuid,
- envState);
+ emulated, externallyManaged, allowMassStorage, maxFileSize, user, null /* uuid */,
+ fsUuid, envState);
}
public void dump(IndentingPrintWriter pw) {
diff --git a/core/java/android/os/vibrator/RampSegment.java b/core/java/android/os/vibrator/RampSegment.java
index 3ec5636..9e1f636 100644
--- a/core/java/android/os/vibrator/RampSegment.java
+++ b/core/java/android/os/vibrator/RampSegment.java
@@ -29,14 +29,20 @@
* Representation of {@link VibrationEffectSegment} that ramps vibration amplitude and/or frequency
* for a specified duration.
*
+ * <p>The amplitudes are expressed by float values in the range [0, 1], representing the relative
+ * output acceleration for the vibrator. The frequencies are expressed in hertz by positive finite
+ * float values. The special value zero is used here for an unspecified frequency, and will be
+ * automatically mapped to the device's default vibration frequency (usually the resonant
+ * frequency).
+ *
* @hide
*/
@TestApi
public final class RampSegment extends VibrationEffectSegment {
private final float mStartAmplitude;
- private final float mStartFrequency;
+ private final float mStartFrequencyHz;
private final float mEndAmplitude;
- private final float mEndFrequency;
+ private final float mEndFrequencyHz;
private final int mDuration;
RampSegment(@NonNull Parcel in) {
@@ -44,12 +50,12 @@
}
/** @hide */
- public RampSegment(float startAmplitude, float endAmplitude, float startFrequency,
- float endFrequency, int duration) {
+ public RampSegment(float startAmplitude, float endAmplitude, float startFrequencyHz,
+ float endFrequencyHz, int duration) {
mStartAmplitude = startAmplitude;
mEndAmplitude = endAmplitude;
- mStartFrequency = startFrequency;
- mEndFrequency = endFrequency;
+ mStartFrequencyHz = startFrequencyHz;
+ mEndFrequencyHz = endFrequencyHz;
mDuration = duration;
}
@@ -61,8 +67,8 @@
RampSegment other = (RampSegment) o;
return Float.compare(mStartAmplitude, other.mStartAmplitude) == 0
&& Float.compare(mEndAmplitude, other.mEndAmplitude) == 0
- && Float.compare(mStartFrequency, other.mStartFrequency) == 0
- && Float.compare(mEndFrequency, other.mEndFrequency) == 0
+ && Float.compare(mStartFrequencyHz, other.mStartFrequencyHz) == 0
+ && Float.compare(mEndFrequencyHz, other.mEndFrequencyHz) == 0
&& mDuration == other.mDuration;
}
@@ -74,12 +80,12 @@
return mEndAmplitude;
}
- public float getStartFrequency() {
- return mStartFrequency;
+ public float getStartFrequencyHz() {
+ return mStartFrequencyHz;
}
- public float getEndFrequency() {
- return mEndFrequency;
+ public float getEndFrequencyHz() {
+ return mEndFrequencyHz;
}
@Override
@@ -102,6 +108,12 @@
/** @hide */
@Override
public void validate() {
+ Preconditions.checkArgumentNonNegative(mStartFrequencyHz,
+ "Frequencies must all be >= 0, got start frequency of " + mStartFrequencyHz);
+ Preconditions.checkArgumentFinite(mStartFrequencyHz, "startFrequencyHz");
+ Preconditions.checkArgumentNonNegative(mEndFrequencyHz,
+ "Frequencies must all be >= 0, got end frequency of " + mEndFrequencyHz);
+ Preconditions.checkArgumentFinite(mEndFrequencyHz, "endFrequencyHz");
Preconditions.checkArgumentNonnegative(mDuration,
"Durations must all be >= 0, got " + mDuration);
Preconditions.checkArgumentInRange(mStartAmplitude, 0f, 1f, "startAmplitude");
@@ -126,7 +138,8 @@
&& Float.compare(mEndAmplitude, newEndAmplitude) == 0) {
return this;
}
- return new RampSegment(newStartAmplitude, newEndAmplitude, mStartFrequency, mEndFrequency,
+ return new RampSegment(newStartAmplitude, newEndAmplitude, mStartFrequencyHz,
+ mEndFrequencyHz,
mDuration);
}
@@ -139,7 +152,7 @@
@Override
public int hashCode() {
- return Objects.hash(mStartAmplitude, mEndAmplitude, mStartFrequency, mEndFrequency,
+ return Objects.hash(mStartAmplitude, mEndAmplitude, mStartFrequencyHz, mEndFrequencyHz,
mDuration);
}
@@ -147,8 +160,8 @@
public String toString() {
return "Ramp{startAmplitude=" + mStartAmplitude
+ ", endAmplitude=" + mEndAmplitude
- + ", startFrequency=" + mStartFrequency
- + ", endFrequency=" + mEndFrequency
+ + ", startFrequencyHz=" + mStartFrequencyHz
+ + ", endFrequencyHz=" + mEndFrequencyHz
+ ", duration=" + mDuration
+ "}";
}
@@ -163,8 +176,8 @@
out.writeInt(PARCEL_TOKEN_RAMP);
out.writeFloat(mStartAmplitude);
out.writeFloat(mEndAmplitude);
- out.writeFloat(mStartFrequency);
- out.writeFloat(mEndFrequency);
+ out.writeFloat(mStartFrequencyHz);
+ out.writeFloat(mEndFrequencyHz);
out.writeInt(mDuration);
}
diff --git a/core/java/android/os/vibrator/StepSegment.java b/core/java/android/os/vibrator/StepSegment.java
index 69a381f..c679511 100644
--- a/core/java/android/os/vibrator/StepSegment.java
+++ b/core/java/android/os/vibrator/StepSegment.java
@@ -30,12 +30,18 @@
* Representation of {@link VibrationEffectSegment} that holds a fixed vibration amplitude and
* frequency for a specified duration.
*
+ * <p>The amplitude is expressed by a float value in the range [0, 1], representing the relative
+ * output acceleration for the vibrator. The frequency is expressed in hertz by a positive finite
+ * float value. The special value zero is used here for an unspecified frequency, and will be
+ * automatically mapped to the device's default vibration frequency (usually the resonant
+ * frequency).
+ *
* @hide
*/
@TestApi
public final class StepSegment extends VibrationEffectSegment {
private final float mAmplitude;
- private final float mFrequency;
+ private final float mFrequencyHz;
private final int mDuration;
StepSegment(@NonNull Parcel in) {
@@ -43,9 +49,9 @@
}
/** @hide */
- public StepSegment(float amplitude, float frequency, int duration) {
+ public StepSegment(float amplitude, float frequencyHz, int duration) {
mAmplitude = amplitude;
- mFrequency = frequency;
+ mFrequencyHz = frequencyHz;
mDuration = duration;
}
@@ -56,7 +62,7 @@
}
StepSegment other = (StepSegment) o;
return Float.compare(mAmplitude, other.mAmplitude) == 0
- && Float.compare(mFrequency, other.mFrequency) == 0
+ && Float.compare(mFrequencyHz, other.mFrequencyHz) == 0
&& mDuration == other.mDuration;
}
@@ -64,8 +70,8 @@
return mAmplitude;
}
- public float getFrequency() {
- return mFrequency;
+ public float getFrequencyHz() {
+ return mFrequencyHz;
}
@Override
@@ -89,6 +95,9 @@
/** @hide */
@Override
public void validate() {
+ Preconditions.checkArgumentNonNegative(mFrequencyHz,
+ "Frequencies must all be >= 0, got " + mFrequencyHz);
+ Preconditions.checkArgumentFinite(mFrequencyHz, "frequencyHz");
Preconditions.checkArgumentNonnegative(mDuration,
"Durations must all be >= 0, got " + mDuration);
if (Float.compare(mAmplitude, VibrationEffect.DEFAULT_AMPLITUDE) != 0) {
@@ -108,7 +117,8 @@
if (Float.compare(mAmplitude, VibrationEffect.DEFAULT_AMPLITUDE) != 0) {
return this;
}
- return new StepSegment((float) defaultAmplitude / VibrationEffect.MAX_AMPLITUDE, mFrequency,
+ return new StepSegment((float) defaultAmplitude / VibrationEffect.MAX_AMPLITUDE,
+ mFrequencyHz,
mDuration);
}
@@ -119,7 +129,7 @@
if (Float.compare(mAmplitude, VibrationEffect.DEFAULT_AMPLITUDE) == 0) {
return this;
}
- return new StepSegment(VibrationEffect.scale(mAmplitude, scaleFactor), mFrequency,
+ return new StepSegment(VibrationEffect.scale(mAmplitude, scaleFactor), mFrequencyHz,
mDuration);
}
@@ -132,13 +142,13 @@
@Override
public int hashCode() {
- return Objects.hash(mAmplitude, mFrequency, mDuration);
+ return Objects.hash(mAmplitude, mFrequencyHz, mDuration);
}
@Override
public String toString() {
return "Step{amplitude=" + mAmplitude
- + ", frequency=" + mFrequency
+ + ", frequencyHz=" + mFrequencyHz
+ ", duration=" + mDuration
+ "}";
}
@@ -152,7 +162,7 @@
public void writeToParcel(@NonNull Parcel out, int flags) {
out.writeInt(PARCEL_TOKEN_STEP);
out.writeFloat(mAmplitude);
- out.writeFloat(mFrequency);
+ out.writeFloat(mFrequencyHz);
out.writeInt(mDuration);
}
diff --git a/core/java/android/os/vibrator/VibrationConfig.java b/core/java/android/os/vibrator/VibrationConfig.java
new file mode 100644
index 0000000..4a61472
--- /dev/null
+++ b/core/java/android/os/vibrator/VibrationConfig.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os.vibrator;
+
+import static android.os.VibrationAttributes.USAGE_ACCESSIBILITY;
+import static android.os.VibrationAttributes.USAGE_ALARM;
+import static android.os.VibrationAttributes.USAGE_COMMUNICATION_REQUEST;
+import static android.os.VibrationAttributes.USAGE_HARDWARE_FEEDBACK;
+import static android.os.VibrationAttributes.USAGE_MEDIA;
+import static android.os.VibrationAttributes.USAGE_NOTIFICATION;
+import static android.os.VibrationAttributes.USAGE_PHYSICAL_EMULATION;
+import static android.os.VibrationAttributes.USAGE_RINGTONE;
+import static android.os.VibrationAttributes.USAGE_TOUCH;
+import static android.os.VibrationAttributes.USAGE_UNKNOWN;
+
+import android.annotation.Nullable;
+import android.content.res.Resources;
+import android.os.VibrationAttributes;
+import android.os.Vibrator;
+import android.os.Vibrator.VibrationIntensity;
+
+/**
+ * List of device-specific internal vibration configuration loaded from platform config.xml.
+ *
+ * <p>This should not be public, but some individual values are exposed by {@link Vibrator} by
+ * hidden methods, made available to Settings, SysUI and other platform client code. They can also
+ * be individually exposed with the necessary permissions by the {@link Vibrator} service.
+ *
+ * @hide
+ */
+public class VibrationConfig {
+
+ // TODO(b/191150049): move these to vibrator static config file
+ private final float mHapticChannelMaxVibrationAmplitude;
+ private final int mRampStepDurationMs;
+ private final int mRampDownDurationMs;
+
+ @VibrationIntensity
+ private final int mDefaultAlarmVibrationIntensity;
+ @VibrationIntensity
+ private final int mDefaultHapticFeedbackIntensity;
+ @VibrationIntensity
+ private final int mDefaultMediaVibrationIntensity;
+ @VibrationIntensity
+ private final int mDefaultNotificationVibrationIntensity;
+ @VibrationIntensity
+ private final int mDefaultRingVibrationIntensity;
+
+ /** @hide */
+ public VibrationConfig(@Nullable Resources resources) {
+ mHapticChannelMaxVibrationAmplitude = loadFloat(resources,
+ com.android.internal.R.dimen.config_hapticChannelMaxVibrationAmplitude, 0);
+ mRampDownDurationMs = loadInteger(resources,
+ com.android.internal.R.integer.config_vibrationWaveformRampDownDuration, 0);
+ mRampStepDurationMs = loadInteger(resources,
+ com.android.internal.R.integer.config_vibrationWaveformRampStepDuration, 0);
+
+ mDefaultAlarmVibrationIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultAlarmVibrationIntensity);
+ mDefaultHapticFeedbackIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultHapticFeedbackIntensity);
+ mDefaultMediaVibrationIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultMediaVibrationIntensity);
+ mDefaultNotificationVibrationIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultNotificationVibrationIntensity);
+ mDefaultRingVibrationIntensity = loadDefaultIntensity(resources,
+ com.android.internal.R.integer.config_defaultRingVibrationIntensity);
+ }
+
+ @VibrationIntensity
+ private static int loadDefaultIntensity(@Nullable Resources res, int resId) {
+ int defaultIntensity = Vibrator.VIBRATION_INTENSITY_MEDIUM;
+ int value = loadInteger(res, resId, defaultIntensity);
+ if (value < Vibrator.VIBRATION_INTENSITY_OFF || value > Vibrator.VIBRATION_INTENSITY_HIGH) {
+ return defaultIntensity;
+ }
+ return value;
+ }
+
+ private static float loadFloat(@Nullable Resources res, int resId, float defaultValue) {
+ return res != null ? res.getFloat(resId) : defaultValue;
+ }
+
+ private static int loadInteger(@Nullable Resources res, int resId, int defaultValue) {
+ return res != null ? res.getInteger(resId) : defaultValue;
+ }
+
+ /**
+ * Return the maximum amplitude the vibrator can play using the audio haptic channels.
+ *
+ * @return a positive value representing the maximum absolute value the device can play signals
+ * from audio haptic channels, or {@link Float#NaN NaN} if it's unknown.
+ */
+ public float getHapticChannelMaximumAmplitude() {
+ if (mHapticChannelMaxVibrationAmplitude <= 0) {
+ return Float.NaN;
+ }
+ return mHapticChannelMaxVibrationAmplitude;
+ }
+
+ /**
+ * The duration, in milliseconds, that should be applied to the ramp to turn off the vibrator
+ * when a vibration is cancelled or finished at non-zero amplitude.
+ */
+ public int getRampDownDurationMs() {
+ if (mRampDownDurationMs < 0) {
+ return 0;
+ }
+ return mRampDownDurationMs;
+ }
+
+ /**
+ * The duration, in milliseconds, that should be applied to convert vibration effect's
+ * {@link android.os.vibrator.RampSegment} to a {@link android.os.vibrator.StepSegment} on
+ * devices without PWLE support.
+ */
+ public int getRampStepDurationMs() {
+ if (mRampStepDurationMs < 0) {
+ return 0;
+ }
+ return mRampStepDurationMs;
+ }
+
+ /** Get the default vibration intensity for given usage. */
+ @VibrationIntensity
+ public int getDefaultVibrationIntensity(@VibrationAttributes.Usage int usage) {
+ switch (usage) {
+ case USAGE_ALARM:
+ return mDefaultAlarmVibrationIntensity;
+ case USAGE_NOTIFICATION:
+ case USAGE_COMMUNICATION_REQUEST:
+ return mDefaultNotificationVibrationIntensity;
+ case USAGE_RINGTONE:
+ return mDefaultRingVibrationIntensity;
+ case USAGE_TOUCH:
+ case USAGE_HARDWARE_FEEDBACK:
+ case USAGE_PHYSICAL_EMULATION:
+ case USAGE_ACCESSIBILITY:
+ return mDefaultHapticFeedbackIntensity;
+ case USAGE_MEDIA:
+ case USAGE_UNKNOWN:
+ // fall through
+ default:
+ return mDefaultMediaVibrationIntensity;
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "VibrationConfig{"
+ + "mHapticChannelMaxVibrationAmplitude=" + mHapticChannelMaxVibrationAmplitude
+ + ", mRampStepDurationMs=" + mRampStepDurationMs
+ + ", mRampDownDurationMs=" + mRampDownDurationMs
+ + ", mDefaultAlarmIntensity=" + mDefaultAlarmVibrationIntensity
+ + ", mDefaultHapticFeedbackIntensity=" + mDefaultHapticFeedbackIntensity
+ + ", mDefaultMediaIntensity=" + mDefaultMediaVibrationIntensity
+ + ", mDefaultNotificationIntensity=" + mDefaultNotificationVibrationIntensity
+ + ", mDefaultRingIntensity=" + mDefaultRingVibrationIntensity
+ + "}";
+ }
+}
diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl
index 4a94c32..90b5e51 100644
--- a/core/java/android/permission/IPermissionManager.aidl
+++ b/core/java/android/permission/IPermissionManager.aidl
@@ -67,6 +67,8 @@
void revokeRuntimePermission(String packageName, String permissionName, int userId,
String reason);
+ void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId);
+
boolean shouldShowRequestPermissionRationale(String packageName, String permissionName,
int userId);
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index 3ea50e9..4f22876 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -1362,6 +1362,26 @@
return false;
}
+ /**
+ * Revoke the POST_NOTIFICATIONS permission, without killing the app. This method must ONLY BE
+ * USED in CTS or local tests.
+ *
+ * @param packageName The package to be revoked
+ * @param userId The user for which to revoke
+ *
+ * @hide
+ */
+ @TestApi
+ public void revokePostNotificationPermissionWithoutKillForTest(@NonNull String packageName,
+ int userId) {
+ try {
+ mPermissionManager.revokePostNotificationPermissionWithoutKillForTest(packageName,
+ userId);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
/* @hide */
private static int checkPermissionUncached(@Nullable String permission, int pid, int uid) {
final IActivityManager am = ActivityManager.getService();
diff --git a/core/java/android/print/PrintJobInfo.java b/core/java/android/print/PrintJobInfo.java
index 9bdfd8e..9d0c8d8 100644
--- a/core/java/android/print/PrintJobInfo.java
+++ b/core/java/android/print/PrintJobInfo.java
@@ -240,7 +240,7 @@
mTag = parcel.readString();
mCreationTime = parcel.readLong();
mCopies = parcel.readInt();
- Parcelable[] parcelables = parcel.readParcelableArray(null);
+ Parcelable[] parcelables = parcel.readParcelableArray(null, PageRange.class);
if (parcelables != null) {
mPageRanges = new PageRange[parcelables.length];
for (int i = 0; i < parcelables.length; i++) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 55ffdab..72e2863 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4603,6 +4603,43 @@
public static final String VIBRATE_INPUT_DEVICES = "vibrate_input_devices";
/**
+ * The intensity of alarm vibrations, if configurable.
+ *
+ * Not all devices are capable of changing their vibration intensity; on these devices
+ * there will likely be no difference between the various vibration intensities except for
+ * intensity 0 (off) and the rest.
+ *
+ * <b>Values:</b><br/>
+ * 0 - Vibration is disabled<br/>
+ * 1 - Weak vibrations<br/>
+ * 2 - Medium vibrations<br/>
+ * 3 - Strong vibrations
+ * @hide
+ */
+ public static final String ALARM_VIBRATION_INTENSITY =
+ "alarm_vibration_intensity";
+
+ /**
+ * The intensity of media vibrations, if configurable.
+ *
+ * This includes any vibration that is part of media, such as music, movie, soundtrack,
+ * game or animations.
+ *
+ * Not all devices are capable of changing their vibration intensity; on these devices
+ * there will likely be no difference between the various vibration intensities except for
+ * intensity 0 (off) and the rest.
+ *
+ * <b>Values:</b><br/>
+ * 0 - Vibration is disabled<br/>
+ * 1 - Weak vibrations<br/>
+ * 2 - Medium vibrations<br/>
+ * 3 - Strong vibrations
+ * @hide
+ */
+ public static final String MEDIA_VIBRATION_INTENSITY =
+ "media_vibration_intensity";
+
+ /**
* The intensity of notification vibrations, if configurable.
*
* Not all devices are capable of changing their vibration intensity; on these devices
@@ -4619,6 +4656,7 @@
@Readable
public static final String NOTIFICATION_VIBRATION_INTENSITY =
"notification_vibration_intensity";
+
/**
* The intensity of ringtone vibrations, if configurable.
*
@@ -4670,7 +4708,6 @@
* 3 - Strong vibrations
* @hide
*/
- @Readable
public static final String HARDWARE_HAPTIC_FEEDBACK_INTENSITY =
"hardware_haptic_feedback_intensity";
@@ -9949,6 +9986,7 @@
*
* @hide
*/
+ @Readable
public static final String NOTIFICATION_PERMISSION_ENABLED =
"notification_permission_enabled";
@@ -10111,6 +10149,29 @@
* category, formatted as a serialized {@link org.json.JSONObject}. If there is no
* corresponding package included for a category, then all overlay packages in that
* category must be disabled.
+ *
+ * A few category keys have special meaning and are used for Material You theming.
+ *
+ * A {@code FabricatedOverlay} containing Material You tonal palettes will be generated
+ * in case {@code android.theme.customization.system_palette} contains a
+ * {@link android.annotation.ColorInt}.
+ *
+ * The strategy used for generating the tonal palettes can be defined with the
+ * {@code android.theme.customization.theme_style} key, with one of the following options:
+ * <ul>
+ * <li> TONAL_SPOT = Default Material You theme since Android S.</li>
+ * <li> VIBRANT = Theme where accent 2 and 3 are analogous to accent 1.</li>
+ * <li> EXPRESSIVE = Highly chromatic theme.</li>
+ * <li> SPRITZ = Desaturated theme, almost greyscale.</li>
+ * </ul>
+ *
+ * Example of valid fabricated theme specification:
+ * <pre>
+ * {
+ * "android.theme.customization.system_palette":"B1611C",
+ * "android.theme.customization.theme_style":"EXPRESSIVE"
+ * }
+ * </pre>
* @hide
*/
@SystemApi
@@ -10248,6 +10309,13 @@
public static final int ACCESSIBILITY_MAGNIFICATION_MODE_ALL = 0x3;
/**
+ * Whether the following typing focus feature for magnification is enabled.
+ * @hide
+ */
+ public static final String ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED =
+ "accessibility_magnification_follow_typing_enabled";
+
+ /**
* Controls magnification capability. Accessibility magnification is capable of at least one
* of the magnification modes.
*
diff --git a/core/java/android/service/dreams/DreamOverlayService.java b/core/java/android/service/dreams/DreamOverlayService.java
index 50f9d8a..163d6ed 100644
--- a/core/java/android/service/dreams/DreamOverlayService.java
+++ b/core/java/android/service/dreams/DreamOverlayService.java
@@ -35,6 +35,7 @@
public abstract class DreamOverlayService extends Service {
private static final String TAG = "DreamOverlayService";
private static final boolean DEBUG = false;
+ private boolean mShowComplications;
private IDreamOverlay mDreamOverlay = new IDreamOverlay.Stub() {
@Override
@@ -53,6 +54,8 @@
@Nullable
@Override
public final IBinder onBind(@NonNull Intent intent) {
+ mShowComplications = intent.getBooleanExtra(DreamService.EXTRA_SHOW_COMPLICATIONS,
+ DreamService.DEFAULT_SHOW_COMPLICATIONS);
return mDreamOverlay.asBinder();
}
@@ -74,4 +77,11 @@
Log.e(TAG, "Could not request exit:" + e);
}
}
+
+ /**
+ * Returns whether to show complications on the dream overlay.
+ */
+ public final boolean shouldShowComplications() {
+ return mShowComplications;
+ }
}
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 4ae3d7d..133e384 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -189,6 +189,19 @@
*/
public static final String DREAM_META_DATA = "android.service.dream";
+ /**
+ * Extra containing a boolean for whether to show complications on the overlay.
+ * @hide
+ */
+ public static final String EXTRA_SHOW_COMPLICATIONS =
+ "android.service.dreams.SHOW_COMPLICATIONS";
+
+ /**
+ * The default value for whether to show complications on the overlay.
+ * @hide
+ */
+ public static final boolean DEFAULT_SHOW_COMPLICATIONS = true;
+
private final IDreamManager mDreamManager;
private final Handler mHandler = new Handler(Looper.getMainLooper());
private IBinder mDreamToken;
diff --git a/core/java/android/service/games/GameService.java b/core/java/android/service/games/GameService.java
index b79c055..577b5e1 100644
--- a/core/java/android/service/games/GameService.java
+++ b/core/java/android/service/games/GameService.java
@@ -38,10 +38,23 @@
* when a game session should begin. It is always kept running by the system.
* Because of this it should be kept as lightweight as possible.
*
- * Heavy weight operations (such as showing UI) should be implemented in the
+ * <p>Heavyweight operations (such as showing UI) should be implemented in the
* associated {@link GameSessionService} when a game session is taking place. Its
* implementation should run in a separate process from the {@link GameService}.
*
+ * <p>To extend this class, you must declare the service in your manifest file with
+ * the {@link android.Manifest.permission#BIND_GAME_SERVICE} permission
+ * and include an intent filter with the {@link #SERVICE_INTERFACE} action. For example:
+ * <pre>
+ * <service android:name=".GameService"
+ * android:label="@string/service_name"
+ * android:permission="android.permission.BIND_GAME_SERVICE">
+ * <intent-filter>
+ * <action android:name="android.service.games.GameService" />
+ * </intent-filter>
+ * </service>
+ * </pre>
+ *
* @hide
*/
@SystemApi
diff --git a/core/java/android/view/BatchedInputEventReceiver.java b/core/java/android/view/BatchedInputEventReceiver.java
index af76cb9..1ed12f7 100644
--- a/core/java/android/view/BatchedInputEventReceiver.java
+++ b/core/java/android/view/BatchedInputEventReceiver.java
@@ -66,7 +66,12 @@
* @hide
*/
public void setBatchingEnabled(boolean batchingEnabled) {
+ if (mBatchingEnabled == batchingEnabled) {
+ return;
+ }
+
mBatchingEnabled = batchingEnabled;
+ mHandler.removeCallbacks(mConsumeBatchedInputEvents);
if (!batchingEnabled) {
unscheduleBatchedInput();
mHandler.post(mConsumeBatchedInputEvents);
diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS
index 2b5e286..d160be5 100644
--- a/core/java/android/view/OWNERS
+++ b/core/java/android/view/OWNERS
@@ -29,6 +29,13 @@
per-file MotionEvent.java = file:/services/core/java/com/android/server/input/OWNERS
per-file PointerIcon.java = file:/services/core/java/com/android/server/input/OWNERS
per-file SimulatedDpad.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file BatchedInputEventReceiver.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file DragEvent.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file DragEvent.aidl = file:/services/core/java/com/android/server/input/OWNERS
+per-file GestureDetector.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file ScaleGestureDetector.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file KeyboardShortcut*.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file KeyCharacterMap.java = file:/services/core/java/com/android/server/input/OWNERS
# InputWindowHandle
per-file InputWindowHandle.java = file:/services/core/java/com/android/server/input/OWNERS
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index ab33fea..b7f9be7 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -231,6 +231,7 @@
float shadowRadius);
private static native void nativeSetGlobalShadowSettings(@Size(4) float[] ambientColor,
@Size(4) float[] spotColor, float lightPosY, float lightPosZ, float lightRadius);
+ private static native boolean nativeGetDisplayDecorationSupport(IBinder displayToken);
private static native void nativeSetFrameRate(long transactionObj, long nativeObject,
float frameRate, int compatibility, int changeFrameRateStrategy);
@@ -2651,6 +2652,20 @@
}
/**
+ * Returns whether a display supports DISPLAY_DECORATION.
+ *
+ * @param displayToken
+ * The token for the display.
+ *
+ * @return Whether the display supports DISPLAY_DECORATION.
+ *
+ * @hide
+ */
+ public static boolean getDisplayDecorationSupport(IBinder displayToken) {
+ return nativeGetDisplayDecorationSupport(displayToken);
+ }
+
+ /**
* Adds a callback to be informed about SF's jank classification for a specific surface.
* @hide
*/
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 258359e..2307a03 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -15012,8 +15012,10 @@
/**
* @return true if this view and all ancestors are visible as of the last
* {@link #onVisibilityAggregated(boolean)} call.
+ *
+ * @hide
*/
- boolean isAggregatedVisible() {
+ public boolean isAggregatedVisible() {
return (mPrivateFlags3 & PFLAG3_AGGREGATED_VISIBLE) != 0;
}
diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
index 36e779a..540f5dc 100644
--- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
@@ -84,6 +84,12 @@
*/
public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5;
+ /**
+ * Window type: A system window used to show the UI for the interaction with
+ * window-based magnification, which includes the magnified content and the option menu.
+ */
+ public static final int TYPE_MAGNIFICATION_OVERLAY = 6;
+
/* Special values for window IDs */
/** @hide */
public static final int ACTIVE_WINDOW_ID = Integer.MAX_VALUE;
@@ -801,6 +807,9 @@
case TYPE_SPLIT_SCREEN_DIVIDER: {
return "TYPE_SPLIT_SCREEN_DIVIDER";
}
+ case TYPE_MAGNIFICATION_OVERLAY: {
+ return "TYPE_MAGNIFICATION_OVERLAY";
+ }
default:
return "<UNKNOWN:" + type + ">";
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 6d58ee2..b21d08c 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -6628,6 +6628,7 @@
opts = ActivityOptions.makeBasic();
opts.setPendingIntentLaunchFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
+ opts.setLaunchDisplayId(view.getDisplay().getDisplayId());
return Pair.create(intent, opts);
}
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 0143401..67a2715 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -10636,8 +10636,8 @@
return;
}
- if ((mMarquee == null || mMarquee.isStopped()) && (isFocused() || isSelected())
- && getLineCount() == 1 && canMarquee()) {
+ if ((mMarquee == null || mMarquee.isStopped()) && isAggregatedVisible()
+ && (isFocused() || isSelected()) && getLineCount() == 1 && canMarquee()) {
if (mMarqueeFadeMode == MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS) {
mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_FADE;
@@ -11096,6 +11096,12 @@
}
}
+ @Override
+ public void onVisibilityAggregated(boolean isVisible) {
+ super.onVisibilityAggregated(isVisible);
+ startStopMarquee(isVisible);
+ }
+
/**
* Use {@link BaseInputConnection#removeComposingSpans
* BaseInputConnection.removeComposingSpans()} to remove any IME composing
@@ -13749,7 +13755,8 @@
mChoreographer.removeFrameCallback(mTickCallback);
final TextView textView = mView.get();
- if (textView != null && (textView.isFocused() || textView.isSelected())) {
+ if (textView != null && textView.isAggregatedVisible()
+ && (textView.isFocused() || textView.isSelected())) {
long currentMs = mChoreographer.getFrameTime();
long deltaMs = currentMs - mLastAnimationMs;
mLastAnimationMs = currentMs;
diff --git a/core/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.java b/core/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.java
index 733c0af..0130ef4 100644
--- a/core/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.java
+++ b/core/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.java
@@ -190,7 +190,7 @@
mResInstanceState = source.readInt();
mPresentityUri = source.readString();
Parcelable[] tempParcelableArray = source.readParcelableArray(
- PresTupleInfo.class.getClassLoader());
+ PresTupleInfo.class.getClassLoader(), PresTupleInfo.class);
mTupleInfoArray = new PresTupleInfo[] {};
if(tempParcelableArray != null) {
mTupleInfoArray = Arrays.copyOf(tempParcelableArray, tempParcelableArray.length,
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 025f711..be7388b 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -759,11 +759,11 @@
}
try {
- IBinder permissionToken = ActivityTaskManager.getService()
- .requestStartActivityPermissionToken(getActivityToken());
Intent delegationIntent = new Intent();
final ComponentName delegateActivity = ComponentName.unflattenFromString(
Resources.getSystem().getString(R.string.config_chooserActivity));
+ IBinder permissionToken = ActivityTaskManager.getService()
+ .requestStartActivityPermissionToken(delegateActivity);
delegationIntent.setComponent(delegateActivity);
delegationIntent.putExtra(Intent.EXTRA_INTENT, getIntent());
delegationIntent.putExtra(ActivityTaskManager.EXTRA_PERMISSION_TOKEN, permissionToken);
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index b273f6d..f9a8c7b 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -1437,11 +1437,11 @@
try {
// TODO: Once this is a small springboard activity, it can move off the UI process
// and we can move the request method to ActivityManagerInternal.
- IBinder permissionToken = ActivityTaskManager.getService()
- .requestStartActivityPermissionToken(getActivityToken());
final Intent chooserIntent = new Intent();
final ComponentName delegateActivity = ComponentName.unflattenFromString(
Resources.getSystem().getString(R.string.config_chooserActivity));
+ IBinder permissionToken = ActivityTaskManager.getService()
+ .requestStartActivityPermissionToken(delegateActivity);
chooserIntent.setClassName(delegateActivity.getPackageName(),
delegateActivity.getClassName());
chooserIntent.putExtra(ActivityTaskManager.EXTRA_PERMISSION_TOKEN, permissionToken);
diff --git a/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java b/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
index 289daee..301de2d 100644
--- a/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
+++ b/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
@@ -239,7 +239,8 @@
mExtendedInfo = in.readCharSequence();
mResolvedIntent = in.readParcelable(null /* ClassLoader */, android.content.Intent.class);
mSourceIntents.addAll(
- Arrays.asList((Intent[]) in.readParcelableArray(null /* ClassLoader */)));
+ Arrays.asList((Intent[]) in.readParcelableArray(null /* ClassLoader */,
+ Intent.class)));
mIsSuspended = in.readBoolean();
mPinned = in.readBoolean();
mResolveInfo = in.readParcelable(null /* ClassLoader */, android.content.pm.ResolveInfo.class);
diff --git a/core/java/com/android/internal/infra/AndroidFuture.java b/core/java/com/android/internal/infra/AndroidFuture.java
index 84391c1..0443ad0 100644
--- a/core/java/com/android/internal/infra/AndroidFuture.java
+++ b/core/java/com/android/internal/infra/AndroidFuture.java
@@ -24,7 +24,6 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
-import android.util.EventLog;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
@@ -585,6 +584,7 @@
/**
* @see #writeThrowable
*/
+ @SuppressWarnings("UnsafeParcelApi")
private static @Nullable Throwable readThrowable(@NonNull Parcel parcel) {
final boolean hasThrowable = parcel.readBoolean();
if (!hasThrowable) {
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 21f719c..9429c79 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -26,6 +26,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
+import android.app.usage.NetworkStatsManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.UidTraffic;
import android.compat.annotation.UnsupportedAppUsage;
@@ -37,7 +38,6 @@
import android.database.ContentObserver;
import android.hardware.usb.UsbManager;
import android.location.GnssSignalQuality;
-import android.net.INetworkStatsService;
import android.net.NetworkStats;
import android.net.Uri;
import android.net.wifi.WifiManager;
@@ -137,7 +137,9 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Queue;
+import java.util.Set;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
@@ -12534,19 +12536,11 @@
private NetworkStats mLastModemNetworkStats = new NetworkStats(0, -1);
@VisibleForTesting
- protected NetworkStats readNetworkStatsLocked(String[] ifaces) {
- try {
- if (!ArrayUtils.isEmpty(ifaces)) {
- INetworkStatsService statsService = INetworkStatsService.Stub.asInterface(
- ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
- if (statsService != null) {
- return statsService.getDetailedUidStats(ifaces);
- } else {
- Slog.e(TAG, "Failed to get networkStatsService ");
- }
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "failed to read network stats for ifaces: " + Arrays.toString(ifaces) + e);
+ protected NetworkStats readNetworkStatsLocked(@NonNull NetworkStatsManager networkStatsManager,
+ String[] ifaces) {
+ Objects.requireNonNull(networkStatsManager);
+ if (!ArrayUtils.isEmpty(ifaces)) {
+ return networkStatsManager.getDetailedUidStats(Set.of(ifaces));
}
return null;
}
@@ -12557,7 +12551,8 @@
*/
@GuardedBy("this")
public void updateWifiState(@Nullable final WifiActivityEnergyInfo info,
- final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs) {
+ final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs,
+ @NonNull NetworkStatsManager networkStatsManager) {
if (DEBUG_ENERGY) {
synchronized (mWifiNetworkLock) {
Slog.d(TAG, "Updating wifi stats: " + Arrays.toString(mWifiIfaces));
@@ -12567,7 +12562,8 @@
// Grab a separate lock to acquire the network stats, which may do I/O.
NetworkStats delta = null;
synchronized (mWifiNetworkLock) {
- final NetworkStats latestStats = readNetworkStatsLocked(mWifiIfaces);
+ final NetworkStats latestStats = readNetworkStatsLocked(networkStatsManager,
+ mWifiIfaces);
if (latestStats != null) {
delta = NetworkStats.subtract(latestStats, mLastWifiNetworkStats, null, null,
mNetworkStatsPool.acquire());
@@ -12920,7 +12916,8 @@
* Distribute Cell radio energy info and network traffic to apps.
*/
public void noteModemControllerActivity(@Nullable final ModemActivityInfo activityInfo,
- final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs) {
+ final long consumedChargeUC, long elapsedRealtimeMs, long uptimeMs,
+ @NonNull NetworkStatsManager networkStatsManager) {
if (DEBUG_ENERGY) {
Slog.d(TAG, "Updating mobile radio stats with " + activityInfo);
}
@@ -12934,7 +12931,8 @@
// Grab a separate lock to acquire the network stats, which may do I/O.
NetworkStats delta = null;
synchronized (mModemNetworkLock) {
- final NetworkStats latestStats = readNetworkStatsLocked(mModemIfaces);
+ final NetworkStats latestStats = readNetworkStatsLocked(networkStatsManager,
+ mModemIfaces);
if (latestStats != null) {
delta = NetworkStats.subtract(latestStats, mLastModemNetworkStats, null, null,
mNetworkStatsPool.acquire());
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index f3cdf82..a5cf7ce 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -207,8 +207,10 @@
*
* @param displayId the ID of the display to notify.
* @param types the internal insets types of the bars are about to show transiently.
+ * @param isGestureOnSystemBar whether the gesture to show the transient bar was a gesture on
+ * one of the bars itself.
*/
- void showTransient(int displayId, in int[] types);
+ void showTransient(int displayId, in int[] types, boolean isGestureOnSystemBar);
/**
* Notifies System UI to abort the transient state of system bars, which prevents the bars being
diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java
index 04e4819..d3c3917 100644
--- a/core/java/com/android/internal/util/ScreenshotHelper.java
+++ b/core/java/com/android/internal/util/ScreenshotHelper.java
@@ -178,7 +178,7 @@
public ScreenshotHelper(Context context) {
mContext = context;
IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED);
- mContext.registerReceiver(mBroadcastReceiver, filter);
+ mContext.registerReceiver(mBroadcastReceiver, filter, Context.RECEIVER_EXPORTED);
}
/**
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
index 627381c..09ff4e0 100644
--- a/core/java/com/android/internal/widget/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -37,6 +37,7 @@
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.MotionEvent.PointerCoords;
+import android.view.RoundedCorner;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
@@ -229,13 +230,29 @@
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
- if (insets.getDisplayCutout() != null) {
- mHeaderPaddingTop = insets.getDisplayCutout().getSafeInsetTop();
- mWaterfallInsets = insets.getDisplayCutout().getWaterfallInsets();
- } else {
- mHeaderPaddingTop = 0;
- mWaterfallInsets = Insets.NONE;
+ int headerPaddingTop = 0;
+ Insets waterfallInsets = Insets.NONE;
+
+ final RoundedCorner topLeftRounded =
+ insets.getRoundedCorner(RoundedCorner.POSITION_TOP_LEFT);
+ if (topLeftRounded != null) {
+ headerPaddingTop = topLeftRounded.getRadius();
}
+
+ final RoundedCorner topRightRounded =
+ insets.getRoundedCorner(RoundedCorner.POSITION_TOP_RIGHT);
+ if (topRightRounded != null) {
+ headerPaddingTop = Math.max(headerPaddingTop, topRightRounded.getRadius());
+ }
+
+ if (insets.getDisplayCutout() != null) {
+ headerPaddingTop =
+ Math.max(headerPaddingTop, insets.getDisplayCutout().getSafeInsetTop());
+ waterfallInsets = insets.getDisplayCutout().getWaterfallInsets();
+ }
+
+ mHeaderPaddingTop = headerPaddingTop;
+ mWaterfallInsets = waterfallInsets;
return super.onApplyWindowInsets(insets);
}
diff --git a/core/java/com/android/server/OWNERS b/core/java/com/android/server/OWNERS
index 554e278..1c2d19d 100644
--- a/core/java/com/android/server/OWNERS
+++ b/core/java/com/android/server/OWNERS
@@ -1 +1 @@
-per-file SystemConfig.java = toddke@google.com,patb@google.com
+per-file SystemConfig.java = file:/PACKAGE_MANAGER_OWNERS
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 67d0c52..dd5af04 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -1768,6 +1768,15 @@
client->setGlobalShadowSettings(ambientColor, spotColor, lightPosY, lightPosZ, lightRadius);
}
+static jboolean nativeGetDisplayDecorationSupport(JNIEnv* env, jclass clazz,
+ jobject displayTokenObject) {
+ sp<IBinder> displayToken(ibinderForJavaObject(env, displayTokenObject));
+ if (displayToken == nullptr) {
+ return JNI_FALSE;
+ }
+ return static_cast<jboolean>(SurfaceComposerClient::getDisplayDecorationSupport(displayToken));
+}
+
static jlong nativeGetHandle(JNIEnv* env, jclass clazz, jlong nativeObject) {
SurfaceControl *surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
return reinterpret_cast<jlong>(surfaceControl->getHandle().get());
@@ -2092,6 +2101,8 @@
(void*)nativeMirrorSurface },
{"nativeSetGlobalShadowSettings", "([F[FFFF)V",
(void*)nativeSetGlobalShadowSettings },
+ {"nativeGetDisplayDecorationSupport", "(Landroid/os/IBinder;)Z",
+ (void*)nativeGetDisplayDecorationSupport},
{"nativeGetHandle", "(J)J",
(void*)nativeGetHandle },
{"nativeSetFixedTransformHint", "(JJI)V",
diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto
index 00b7fd7..4c0ba8c 100644
--- a/core/proto/android/providers/settings/secure.proto
+++ b/core/proto/android/providers/settings/secure.proto
@@ -86,6 +86,8 @@
optional SettingProto accessibility_floating_menu_opacity = 40 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto accessibility_floating_menu_fade_enabled = 41 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto odi_captions_volume_ui_enabled = 42 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // Setting for accessibility magnification for following typing.
+ optional SettingProto accessibility_magnification_follow_typing_enabled = 43 [ (android.privacy).dest = DEST_AUTOMATIC ];
}
optional Accessibility accessibility = 2;
diff --git a/core/proto/android/providers/settings/system.proto b/core/proto/android/providers/settings/system.proto
index 73d6a17..e56d55e 100644
--- a/core/proto/android/providers/settings/system.proto
+++ b/core/proto/android/providers/settings/system.proto
@@ -212,6 +212,12 @@
// DatabaseHelper.
optional SettingProto in_silent = 3 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto when_ringing = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
+
+ optional SettingProto alarm_intensity = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto media_intensity = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto ring_intensity = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ // notification_intensity is already logged at Notification.vibration_intensity
+ // haptic_feedback_intensity is already logged at HapticFeedback.intensity
}
optional Vibrate vibrate = 32;
diff --git a/core/proto/android/server/vibrator/OWNERS b/core/proto/android/server/vibrator/OWNERS
new file mode 100644
index 0000000..b54d6bf
--- /dev/null
+++ b/core/proto/android/server/vibrator/OWNERS
@@ -0,0 +1 @@
+include platform/frameworks/base:/services/core/java/com/android/server/vibrator/OWNERS
\ No newline at end of file
diff --git a/core/proto/android/server/vibrator/vibratormanagerservice.proto b/core/proto/android/server/vibrator/vibratormanagerservice.proto
index 7b97524d..fbe2170 100644
--- a/core/proto/android/server/vibrator/vibratormanagerservice.proto
+++ b/core/proto/android/server/vibrator/vibratormanagerservice.proto
@@ -97,7 +97,7 @@
optional int32 status = 6;
}
-// Next id: 18
+// Next id: 24
message VibratorManagerServiceDumpProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
repeated int32 vibrator_ids = 1;
@@ -106,8 +106,14 @@
optional VibrationProto current_external_vibration = 4;
optional bool vibrator_under_external_control = 5;
optional bool low_power_mode = 6;
+ optional int32 alarm_intensity = 18;
+ optional int32 alarm_default_intensity = 19;
optional int32 haptic_feedback_intensity = 7;
optional int32 haptic_feedback_default_intensity = 8;
+ optional int32 hardware_feedback_intensity = 22;
+ optional int32 hardware_feedback_default_intensity = 23;
+ optional int32 media_intensity = 20;
+ optional int32 media_default_intensity = 21;
optional int32 notification_intensity = 9;
optional int32 notification_default_intensity = 10;
optional int32 ring_intensity = 11;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index a005eb0..ae5414d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -4438,6 +4438,12 @@
<permission android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS"
android:protectionLevel="signature|installer|verifier" />
+ <!-- @TestApi Allows an application to revoke the POST_NOTIFICATIONS permission from an app
+ without killing the app. Only granted to the shell.
+ @hide -->
+ <permission android:name="android.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL"
+ android:protectionLevel="signature" />
+
<!-- @SystemApi Allows the system to read runtime permission state.
@hide -->
<permission android:name="android.permission.GET_RUNTIME_PERMISSIONS"
@@ -5580,13 +5586,6 @@
<permission android:name="android.permission.WRITE_COMMUNAL_STATE"
android:protectionLevel="signature" />
- <!-- Allows an application to view information from the currently active
- {@link com.android.server.communal.CommunalManagerService}.
- @hide
- @SystemApi -->
- <permission android:name="android.permission.READ_COMMUNAL_STATE"
- android:protectionLevel="signature|privileged"/>
-
<!-- Allows the holder to manage whether the system can bind to services
provided by instant apps. This permission is intended to protect
test/development fucntionality and should be used only in such cases.
@@ -6101,7 +6100,7 @@
@hide -->
<permission android:name="android.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES"
android:protectionLevel="signature|role" />
-
+
<!-- @SystemApi Allows an app to read whether SafetyCenter is enabled/disabled.
<p>Protection level: signature|privileged
@hide
@@ -6109,6 +6108,14 @@
<permission android:name="android.permission.READ_SAFETY_CENTER_STATUS"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Required to access the safety center internal APIs using the
+ {@link android.safetycenter.SafetyCenterManager}.
+ <p>Protection level: internal|installer|role
+ @hide
+ -->
+ <permission android:name="android.permission.MANAGE_SAFETY_CENTER"
+ android:protectionLevel="internal|installer|role" />
+
<!-- Attribution for Geofencing service. -->
<attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/>
<!-- Attribution for Country Detector. -->
@@ -6603,6 +6610,10 @@
android:permission="android.permission.BIND_JOB_SERVICE">
</service>
+ <service android:name="com.android.server.companion.AssociationCleanUpService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
<service android:name="com.android.server.pm.PackageManagerShellCommandDataLoader"
android:exported="false">
<intent-filter>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index ddaff68..74ac680 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Laat die program toe om jou Android TV-toestel se oproeprekord te wysig, insluitend data oor inkomende en uitgaande oproepe. Kwaadwillige programme kan dit gebruik om jou oproeprekord uit te vee of te wysig."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Laat die program toe om jou foon se oproeprekord, insluitende data oor inkomende en uitgaande oproepe, te verander. Kwaadwillige programme kan dit gebruik om jou oproeprekord uit te vee of te verander."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"verkry toegang tot liggaamsensors (soos hartklopmonitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Laat die program toe om toegang te verkry tot data van sensors af wat jou fisieke toestand, soos jou polsslag, monitor."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Toegang tot data vanaf liggaamsensors, soos polsslag, temperatuur, bloedsuurstofpersentasie, ens."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"gaan by liggaamsensors in (soos polsslagmonitors) terwyl dit op die agtergrond is"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Toegang tot data vanaf liggaamsensors, soos polsslag, temperatuur, bloedsuurstofpersentasie, ens. terwyl dit op die agtergrond is."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Lees kalendergebeurtenisse en -besonderhede"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Hierdie program kan alle kalendergebeurtenisse lees wat op jou tablet geberg is of jou kalenderdata stoor."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Hierdie program kan alle kalendergeleenthede wat op jou Android TV-toestel geberg is, lees of jou kalenderdata stoor."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Laat die program toe om Moenie Steur Nie-opstelling te lees en skryf."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"begin kyk van toestemminggebruik"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Laat die houer toe om die toestemminggebruik vir \'n program te begin. Behoort nooit vir normale programme nodig te wees nie."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"begin Bekyk Programkenmerke"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Laat die houer toe om die kenmerke-inligting vir \'n program te begin bekyk."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"kry toegang tot sensordata teen \'n hoë monsternemingkoers"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index cee4da6..3f5b5e0 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"መተግበሪያው ስለገቢ እና ወጪ ጥሪዎች ያለ ውሂብም ጨምሮ የእርስዎ Android TV መሣሪያ ምዝግብ ማስታወሻ እንዲቀይር ያስችለዋል። ተንኮል-አዘል መተግበሪያዎች ይህን ተጠቅመው የስልክዎን ምዝግብ ማስታወሻ ሊደመስሱ ወይም ሊቀይሩ ይችላሉ።"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የስልክህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"የሰውነት ዳሳሾችን መድረስ (እንደ የልብ ምት መከታተያዎች ያሉ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"እንደ የእርስዎ የልብ ምት የመሳሰሉ ያሉበትን አካላዊ ሁኔታ ከሚቆጣጠሩ ሰውነት ዳሳሾች ውሂብ ላይ እንዲደርስ ለመተግበሪያው ይፈቅደለታል።"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"እንደ የልብ ምት፣ የሙቀት መጠን፣ የደም ኦክሲጅን መቶኛ፣ ወዘተ ያሉ የሰውነት ዳሳሾች ውሂብን መድረስ።"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ከበስተጀርባ እያለ የሰውነት ዳሳሾችን (እንደ የልብ ምት መቆጣጠሪያዎች) መድረስ"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"ከበስተጀርባ እያለ እንደ የልብ ምት፣ የሙቀት መጠን፣ የደም ኦክሲጅን መቶኛ፣ ወዘተ ያሉ የሰውነት ዳሳሾች ውሂብን መድረስ።"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"የቀን መቁጠሪያ ክስተቶችን እና ዝርዝሮችን አንብብ"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ይህ መተግበሪያ ሁሉንም በእርስዎ ጡባዊ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ይህ መተግበሪያ ሁሉንም በእርስዎ Android TV መሣሪያ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶችን ማንበብ ወይም የእርስዎን የቀን መቁጠሪያ ውሂብ ማስቀመጥ ይችላል።"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"መተግበሪያው የአትረብሽ ውቅረትን እንዲያነብብ እና እንዲጸፍ ይፈቅዳል።"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"የእይታ ፈቃድ መጠቀምን መጀመር"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ያዢው ለአንድ መተግበሪያ የፈቃድ አጠቃቀሙን እንዲያስጀምር ያስችለዋል። ለመደበኛ መተግበሪያዎች በጭራሽ ሊያስፈልግ አይገባም።"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"የመተግበሪያ ባህሪያትን ማየት መጀመር"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ያዢው የአንድ መተግበሪያ የባህሪያት መረጃን ማየት እንዲጀምር ያስችለዋል።"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"የዳሳሽ ውሂቡን በከፍተኛ የናሙና ብዛት ላይ ይድረሱበት"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"ብጁ የመተግበሪያ ማሳወቂያ"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g> በ<xliff:g id="ACCOUNT">%2$s</xliff:g> አዲስ ተጠቃሚ እንዲፈጥር ይፈቀድለት (ይህ መለያ ያለው ተጠቃሚ አስቀድሞ አለ)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g> አዲስ ተጠቃሚ ከ <xliff:g id="ACCOUNT">%2$s</xliff:g> ጋር መፍጠር እንዲችል ይፍቀዱ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"ክትትል የሚደረግበት ተጠቃሚን አክል"</string>
<string name="language_selection_title" msgid="52674936078683285">"ቋንቋ ያክሉ"</string>
<string name="country_selection_title" msgid="5221495687299014379">"የክልል ምርጫ"</string>
<string name="search_language_hint" msgid="7004225294308793583">"የቋንቋ ስም ይተይቡ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 4927fa9..9dc59c0 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -319,7 +319,7 @@
<string name="permgrouplab_location" msgid="1858277002233964394">"الموقع الجغرافي"</string>
<string name="permgroupdesc_location" msgid="1995955142118450685">"الوصول إلى موقع هذا الجهاز"</string>
<string name="permgrouplab_calendar" msgid="6426860926123033230">"التقويم"</string>
- <string name="permgroupdesc_calendar" msgid="6762751063361489379">"الوصول تقويمك"</string>
+ <string name="permgroupdesc_calendar" msgid="6762751063361489379">"الوصول إلى تقويمك"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"إرسال رسائل قصيرة SMS وعرضها"</string>
<string name="permgrouplab_storage" msgid="1938416135375282333">"الملفات والوسائط"</string>
@@ -340,17 +340,17 @@
<string name="permgroupdesc_sensors" msgid="2610631290633747752">"الوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string>
<string name="permgrouplab_notifications" msgid="5472972361980668884">"الإشعارات"</string>
<string name="permgroupdesc_notifications" msgid="4608679556801506580">"عرض الإشعارات"</string>
- <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"استرداد محتوى النافذة"</string>
- <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"فحص محتوى نافذة يتم التفاعل معها"</string>
- <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"تفعيل الاستكشاف باللمس"</string>
+ <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"استرداد محتوى النافذة:"</string>
+ <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"فحص محتوى نافذة يتم التفاعل معها."</string>
+ <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"تفعيل الاستكشاف باللمس:"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="4394677060796752976">"سيتم قول العناصر التي تم النقر عليها بصوت عالٍ ويمكن استكشاف الشاشة باستخدام الإيماءات."</string>
- <string name="capability_title_canRequestFilterKeyEvents" msgid="2772371671541753254">"ملاحظة النص الذي تكتبه"</string>
+ <string name="capability_title_canRequestFilterKeyEvents" msgid="2772371671541753254">"ملاحظة النص الذي تكتبه:"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="2381315802405773092">"يتضمن بيانات شخصية مثل أرقام بطاقات الائتمان وكلمات المرور."</string>
- <string name="capability_title_canControlMagnification" msgid="7701572187333415795">"التحكم في تكبير الشاشة"</string>
+ <string name="capability_title_canControlMagnification" msgid="7701572187333415795">"التحكم في تكبير الشاشة:"</string>
<string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"يمكنك التحكّم في مستوى تكبير/تصغير الشاشة وتحديد الموضع."</string>
<string name="capability_title_canPerformGestures" msgid="9106545062106728987">"تنفيذ إيماءات"</string>
<string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"يمكن النقر والتمرير بسرعة والتصغير أو التكبير بإصبعين وتنفيذ إيماءات أخرى."</string>
- <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"إيماءات بصمات الإصبع"</string>
+ <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"إيماءات بصمات الإصبع:"</string>
<string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"يمكن أن تلتقط الإيماءات التي تم تنفيذها على جهاز استشعار بصمة الإصبع في الجهاز."</string>
<string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"أخذ لقطة شاشة"</string>
<string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"يمكن أخذ لقطة شاشة."</string>
@@ -439,7 +439,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"للسماح للتطبيق بتعديل سجلّ مكالمات جهاز Android TV، بما في ذلك البيانات عن المكالمات الواردة والصادرة. وقد تستخدم التطبيقات الضارة هذا الإعداد لمحو سجلّ المكالمات أو تعديله."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"للسماح للتطبيق بتعديل سجل مكالمات الهاتف، بما في ذلك البيانات عن المكالمات الواردة والصادرة. وربما تستخدم التطبيقات الضارة هذا لمحو سجل المكالمات أو تعديله."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"الوصول إلى أجهزة استشعار الجسم (مثل شاشات معدل ضربات القلب)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"للسماح للتطبيق بالدخول إلى البيانات من أجهزة الاستشعار التي تراقب الحالة البدنية، مثل معدل نبضات القلب."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"الوصول إلى البيانات من أجهزة استشعار الجسم، مثلاً معدّل نبضات القلب ودرجة الحرارة ونسبة الأكسجين في الدم وما إلى ذلك"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"الوصول إلى أجهزة استشعار الجسم (مثلاً شاشات معدّل ضربات القلب في الخلفية)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"الوصول إلى البيانات من أجهزة استشعار الجسم، مثلاً معدّل نبضات القلب ودرجة الحرارة ونسبة الأكسجين في الدم وما إلى ذلك في الخلفية"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"قراءة أحداث التقويم والتفاصيل"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"يمكن لهذا التطبيق قراءة جميع أحداث التقويم المخزَّنة على الجهاز اللوحي ومشاركة بيانات التقويم أو حفظها."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"يمكن لهذا التطبيق قراءة جميع أحداث التقويم المخزَّنة على جهاز Android TV ومشاركة بيانات التقويم أو حفظها."</string>
@@ -743,6 +745,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"للسماح للتطبيق بقراءة إعداد \"عدم الإزعاج\" وكتابتها."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"بدء استخدام إذن العرض"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"للسماح للمالك ببدء استخدام الإذن لأحد التطبيقات. ولن تكون هناك حاجة إليه مطلقًا مع التطبيقات العادية."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"بدء عرض ميزات التطبيق"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"للسماح للمالك ببدء عرض معلومات عن ميزات التطبيق."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"الوصول إلى بيانات جهاز الاستشعار بمعدّل مرتفع للبيانات في الملف الصوتي"</string>
@@ -2117,8 +2123,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"إشعار تطبيق مخصّص"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"هل تسمح لتطبيق <xliff:g id="APP">%1$s</xliff:g> بإنشاء مستخدم جديد باستخدام <xliff:g id="ACCOUNT">%2$s</xliff:g> (يوجد مستخدم بهذا الحساب مسبقًا)؟"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"هل تسمح لتطبيق <xliff:g id="APP">%1$s</xliff:g> بإنشاء مستخدم جديد باستخدام <xliff:g id="ACCOUNT">%2$s</xliff:g> ؟"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"إضافة مستخدم تحت الإشراف"</string>
<string name="language_selection_title" msgid="52674936078683285">"إضافة لغة"</string>
<string name="country_selection_title" msgid="5221495687299014379">"تفضيل المنطقة"</string>
<string name="search_language_hint" msgid="7004225294308793583">"اكتب اسم اللغة"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 0c09239..bd2b97d 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"এপ্টোৱে অন্তৰ্গামী আৰু বহিৰ্গামী কলৰ ডেটাকে ধৰি আপোনাৰ Android TV ডিভাইচৰ কল লগ সংশোধন কৰিবলৈ অনুমতি দিয়ে। ক্ষতিকাৰক এপ্সমূহে আপোনাৰ কল লগ মচিবলৈ বা সংশোধন কৰিবলৈ এইটো ব্যৱহাৰ কৰিব পাৰে।"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"অন্তৰ্গামী আৰু বহিৰ্গামী কলৰ ডেটাকে ধৰি আপোনাৰ ফ\'নৰ কল লগ সংশোধন কৰিবলৈ এপক অনুমতি দিয়ে। ক্ষতিকাৰক এপবোৰে আপোনাৰ কল লগ মচিবলৈ বা সংশোধন কৰিবলৈ ইয়াক ব্যৱহাৰ কৰিব পাৰে।"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"শৰীৰৰ ছেন্সৰসমূহ (যেনে হৃদপিণ্ডৰ গতিৰ হাৰ নিৰীক্ষক) ব্যৱহাৰ কৰিব পাৰে"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"আপোনাৰ হৃদস্পন্দনৰ দৰে শাৰীৰিক অৱস্থাক নিৰীক্ষণ কৰা ছেন্সৰৰ পৰা ডেটা লাভ কৰিবলৈ এপক অনুমতি দিয়ে।"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"শৰীৰৰ ছেন্সৰৰ পৰা হৃদস্পন্দনৰ হাৰ, উষ্ণতা, তেজত অক্সিজেনৰ শতকৰা হাৰ ইত্যাদিৰ দৰে ডেটাৰ এক্সেছ পাওক।"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"নেপথ্যত থকাৰ সময়ত শৰীৰৰ ছেন্সৰ (উদাহৰণস্বৰূপে, হৃদস্পন্দনৰ হাৰ নিৰীক্ষক)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"নেপথ্যত থকাৰ সময়ত শৰীৰৰ ছেন্সৰৰ পৰা হৃদস্পন্দনৰ হাৰ, উষ্ণতা, তেজত অক্সিজেনৰ শতকৰা হাৰ ইত্যাদিৰ দৰে ডেটাৰ এক্সেছ পাওক।"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"কেলেণ্ডাৰৰ কাৰ্যক্ৰম আৰু সবিশেষ পঢ়িব পাৰে"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"এই এপ্টোৱে আপোনাৰ টেবলেটটোত সংৰক্ষিত আটাইবোৰ কেলেণ্ডাৰ কাৰ্যক্ৰম পঢ়িব পাৰে আৰু আপোনাৰ কেলেণ্ডাৰৰ ডেটা শ্বেয়াৰ বা ছেভ কৰিব পাৰে।"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"এই এপ্টোৱে আপোনাৰ Android TV ডিভাইচটোত ষ্ট’ৰ কৰি ৰখা আটাইবোৰ কেলেণ্ডাৰৰ অনুষ্ঠান পঢ়িব পাৰে আৰু আপোনাৰ কেলেণ্ডাৰৰ ডেটা শ্বেয়াৰ অথবা ছেভ কৰিব পাৰে।"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"অসুবিধা নিদিবৰ কনফিগাৰেশ্বনক পঢ়িবলৈ আৰু সালসলনি কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"চোৱাৰ অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰক"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ধাৰকক কোনো এপৰ বাবে অনুমতিৰ ব্যৱহাৰ আৰম্ভ কৰিবলৈ দিয়ে। সাধাৰণ এপ্সমূহৰ বাবে কেতিয়াও প্ৰয়োজন হ’ব নালাগে।"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"এপৰ সুবিধাসমূহৰ সম্পর্কীয় তথ্য চোৱাটো আৰম্ভ কৰক"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ধাৰকক কোনো এপৰ সুবিধাসমূহৰ সম্পর্কীয় তথ্য চোৱাটো আৰম্ভ কৰিবলৈ দিয়ে।"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"এটা উচ্চ ছেম্পলিঙৰ হাৰত ছেন্সৰৰ ডেটা এক্সেছ কৰে"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index a11b68d..3b0c6c8 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Gələn və gedən zənglərlə bağlı məlumatlar daxil olmaqla tətbiqə Android TV cihazının zəng siyahısını dəyişdirmək icazəsi verir. Zərərli proqramlar zəng siyahısını silmək və ya dəyişdirmək üçün bundan istifadə edə bilər."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Tətbiqə sizin daxil olan və gedən zənglər daxil olmaqla telefon zəngi loqlarınızı redaktə etmək icazəsi verir. Zərərli tətbiqlər bundan telefon loqlarınızı silmək və ya redaktə etmək üçün istifadə edə bilər."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"bədən sensorlarına (ürək döyüntüsü monitorları kimi) giriş"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Tətbiqə ürək döyüntüsü kimi fiziki durumunuzu izləməyən sensorların datasına daxil olmağa icazə verir."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Ürək döyüntüsü, temperatur, qanda oksigen faizi kimi bədən sensorlarından əldə edilən məlumatlara giriş."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"arxa fonda işləyərkən bədən sensorlarına (ürək döyüntüsü nəzarətləri kimi) giriş"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Arxa fonda işləyərkən ürək döyüntüsü, temperatur, qanda oksigen faizi kimi bədən sensorlarından əldə edilən məlumatlara giriş."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Təqvim təqdirləri və detallarını oxuyun"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Bu tətbiq planşetdə yerləşdirilmiş və təqvim datasında yadda saxlanmış bütün təqvim tədbirlərini oxuya bilər."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Bu tətbiq Android TV cihazında saxlanılan bütün təqvim tədbirlərini oxuya, həmçinin təqvim datasını paylaşa və ya yadda saxlaya bilər."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Tətbiqə \"Narahat Etməyin\" konfiqurasiyasını oxumağa və yazmağa icazə verin."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Baxış icazəsinin istifadəsinə başlayın"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Sahibinə tətbiqin icazədən istifadəsinə başlamağa imkan verir. Adi tətbiqlər üçün heç vaxt tələb edilmir."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"tətbiqin funksiyalarını görməyə başlamaq"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"İstifadəçinin tətbiqin funksiyaları barədə məlumatları görməyə başlamasına icazə verir."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"sensor datasına yüksək ölçmə sürəti ilə giriş etmək"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index b8e0d9a..96f8d7d 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -430,7 +430,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Dozvoljava aplikaciji da menja evidenciju poziva na Android TV uređaju, uključujući podatke o dolaznim i odlaznim pozivima. Zlonamerne aplikacije mogu ovo da koriste za brisanje ili menjanje evidencije poziva."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Dozvoljava aplikaciji da menja evidenciju poziva na telefonu, uključujući podatke o dolaznim i odlaznim pozivima. Zlonamerne aplikacije mogu ovo da koriste da bi brisale ili menjale evidenciju poziva."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"pristup senzorima na telu (poput monitora za praćenje pulsa)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Dozvoljava aplikaciji da pristupa podacima sa senzora koji nadgledaju fizičku kondiciju, kao što je broj otkucaja srca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Pristup podacima senzora za telo, poput pulsa, temperature, procenat kiseonika u krvi itd."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"pristup senzorima na telu (npr. monitori za praćenje pulsa) tokom rada u pozadini"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Pristup podacima senzora za telo, poput pulsa, temperature, procenat kiseonika u krvi itd, tokom rada u pozadini."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Čitanje događaja i podataka iz kalendara"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Ova aplikacija može da čita sve događaje iz kalendara koje čuvate na tabletu, kao i da deli ili čuva podatke iz kalendara."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Ova aplikacija može da čita sve događaje iz kalendara koje čuvate na Android TV uređaju, kao i da deli ili čuva podatke iz kalendara."</string>
@@ -734,6 +736,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Dozvoljava aplikaciji da čita i upisuje konfiguraciju podešavanja Ne uznemiravaj."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"početak korišćenja dozvole za pregled"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dozvoljava vlasniku da započne korišćenje dozvole za aplikaciju. Nikada ne bi trebalo da bude potrebna za uobičajene aplikacije."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"pokretanje prikaza funkcija aplikacije"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Dozvoljava nosiocu dozvole da započne pregledanje informacija o funkcijama aplikacije."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pristup podacima senzora pri velikoj brzini uzorkovanja"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 26d2e73..b444499 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Дазваляе праграме змяняць журнал выклікаў прылады Android TV, у тым ліку даныя пра ўваходныя і выходныя выклікі. Шкодныя праграмы могуць злоўжыць гэтым і сцерці ці змяніць даныя ў журнале выклікаў."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Дазваляе прыкладанням змяняць гiсторыю выклiкаў тэлефону, у тым лiку дадзеныя пра ўваходныя і зыходныя выклiкi. Шкоднасныя прыкладаннi могуць выкарыстоўваць гэта, каб выдаляць або змяняць гiсторыю выклікаў."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"атрымліваць доступ да датчыкаў цела (напрыклад, пульсометраў)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Дазваляе праграме атрымліваць доступ да даных з датчыкаў, якія назіраюць за вашым фізічным станам, напрыклад, за частатой пульсу."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Доступ да даных з датчыкаў цела, такіх як пульс, тэмпература, працэнт утрымання ў крыві кіслароду і г. д."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"атрымліваць у фонавым рэжыме доступ да датчыкаў цела (напрыклад, пульсометраў)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Доступ у фонавым рэжыме да даных з датчыкаў цела, такіх як пульс, тэмпература, працэнт утрымання ў крыві кіслароду і г. д."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Чытаць падзеі календара і падрабязныя звесткі"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Гэта праграма можа чытаць усе падзеі календара, захаваныя на вашым планшэце, і абагульваць ці захоўваць даныя календара."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Гэта праграма можа счытваць усе падзеі календара, захаваныя на прыладзе Android TV, і абагульваць ці захоўваць яго даныя."</string>
@@ -737,6 +739,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дазваляе праграме чытаць і выконваць запіс у канфігурацыю рэжыму «Не турбаваць»."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"запусціць выкарыстанне дазволаў на прагляд"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дазваляе трымальніку запусціць выкарыстанне дазволаў праграмай. Не патрэбна для звычайных праграм."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"запусціць прагляд функцый праграмы"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Дазваляе трымальніку запусціць прагляд інфармацыі пра функцыі для праграмы."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"атрымліваць даныя датчыка з высокай частатой дыскрэтызацыі"</string>
@@ -2053,8 +2059,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Апавяшчэнне пра карыстальніцкую праграму"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Дазволіць праграме \"<xliff:g id="APP">%1$s</xliff:g>\" стварыць новага Карыстальніка з уліковым запісам <xliff:g id="ACCOUNT">%2$s</xliff:g> (Карыстальнік з гэтым уліковым запісам ужо існуе)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Дазволіць праграме \"<xliff:g id="APP">%1$s</xliff:g>\" стварыць новага Карыстальніка з уліковым запісам <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Дадаць падкантрольнага карыстальніка"</string>
<string name="language_selection_title" msgid="52674936078683285">"Дадаць мову"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Параметры рэгіёна"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Увядзіце назву мовы"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 5250956..c3d8410 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Дава възможност на приложението да променя списъка с обажданията на устройството ви с Android TV, включително данните за входящите и изходящите обаждания. Злонамерените приложения може да използват разрешението, за да изтрият или променят този списък."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Разрешава на приложението да променя списъка с обаждания на телефона ви, включително данните за входящите и изходящите обаждания. Злонамерените приложения могат да използват това, за да изтрият или променят този списък."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"достъп до телесните сензори (напр. пулсомери)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Разрешава на приложението да осъществява достъп до данните от сензорите, които следят физическото ви състояние, като например сърдечния ви ритъм."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Достъп до данните от сензорите за тяло, като например сърдечен ритъм, температура, процент на кислорода в кръвта и др."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"достъп до сензорите за тяло (напр. пулсомери), докато е на заден план"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Достъп до данните от сензорите за тяло, като например сърдечен ритъм, температура, процент на кислорода в кръвта и др., докато е на заден план."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Четене на събития и подробности от календара"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Това приложение може да чете всички съхранявани на таблета ви събития в календара и да споделя или запазва данни в календара ви."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Това приложение може да чете всички съхранявани на устройството ви с Android TV събития в календара и да споделя или запазва данни в календара ви."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Предоставя на приложението достъп за четене и запис до конфигурацията на „Не безпокойте“."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"стартиране на прегледа на използваните разрешения"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Разрешава на притежателя да стартира прегледа на използваните разрешения за дадено приложение. Нормалните приложения би трябвало никога да не се нуждаят от това."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"стартиране на прегледа на функциите на приложението"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Разрешава на притежателя да стартира прегледа на информацията за функциите на дадено приложение."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"осъществяване на достъп до данните от сензорите при висока скорост на семплиране"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 657596f..6bcf9aa 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"অ্যাপটিকে ইনকামিং ও আউটগোয়িং কল সহ আপনার Android TV ডিভাইসের কল লগে পরিবর্তন করার অনুমতি দেয়। ক্ষতিকারক অ্যাপ এটিকে কাজে লাগিয়ে আপনার কল লগে পরিবর্তন করতে পারে বা সেটি মুছে ফেলতে পারে।"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ইনকামিং ও আউটগোয়িং কলগুলি সম্পর্কিত ডেটা সহ আপনার ফোনের কল লগ পরিবর্তন করতে দেয়৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি এটিকে আপনার কল লগ মুছে দিতে বা পরিবর্তন করতে ব্যবহার করতে পারে৷"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"শরীরের সেন্সর (হার্ট রেট মনিটারের মত) অ্যাক্সেস করুন"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"অ্যাপ্লিকেশানটিকে আপনার শারীরিক অবস্থা যেমন, আপনার হৃৎস্পন্দন পর্যবেক্ষণ করে এমন সেন্সরগুলি অ্যাক্সেস করতে মঞ্জুরি দেয়।"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"বডি সেন্সর ডেটাতে যেমন হার্ট রেট, তাপমাত্রা, রক্তে অক্সিজেনের শতাংশ ইত্যাদিতে অ্যাক্সেস।"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ব্যাকগ্রাউন্ডে থাকার সময়ে বডি সেন্সর ডেটাতে (যেমন হার্ট রেট মনিটর) অ্যাক্সেস"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"ব্যাকগ্রাউন্ডে থাকার সময়ে বডি সেন্সর ডেটা যেমন হার্ট রেট, তাপমাত্রা, রক্তে অক্সিজেনের শতাংশ ইত্যাদিতে অ্যাক্সেস।"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"ক্যালেন্ডারের ইভেন্ট এবং বিশদ বিবরণ পড়ুন"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"এই অ্যাপটি আপনার ট্যাবলেটে সংরক্ষিত সমস্ত ক্যালেন্ডার ইভেন্ট পড়তে এবং আপনার ক্যালেন্ডারের ডেটা শেয়ার বা সংরক্ষণ করতে পারে৷"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"এই অ্যাপ আপনার Android TV ডিভাইসে সেভ করা সব ক্যালেন্ডার ইভেন্ট পড়তে পারে এবং আপনার ক্যালেন্ডারের ডেটা শেয়ার বা সেভ করতে পারে।"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"অ্যাপটিকে \'বিরক্ত করবে না\' কনফিগারেশন পড়া এবং লেখার অনুমতি দেয়।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"দেখার অনুমতি কাজে লাগানো শুরু করুন"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"কোনও অ্যাপের কোনও নির্দিষ্ট অনুমতির ব্যবহার শুরু করার ক্ষেত্রে হোল্ডারকে সাহায্য করে। সাধারণ অ্যাপের জন্য এটির পরিবর্তন হওয়ার কথা নয়।"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"অ্যাপের ফিচার দেখা শুরু করুন"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"কোনও অ্যাপের ফিচার সম্পর্কিত তথ্য দেখা শুরু করতে অনুমতি দেয়।"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"হাই স্যাম্পলিং রেটে সেন্সর ডেটা অ্যাক্সেস করুন"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"কাস্টম অ্যাপ বিজ্ঞপ্তি"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="ACCOUNT">%2$s</xliff:g>-এ (একজন ব্যবহারকারী এই অ্যাকাউন্টে আগে থেকেই রয়েছেন) একজন নতুন ব্যবহারকারী তৈরি করার অনুমতি <xliff:g id="APP">%1$s</xliff:g>-কে দেবেন?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="ACCOUNT">%2$s</xliff:g>-এ একজন নতুন ব্যবহারকারী তৈরি করার অনুমতি <xliff:g id="APP">%1$s</xliff:g>-কে দেবেন?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"তত্ত্বাবধানে থাকা ব্যবহারকারী যোগ করুন"</string>
<string name="language_selection_title" msgid="52674936078683285">"একটি ভাষা যোগ করুন"</string>
<string name="country_selection_title" msgid="5221495687299014379">"পছন্দের অঞ্চল"</string>
<string name="search_language_hint" msgid="7004225294308793583">"ভাষার নাম লিখুন"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 6e8cd97..c1823c9 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -430,7 +430,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Omogućava aplikaciji izmjenu zapisnika poziva Android TV uređaja, uključujući podatke o dolaznim i odlaznim pozivima. Zlonamjerne aplikacije to mogu iskoristiti za brisanje ili izmjenu zapisnika poziva."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Omogućava aplikaciji da izmijeni zapisnik poziva sa vašeg telefona, uključujući podatke o dolaznim i odlaznim pozivima. Zlonamjerne aplikacije mogu to iskoristiti za brisanje ili izmjenu vašeg zapisnika poziva."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"pristup tjelesnim senzorima (poput monitora za puls)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Dozvoljava aplikaciji pristup podacima sa senzora koji prate fizičke pokazatelje kao što je vaš puls."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Pristup podacima s tjelesnih senzora kao što su puls, temperatura, saturacija kisikom, itd."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"pristup tjelesnim senzorima (poput monitora za puls) dok je aplikacija u pozadini"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Pristup podacima s tjelesnih senzora kao što su puls, temperatura, saturacija kisikom, itd. dok je aplikacija u pozadini."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Čitanje događaja kalendara i detalja"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Ova aplikacija može čitati sve događaje u kalendaru pohranjene na vašem tabletu i sačuvati podatke kalendara."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Ova aplikacija može čitati sve događaje u kalendaru na vašem Android TV uređaju i dijeliti ili sačuvati podatke kalendara."</string>
@@ -734,6 +736,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Omogućava aplikaciji da čita i upisuje konfiguraciju načina rada Ne ometaj."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pokrenuti korištenje odobrenja za pregled"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dozvoljava vlasniku da pokrene korištenje odobrenja za aplikaciju. Ne bi trebalo biti potrebno za obične aplikacije."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"pokretanje pregleda funkcija aplikacije"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Dozvoljava vlasniku da pokrene pregled informacija o funkcijama za aplikaciju."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pristup podacima senzora velikom brzinom uzorkovanja"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 41af878..325b620 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permet que l\'aplicació modifiqui el registre de trucades del dispositiu Android TV, incloses les dades de les trucades entrants i sortints. És possible que les aplicacions malicioses ho utilitzin per suprimir o per modificar el teu registre de trucades."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permet que l\'aplicació modifiqui el registre de trucades del teu telèfon, incloses les dades de les trucades entrants i sortints. És possible que les aplicacions malicioses ho utilitzin per eliminar o per modificar el teu registre de trucades."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"accedir a sensors corporals (p. ex., monitors de freqüència cardíaca)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permet que l\'aplicació accedeixi a les dades dels sensors que supervisen el teu estat físic, com ara la freqüència cardíaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Accés a les dades dels sensors corporals com la freqüència cardíaca, la temperatura, el percentatge d\'oxigen a la sang, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"accedir a sensors corporals (com els monitors de freqüència cardíaca) en segon pla"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Accés a les dades dels sensors corporals, com ara la freqüència cardíaca, la temperatura o el percentatge d\'oxigen a la sang, en segon pla."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Aquesta aplicació pot llegir els esdeveniments i la informació del calendari"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Aquesta aplicació pot llegir tots els esdeveniments del calendari emmagatzemats a la tauleta i compartir o desar les dades del teu calendari."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Aquesta aplicació pot llegir tots els esdeveniments del calendari emmagatzemats al dispositiu Android TV i compartir o desar les dades del calendari."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet que l\'aplicació llegeixi la configuració No molestis i hi escrigui."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"comença a utilitzar el permís de visualització"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet que un propietari comenci a utilitzar el permís amb una aplicació. No s\'hauria de necessitar mai per a les aplicacions normals."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"iniciar la visualització de les funcions d\'una aplicació"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permet que el propietari vegi la informació de les funcions d\'una aplicació."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"accedir a les dades del sensor a una freqüència de mostratge alta"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Notificació d\'aplicació personalitzada"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Concedeixes permís a <xliff:g id="APP">%1$s</xliff:g> per crear un usuari amb el compte <xliff:g id="ACCOUNT">%2$s</xliff:g>? (Ja hi ha un usuari amb aquest compte.)"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Concedeixes permís a <xliff:g id="APP">%1$s</xliff:g> per crear un usuari amb el compte <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Afegeix un usuari supervisat"</string>
<string name="language_selection_title" msgid="52674936078683285">"Afegeix un idioma"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Preferència de regió"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Escriu el nom de l\'idioma"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 72ad45b..68128a4 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Umožňuje aplikaci upravovat seznam hovorů na zařízení Android TV, včetně dat o příchozích a odchozích hovorech. Škodlivé aplikace to mohou zneužít k vymazání nebo změnám seznamu hovorů."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Umožňuje aplikaci upravovat seznam hovorů vašeho telefonu, včetně dat o příchozích a odchozích hovorech. Škodlivé aplikace to mohou zneužít k vymazání nebo změnám seznamu hovorů."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"přístup k tělesným senzorům (např. snímače tepu)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Umožňuje aplikaci používat data ze senzorů, které sledují vaši fyzickou kondici, například tepovou frekvenci."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Přístup k datům z tělesných senzorů, jako jsou senzory tepové frekvence, teploty, procenta nasycení krve kyslíkem apod."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"přístup k tělesným senzorům (např. k senzorům tepu) při běhu na pozadí"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Přístup k datům z tělesných senzorů, jako jsou senzory tepové frekvence, teploty, procenta nasycení krve kyslíkem apod., při běhu na pozadí."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Čtení událostí v kalendáři včetně podrobností"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Tato aplikace může číst všechny události v kalendáři uložené v tabletu a sdílet či ukládat data kalendáře."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Tato aplikace může číst všechny události v kalendáři uložené v zařízení Android TV a sdílet či ukládat data kalendáře."</string>
@@ -737,6 +739,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Umožňuje aplikaci číst a zapisovat konfiguraci režimu Nerušit."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"zahájení zobrazení využití oprávnění"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umožňuje přístup zahájit využití oprávnění jiné aplikace. Běžné aplikace by toto oprávnění neměly nikdy požadovat."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"zobrazení informací o funkcích aplikace"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Umožňuje držiteli zobrazit informace o funkcích aplikace."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"přístup k datům ze senzorů s vyšší vzorkovací frekvencí"</string>
@@ -2053,8 +2059,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Vlastní oznámení aplikace"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Povolit aplikaci <xliff:g id="APP">%1$s</xliff:g> vytvořit nového uživatele s účtem <xliff:g id="ACCOUNT">%2$s</xliff:g>? (Uživatel s tímto účtem již existuje.)"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Povolit aplikaci <xliff:g id="APP">%1$s</xliff:g> vytvořit nového uživatele s účtem <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Přidat dozorovaného uživatele"</string>
<string name="language_selection_title" msgid="52674936078683285">"Přidat jazyk"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Preferovaná oblast"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Zadejte název jazyka"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 8f4039f..9134c57 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Tillader, at appen ændrer din Android TV-enheds opkaldshistorik, bl.a. data om indgående og udgående opkald. Skadelige apps kan bruge dette til at rydde eller ændre din opkaldshistorik."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Tillader, at appen ændrer telefonens opkaldshistorik, f.eks. data om indgående og udgående opkald. Ondsindede apps kan bruge dette til at slette eller ændre din opkaldshistorik."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"få adgang til kropssensorer (f.eks. pulsmålere)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Giver appen adgang til data fra sensorer, der overvåger din fysiske tilstand, f.eks. din puls."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Adgang til data fra kropssensorer såsom puls, temperatur, procentdelen af ilt i blodet m.m."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"tilgå kropssensorer (f.eks. pulsmålere), mens appen kører i baggrunden."</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Adgang til data fra kropssensorer såsom puls, temperatur, procentdelen af ilt i blodet m.m., mens appen kører i baggrunden."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Læs kalenderbegivenheder og -info"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Denne app kan læse alle kalenderbegivenheder, der er gemt på din tablet, og dele eller gemme dine kalenderdata."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Denne app kan læse alle kalenderbegivenheder, der er gemt på din Android TV-enhed, og dele eller gemme dine kalenderdata."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Giver appen tilladelse til at læse og redigere konfigurationen af Forstyr ikke."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start brugen at tilladelsesvisning"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Tillader, at brugeren kan bruge en tilladelse for en app. Dette bør aldrig være nødvendigt for almindelige apps."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"se appfunktioner"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Giver den app, som har tilladelsen, mulighed for at se oplysninger om en apps funktioner."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"få adgang til sensordata ved høj samplingfrekvens"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Tilpasset appnotifikation"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Vil du give <xliff:g id="APP">%1$s</xliff:g> tilladelse til at oprette en ny bruger med <xliff:g id="ACCOUNT">%2$s</xliff:g> (der findes allerede en bruger med denne konto)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Vil du give <xliff:g id="APP">%1$s</xliff:g> tilladelse til at oprette en nye bruger med <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Tilføj en administreret bruger"</string>
<string name="language_selection_title" msgid="52674936078683285">"Tilføj et sprog"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Områdeindstilling"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Angiv sprog"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 5e5e578..ed2a92a 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Ermöglicht der App, die Anrufliste deines Android TV-Geräts zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Du solltest wissen, dass dies von schädlichen Apps genutzt werden kann, um Einträge in der Anrufliste zu löschen oder zu ändern."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Ermöglicht der App, die Anrufliste deines Telefons zu ändern, einschließlich der Daten über ein- und ausgehende Anrufe. Schädliche Apps können so die Einträge in der Anrufliste löschen oder sie ändern."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"Auf Körpersensoren wie z. B. Pulsmesser zugreifen"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Ermöglicht der App, auf Daten von Sensoren zuzugreifen, die deine körperliche Verfassung überwachen, beispielsweise deinen Puls"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Zugriff auf Daten von Körpersensoren, wie z. B. Herzfrequenz, Temperatur und Sauerstoffsättigung."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"Auf im Hintergrund aktive Körpersensoren (z. B. Herzfrequenzmesser) zugreifen"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Zugriff auf Daten von Körpersensoren, wie z. B. Herzfrequenz, Temperatur und Sauerstoffsättigung, während sie im Hintergrund aktiv sind."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Kalendertermine und Details lesen"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Diese App kann alle auf deinem Tablet gespeicherten Kalendertermine lesen und deine Kalenderdaten teilen oder speichern."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Diese App kann alle auf deinem Android TV-Gerät gespeicherten Kalendertermine lesen und die Kalenderdaten teilen oder speichern."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ermöglicht der App Lese- und Schreibzugriff auf die „Bitte nicht stören“-Konfiguration"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Mit der Verwendung der Anzeigeberechtigung beginnen"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ermöglicht dem Inhaber, die Berechtigungsnutzung für eine App zu beginnen. Sollte für normale Apps nie benötigt werden."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"App-Funktionen ansehen"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Ermöglicht der App, die Informationen über die Funktionen einer anderen App anzusehen."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Sensordaten mit hoher Frequenz auslesen"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Benutzerdefinierte App-Benachrichtigung"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Es gibt bereits einen Nutzer mit <xliff:g id="ACCOUNT">%2$s</xliff:g>. Möchtest du zulassen, dass <xliff:g id="APP">%1$s</xliff:g> einen neuen Nutzer mit diesem Konto erstellt?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Möchtest du zulassen, dass <xliff:g id="APP">%1$s</xliff:g> einen neuen Nutzer mit <xliff:g id="ACCOUNT">%2$s</xliff:g> erstellt?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Betreuten Nutzer hinzufügen"</string>
<string name="language_selection_title" msgid="52674936078683285">"Sprache hinzufügen"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Region auswählen"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Sprache eingeben"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index f184200..ef23640 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Επιτρέπει στην εφαρμογή να τροποποιεί το αρχείο καταγραφής κλήσεων της συσκευής σας Android TV, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Οι κακόβουλες εφαρμογές μπορεί να εκμεταλλευτούν αυτή την άδεια για να διαγράψουν ή να τροποποιήσουν το αρχείο καταγραφής κλήσεων."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Επιτρέπει στην εφαρμογή να τροποποιεί το αρχείο καταγραφής κλήσεων του τηλεφώνου σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Οι κακόβουλες εφαρμογές μπορεί να το χρησιμοποιήσουν για να διαγράψουν ή να τροποποιήσουν το αρχείο καταγραφής κλήσεων."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"πρόσβαση στους αισθητήρες λειτουργιών (π.χ. παρακολούθηση καρδιακού παλμού)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Επιτρέπει στην εφαρμογή να αποκτήσει πρόσβαση στα δεδομένα των αισθητήρων που παρακολουθούν τη φυσική σας κατάσταση, όπως τον καρδιακό ρυθμό σας."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Πρόσβαση σε δεδομένα από αισθητήρες σώματος όπως καρδιακού ρυθμού, θερμοκρασίας, ποσοστού οξυγόνου στο αίμα κ.λπ."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"πρόσβαση σε αισθητήρες σώματος (π.χ. καρδιακού ρυθμού) στο παρασκήνιο"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Πρόσβαση σε δεδομένα από αισθητήρες σώματος όπως καρδιακού ρυθμού, θερμοκρασίας, ποσοστού οξυγόνου στο αίμα κ.λπ. κατά την εκτέλεση στο παρασκήνιο."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Ανάγνωση συμβάντων ημερολογίου και λεπτομερειών"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Αυτή η εφαρμογή μπορεί να διαβάσει όλα τα συμβάντα ημερολογίου που είναι αποθηκευμένα στο tablet που χρησιμοποιείτε και να μοιραστεί ή να αποθηκεύσει τα δεδομένα ημερολογίου σας."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Αυτή η εφαρμογή μπορεί να διαβάσει όλα τα συμβάντα ημερολογίου που είναι αποθηκευμένα στη συσκευή Android TV και να μοιραστεί ή να αποθηκεύσει τα δεδομένα ημερολογίου σας."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Επιτρέπει στην εφαρμογή την εγγραφή και τη σύνταξη διαμόρφωσης για τη λειτουργία \"Μην ενοχλείτε\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"έναρξη χρήσης άδειας προβολής"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Επιτρέπει στον κάτοχο να ξεκινήσει τη χρήση της άδειας για μια εφαρμογή. Δεν απαιτείται ποτέ για κανονικές εφαρμογές."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"έναρξη προβολής λειτουργιών εφαρμογής"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Επιτρέπει στον κάτοχο να ξεκινήσει την προβολή των πληροφοριών για τις λειτουργίες μιας εφαρμογής."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"πρόσβαση σε δεδομένα αισθητήρα με υψηλό ρυθμό δειγματοληψίας"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Προσαρμοσμένη ειδοποίηση εφαρμογής"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Επιτρέπετε στην εφαρμογή <xliff:g id="APP">%1$s</xliff:g> να δημιουργήσει έναν νέο χρήστη με τον λογαριασμό <xliff:g id="ACCOUNT">%2$s</xliff:g> (υπάρχει ήδη χρήστης με αυτόν τον λογαριασμό);"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Επιτρέπετε στην εφαρμογή <xliff:g id="APP">%1$s</xliff:g> να δημιουργήσει έναν νέο χρήστη με τον λογαριασμό <xliff:g id="ACCOUNT">%2$s</xliff:g>;"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Προσθήκη εποπτευόμενου χρήστη"</string>
<string name="language_selection_title" msgid="52674936078683285">"Προσθήκη γλώσσας"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Προτίμηση περιοχής"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Εισαγ. όνομα γλώσσας"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 2bf964b..a23eda2 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Allows the app to modify your Android TV device\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to delete or modify your call log."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Allows the app to modify your phone\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"access body sensors (like heart rate monitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Allows the app to access data from sensors that monitor your physical condition, such as your heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Access to data from body sensors, such as heart rate, temperature, blood oxygen percentage, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"access body sensors (like heart rate monitors) while in the background"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Access to data from body sensors, such as heart rate, temperature, blood oxygen percentage, etc. while in the background."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Read calendar events and details"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"This app can read all calendar events stored on your tablet and share or save your calendar data."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"This app can read all calendar events stored on your Android TV device and share or save your calendar data."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Allows the holder to start screen to review permission decisions. Should never be needed for normal apps."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"start view app features"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index b4d1c82..281ecb1 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Allows the app to modify your Android TV device\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to delete or modify your call log."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Allows the app to modify your phone\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"access body sensors (like heart rate monitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Allows the app to access data from sensors that monitor your physical condition, such as your heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Access to data from body sensors, such as heart rate, temperature, blood oxygen percentage, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"access body sensors (like heart rate monitors) while in the background"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Access to data from body sensors, such as heart rate, temperature, blood oxygen percentage, etc. while in the background."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Read calendar events and details"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"This app can read all calendar events stored on your tablet and share or save your calendar data."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"This app can read all calendar events stored on your Android TV device and share or save your calendar data."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Allows the holder to start screen to review permission decisions. Should never be needed for normal apps."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"start view app features"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index e47a2c2..8d8b33c 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Allows the app to modify your Android TV device\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to delete or modify your call log."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Allows the app to modify your phone\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"access body sensors (like heart rate monitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Allows the app to access data from sensors that monitor your physical condition, such as your heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Access to data from body sensors, such as heart rate, temperature, blood oxygen percentage, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"access body sensors (like heart rate monitors) while in the background"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Access to data from body sensors, such as heart rate, temperature, blood oxygen percentage, etc. while in the background."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Read calendar events and details"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"This app can read all calendar events stored on your tablet and share or save your calendar data."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"This app can read all calendar events stored on your Android TV device and share or save your calendar data."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Allows the holder to start screen to review permission decisions. Should never be needed for normal apps."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"start view app features"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 2108367..e411655 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Allows the app to modify your Android TV device\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to delete or modify your call log."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Allows the app to modify your phone\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"access body sensors (like heart rate monitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Allows the app to access data from sensors that monitor your physical condition, such as your heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Access to data from body sensors, such as heart rate, temperature, blood oxygen percentage, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"access body sensors (like heart rate monitors) while in the background"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Access to data from body sensors, such as heart rate, temperature, blood oxygen percentage, etc. while in the background."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Read calendar events and details"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"This app can read all calendar events stored on your tablet and share or save your calendar data."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"This app can read all calendar events stored on your Android TV device and share or save your calendar data."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Allows the holder to start screen to review permission decisions. Should never be needed for normal apps."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"start view app features"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 68b1de3..c2e7472 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Allows the app to modify your Android TV device\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Allows the app to modify your phone\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"access body sensors (like heart rate monitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Allows the app to access data from sensors that monitor your physical condition, such as your heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Access to data from body sensors such as heart rate, temperature, blood oxygen percentage, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"access body sensors (like heart rate monitors) while in the background"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Access to data from body sensors such as heart rate, temperature, blood oxygen percentage, etc. while in the background."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Read calendar events and details"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"This app can read all calendar events stored on your tablet and share or save your calendar data."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"This app can read all calendar events stored on your Android TV device and share or save your calendar data."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Allows the app to read and write Do Not Disturb configuration."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start view permission usage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Allows the holder to start the permission usage for an app. Should never be needed for normal apps."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"start view permission decisions"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Allows the holder to start screen to review permission decisions. Should never be needed for normal apps."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"start view app features"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Allows the holder to start viewing the features info for an app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"access sensor data at a high sampling rate"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 517ee57..a5cb421 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permite que la app modifique el registro de llamadas del dispositivo Android TV, incluidos datos sobre llamadas entrantes y salientes. Las apps maliciosas pueden usar este permiso para borrar o modificar el registro de llamadas."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permite que la aplicación modifique el registro de llamadas del dispositivo, incluidos los datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para borrar o modificar el registro de llamadas."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"acceder a los sensores corporales (como los monitores de frecuencia cardíaca)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permite que la app acceda a datos de sensores que monitorean tu estado físico, como la frecuencia cardíaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Acceso a datos de sensores corporales, como el ritmo cardíaco, la temperatura, el porcentaje de oxígeno en sangre, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"acceso a sensores corporales (p. ej., ritmo cardíaco) en segundo plano"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Acceso en segundo plano a datos de sensores corporales, como el ritmo cardíaco, la temperatura, el porcentaje de oxígeno en sangre, etc."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Leer eventos y detalles del calendario"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Esta app puede leer todos los eventos del calendario de tu tablet y compartir o guardar los datos correspondientes."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Esta app puede leer todos los eventos del calendario guardados en el dispositivo Android TV, así como compartir o almacenar los datos correspondientes."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite que la aplicación lea y modifique la configuración de la función No interrumpir."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de vista"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que el propietario inicie el uso de permisos para una app. No debería requerirse para apps normales."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"iniciar vista de funciones de la app"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que el propietario vea la información de las funciones de una app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Acceder a los datos de sensores a una tasa de muestreo alta"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Notificación de app personalizada"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"¿Quieres permitir que <xliff:g id="APP">%1$s</xliff:g> cree un usuario nuevo con <xliff:g id="ACCOUNT">%2$s</xliff:g>? (Ya existe un usuario con esta cuenta)"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"¿Deseas permitir que <xliff:g id="APP">%1$s</xliff:g> cree un usuario nuevo con <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Agregar usuario supervisado"</string>
<string name="language_selection_title" msgid="52674936078683285">"Agregar un idioma"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Preferencia de región"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Nombre del idioma"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index b58d116..21910b9 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permite que la aplicación edite el registro de llamadas de tu dispositivo Android TV, incluidos sus datos sobre llamadas entrantes y salientes. Las aplicaciones maliciosas pueden usar este permiso para borrar o editar el registro de llamadas."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permite que la aplicación modifique el registro de llamadas del teléfono, incluidos datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para borrar o modificar el registro de llamadas."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"sensores corp. (como monitores frec. cardíaca)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permite que la aplicación acceda a datos de sensores que controlan tu condición física, como la frecuencia cardíaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Acceso a datos de sensores corporales, como la frecuencia cardiaca, la temperatura, el porcentaje de oxígeno en sangre, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"acceso a sensores corporales (como monitores de frec. cardiaca) en segundo plano"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Acceso a datos de sensores corporales, como la frecuencia cardiaca, la temperatura, el porcentaje de oxígeno en sangre, etc., en segundo plano."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Leer eventos y detalles del calendario"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Esta aplicación puede leer los eventos de calendario almacenados en tu tablet y compartir o guardar los datos de tu calendario."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Esta aplicación puede ver los eventos de calendario almacenados en tu dispositivo Android TV y compartir o guardar los datos de tu calendario."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite que la aplicación lea y modifique la configuración de No molestar."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de visualización"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que el titular inicie el uso de permisos de una aplicación. Las aplicaciones normales no deberían necesitar nunca este permiso."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ver funciones de una aplicación"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que el titular vea la información de las funciones de una aplicación."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acceder a datos de sensores a una frecuencia de muestreo alta"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Notificación de aplicación personalizada"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"¿Permitir que <xliff:g id="APP">%1$s</xliff:g> cree otro usuario con la cuenta <xliff:g id="ACCOUNT">%2$s</xliff:g>, que ya tiene uno?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"¿Permitir que <xliff:g id="APP">%1$s</xliff:g> cree otro usuario con la cuenta <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Añadir usuario supervisado"</string>
<string name="language_selection_title" msgid="52674936078683285">"Añadir un idioma"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Preferencia de región"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Nombre de idioma"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 3afe63dd..118d605 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Lubab rakendusel muuta teie Android TV seadme kõnelogi, sh sissetulevate ja väljaminevate kõnede andmeid. Pahatahtlikud rakendused võivad kasutada seda kõnelogi kustutamiseks või muutmiseks."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Lubab rakendusel muuta telefoni kõnelogi, sh sissetulevate ja väljaminevate kõnede andmeid. Pahatahtlikud rakendused võivad kasutada seda kõnelogi kustutamiseks või muutmiseks."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"juurdepääs kehaanduritele (nt pulsilugeja)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Lubab rakendusel hankida juurdepääsu andmetele anduritest, mis jälgivad teie füüsilist seisundit, nt südame löögisagedust."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Juurdepääs kehaandurite andmetele, nagu pulss, temperatuur, vere hapnikusisalduse protsent jne."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"taustal töötades juurdepääs kehaanduritele (nt pulsilugeja)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Taustal töötades juurdepääs kehaandurite andmetele, nagu pulss, temperatuur, vere hapnikusisalduse protsent jne."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Kalendrisündmuste ja üksikasjade lugemine"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"See rakendus saab kõiki teie tahvelarvutisse salvestatud kalendrisündmusi lugeda ja teie kalendriandmeid jagada või salvestada."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"See rakendus saab kõiki teie Android TV seadmesse salvestatud kalendrisündmusi lugeda ja teie kalendriandmeid jagada või salvestada."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Võimaldab rakendusel lugeda ja kirjutada funktsiooni Mitte segada seadistusi."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"vaatamisloa kasutamise alustamine"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Võimaldab omanikul rakenduse puhul alustada loa kasutamist. Tavarakenduste puhul ei peaks seda kunagi vaja minema."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"rakenduse funktsioonide vaatamise alustamine"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Võimaldab omanikul alustada rakenduse funktsioonide teabe vaatamist."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"juurdepääs anduri andmetele kõrgel diskreetimissagedusel"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Rakenduse kohandatud märguanne"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Kas lubada rakendusel <xliff:g id="APP">%1$s</xliff:g> luua uus kasutaja kontoga <xliff:g id="ACCOUNT">%2$s</xliff:g> (selle kontoga kasutaja on juba olemas)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Kas lubada rakendusel <xliff:g id="APP">%1$s</xliff:g> luua uus kasutaja kontoga <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Jälgitava kasutaja lisamine"</string>
<string name="language_selection_title" msgid="52674936078683285">"Keele lisamine"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Piirkonnaeelistus"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Sisestage keele nimi"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index b4b4ec2..2c3bdfb 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Android TV gailuko deien erregistroa aldatzeko baimena ematen die aplikazioei, jasotako eta egindako deiei buruzko datuak barne. Baliteke asmo txarreko aplikazioek deien erregistroa ezabatzea edo aldatzea."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Telefonoaren deien erregistroa aldatzeko baimena ematen die aplikazioei, sarrerako eta irteerako deiei buruzko datuak barne. Asmo txarreko aplikazioek deien erregistroa ezabatzeko edo aldatzeko erabil dezakete."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"Atzitu gorputzaren sentsoreak (adibidez, bihotz-maiztasunarenak)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Zure egoera fisikoa kontrolatzen duten sentsoreetako datuak (adibidez, bihotz-maiztasuna) atzitzeko baimena ematen die aplikazioei."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Gorputz-sentsoreen datuak atzitzeko baimena; esate baterako, bihotz-maiztasuna, tenperatura, odolean dagoen oxigenoaren ehunekoa, etab."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"atzitu atzeko planoan gorputz-sentsoreak (adibidez, bihotz-maiztasunaren neurgailuak)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Atzeko planoan gorputz-sentsoreen datuak atzitzeko baimena; esate baterako, bihotz-maiztasuna, tenperatura, odolean dagoen oxigenoaren ehunekoa, etab."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"irakurri egutegiko gertaerak eta xehetasunak"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Aplikazioak tabletan gordetako egutegiko gertaerak irakur ditzake eta egutegiko datuak parteka eta gorde ditzake."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Aplikazioak Android TV gailuan gordeta dituzun egutegiko gertaerak irakur ditzake, baita egutegiko datuak partekatu eta gorde ere."</string>
@@ -617,7 +619,7 @@
<string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Aurrera egiteko, erabili hatz-marka edo pantailaren blokeoa"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
- <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Arazoren bat izan da. Saiatu berriro."</string>
+ <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Arazo bat izan da. Saiatu berriro."</string>
<string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Hatz-markaren ikonoa"</string>
<string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Aurpegi bidez desblokeatzeko eginbidea"</string>
<string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Arazoak ditugu aurpegi bidez desblokeatzeko eginbidearekin"</string>
@@ -671,7 +673,7 @@
<string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Aurrera egiteko, erabili aurpegia edo pantailaren blokeoa"</string>
<string-array name="face_error_vendor">
</string-array>
- <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Arazoren bat izan da. Saiatu berriro."</string>
+ <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Arazo bat izan da. Saiatu berriro."</string>
<string name="face_icon_content_description" msgid="465030547475916280">"Aurpegiaren ikonoa"</string>
<string name="permlab_readSyncSettings" msgid="6250532864893156277">"irakurri sinkronizazio-ezarpenak"</string>
<string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Kontu baten sinkronizazio-ezarpenak irakurtzeko baimena ematen die aplikazioei. Adibidez, Jendea aplikazioa konturen batekin sinkronizatuta dagoen zehatz dezake."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ez molestatzeko moduaren konfigurazioa irakurtzeko eta bertan idazteko baimena ematen die aplikazioei."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"hasi ikusteko baimena erabiltzen"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Aplikazioaren baimena erabiltzen hasteko baimena ematen die titularrei. Aplikazio normalek ez lukete beharko."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"hasi aplikazioaren eginbideak ikusten"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Aplikazio baten eginbideei buruzko informazioa ikusten hasteko baimena ematen die titularrei."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"atzitu sentsoreen datuen laginak abiadura handian"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index b8f2673..050580c 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"به برنامه اجازه میدهد گزارشهای تماس در دستگاه Android TV را تغییر دهد، ازجمله دادههای مربوط به تماسهای ورودی و خروجی. برنامههای مخرب میتوانند از این مجوز برای پاک کردن یا تغییر دادن گزارش تماس شما استفاده کنند."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"به برنامه اجازه میدهد گزارشات تماس تلفنی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"دسترسی به حسگرهای بدن (مانند پایشگرهای ضربان قلب)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"به برنامه امکان میدهد به اطلاعات حسگرهایی که بر شرایط فیزیکی شما مانند ضربان قلبتان، نظارت دارند، دسترسی داشته باشد."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"دسترسی به دادههای حسگرهای بدن مثل ضربان قلب، دما، درصد اکسیژن خون، و غیره."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"دسترسی به حسگرهای بدن (مثل نمایشگرهای ضربان قلب) هنگام اجرا شدن در پسزمینه"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"دسترسی به دادههای حسگرهای بدن مثل ضربان قلب، دما، درصد اکسیژن خون، و غیره، هنگام اجرا شدن در پسزمینه."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"خواندن رویدادها و جزئیات تقویم"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"این برنامه میتواند همه رویدادهای تقویم ذخیرهشده در رایانه لوحی شما را بخواند و دادههای تقویم شما را به اشتراک بگذارد یا ذخیره کند."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"این برنامه میتواند همه رویدادهای تقویم را که در Android TV شما ذخیرهشده بخواند، و دادههای تقویم شما را همرسانی یا ذخیره کند."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"به برنامه امکان میدهد پیکربندی «مزاحم نشوید» را بخواند و بنویسد."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"شروع مشاهده استفاده از مجوز"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"به دارنده اجازه شروع استفاده از مجوز را برای برنامه میدهد. هرگز برای برنامههای معمول نیاز نیست."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"مشاهده ویژگیهای برنامه"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"به دارنده اجازه میدهد اطلاعات مربوط به ویژگیهای برنامه را مشاهده کند."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"دسترسی به دادههای حسگر با نرخ نمونهبرداری بالا"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"اعلان برنامه سفارشی"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"به<xliff:g id="APP">%1$s</xliff:g> اجازه میدهید با <xliff:g id="ACCOUNT">%2$s</xliff:g> (کاربری با این حساب درحالحاضر وجود دارد) کاربری جدید ایجاد کند؟"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"به <xliff:g id="APP">%1$s</xliff:g> اجازه میدهید با <xliff:g id="ACCOUNT">%2$s</xliff:g> کاربری جدید ایجاد کند؟"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"افزودن کاربر تحت نظارت"</string>
<string name="language_selection_title" msgid="52674936078683285">"افزودن زبان"</string>
<string name="country_selection_title" msgid="5221495687299014379">"اولویتهای منطقه"</string>
<string name="search_language_hint" msgid="7004225294308793583">"نام زبان را تایپ کنید"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 618cd52..d511e28 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Antaa sovelluksen muokata Android TV ‑laitteen puhelulokia, kuten tietoja vastatuista ja soitetuista puheluista. Haitalliset sovellukset voivat tyhjentää puhelulokisi tai muokata sitä."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Antaa sovelluksen muokata puhelimesi puhelulokia, kuten tietoja vastatuista ja soitetuista puheluista. Haitalliset sovellukset voivat poistaa puhelulokisi tai muokata sitä."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"käyttää kehon antureita (kuten sykemittareita)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Antaa sovelluksen käyttää kehosi tilaa seuraavien anturien tietoja, esimerkiksi sykettä."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Pääsy kehon antureiden dataan, esim. sykkeeseen, ruumiinlämpöön ja veren happiprosenttiin."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"Pääsy kehon antureihin (kuten sykemittareihin) taustalla"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Pääsy kehon antureiden dataan (esim. sykkeeseen, ruumiinlämpöön ja veren happiprosenttiin) taustalla."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Lue kalenterin tapahtumia ja tietoja"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Tämä sovellus voi lukea kaikkia tabletille tallennettuja kalenteritapahtumia sekä jakaa tai tallentaa kalenteritietoja."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Tämä sovellus voi lukea kaikkia Android TV ‑laitteeseen tallennettuja kalenteritapahtumia sekä jakaa tai tallentaa kalenteritietoja."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Sallii sovelluksen lukea ja muokata Älä häiritse -tilan asetuksia."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"aloita katseluoikeuksien käyttö"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Antaa luvanhaltijan käynnistää sovelluksen käyttöoikeuksien käytön. Ei tavallisten sovelluksien käyttöön."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"aloittaa sovellusominaisuuksien katselun"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Antaa luvanhaltijan aloittaa sovelluksen ominaisuustietojen katselun."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"saada pääsyn anturidataan suuremmalla näytteenottotaajuudella"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Oma sovellusilmoitus"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Saako <xliff:g id="APP">%1$s</xliff:g> luoda uuden käyttäjän (<xliff:g id="ACCOUNT">%2$s</xliff:g>) – tällä käyttäjällä on jo tili?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Saako <xliff:g id="APP">%1$s</xliff:g> luoda uuden käyttäjän (<xliff:g id="ACCOUNT">%2$s</xliff:g>)?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Lisää valvottu käyttäjä"</string>
<string name="language_selection_title" msgid="52674936078683285">"Lisää kieli"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Alueasetus"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Anna kielen nimi"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 4cc5c14..2723a6d 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permet à l\'application de modifier le journal d\'appels de votre appareil Android TV, y compris les données sur les appels entrants et sortants. Des applications malveillantes pourraient utiliser cette fonctionnalité pour effacer ou modifier votre journal d\'appels."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permet à l\'application de lire le journal d\'appels de votre téléphone, y compris les données relatives aux appels entrants et sortants. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier votre journal d\'appels."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"accéder aux capteurs corporels (comme les moniteurs de fréquence cardiaque)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permet à l\'application d\'accéder aux données des capteurs qui surveillent votre condition physique, comme votre rythme cardiaque."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Accès aux données des capteurs corporels comme la fréquence cardiaque, la température, le pourcentage d\'oxygène dans le sang, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"Accès capteurs corporels (comme moniteurs fréquence cardiaque) en arrière-plan"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Accès aux données des capteurs corporels comme la fréquence cardiaque, la température, le pourcentage d\'oxygène dans le sang, etc. en arrière-plan."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Lire les événements d\'agenda et leurs détails"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Cette application peut lire tous les événements d\'agenda stockés sur votre tablette et partager ou enregistrer les données de votre agenda."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Cette application peut lire tous les événements d\'agenda stockés sur votre appareil Android TV et partager ou enregistrer les données de votre agenda."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet à l\'application de consulter et de modifier la configuration du mode Ne pas déranger."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"démarrer l\'affichage de l\'usage des autorisations"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet au détenteur de démarrer l\'usage des autorisations pour une application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"démarrer l\'affichage des fonctionnalités de l\'application"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permet au détenteur de commencer à afficher les renseignements sur les fonctionnalités d\'une application."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"accéder aux données des capteurs à un taux d’échantillonnage élevé"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Notification d\'application personnalisée"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à créer un utilisateur <xliff:g id="ACCOUNT">%2$s</xliff:g>? (Un utilisateur est déjà associé à ce compte)"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à créer un profil d\'utilisateur avec le compte <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Ajouter un utilisateur supervisé"</string>
<string name="language_selection_title" msgid="52674936078683285">"Ajouter une langue"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Préférences régionales"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Entrez la langue"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 19adf8a..365b68f 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permet à l\'application de lire le journal d\'appels de votre appareil Android TV, y compris les données sur les appels entrants et sortants. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier votre journal d\'appels."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permet à l\'application de lire le journal d\'appels de votre téléphone, y compris les données relatives aux appels entrants et sortants. Des applications malveillantes peuvent utiliser cette fonctionnalité pour effacer ou modifier votre journal d\'appels."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"accéder capteurs corp. (ex : cardiofréquencemètres)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permet à l\'application d\'accéder aux données des capteurs qui contrôlent votre condition physique, comme votre rythme cardiaque."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Accès aux données des capteurs corporels mesurant la fréquence cardiaque, la température, le pourcentage d\'oxygène dans le sang, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"accéder en arrière-plan aux capteurs corporels (par ex., cardiofréquencemètres)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Accès en arrière-plan aux données des capteurs corporels mesurant la fréquence cardiaque, la température, le pourcentage d\'oxygène dans le sang, etc."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Lire les événements d\'agenda et les détails associés"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Cette application peut lire tous les événements d\'agenda enregistrés sur votre tablette et partager ou enregistrer vos données d\'agenda."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Cette application peut lire tous les événements de l\'agenda enregistrés sur votre appareil Android TV, et partager ou enregistrer les données de votre agenda."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permet à l\'application de consulter et de modifier la configuration du mode Ne pas déranger."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"activer l\'utilisation de l\'autorisation d\'affichage"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permet à l\'application autorisée d\'activer l\'utilisation de l\'autorisation pour une application. Cette fonctionnalité ne devrait pas être nécessaire pour les applications standards."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"commencer à voir les fonctionnalités d\'une appli"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permet à l\'appli autorisée de commencer à voir les infos sur les fonctionnalités d\'une appli."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"accéder aux données des capteurs à un taux d\'échantillonnage élevé"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Notification d\'application personnalisée"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à créer un profil utilisateur avec le compte <xliff:g id="ACCOUNT">%2$s</xliff:g> (un utilisateur associé à ce compte existe déjà) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à créer un profil utilisateur avec le compte <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Ajouter un utilisateur supervisé"</string>
<string name="language_selection_title" msgid="52674936078683285">"Ajouter une langue"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Préférences régionales"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Saisissez la langue"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index a61ef81..9c0d33a 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permite que a aplicación modifique o rexistro de chamadas do dispositivo Android TV, incluídos os datos acerca de chamadas entrantes e saíntes. As aplicacións maliciosas poden utilizar este permiso para borrar ou modificar o rexistro de chamadas."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permite á aplicación modificar o rexistro de chamadas do teléfono, incluídos os datos acerca de chamadas entrantes e saíntes. É posible que aplicacións maliciosas utilicen esta acción para borrar ou modificar o teu rexistro de chamadas."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"acceder a sensores corporais (como monitores de ritmo cardíaco)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permite que a aplicación acceda aos datos dos sensores que controlan o teu estado físico, como o ritmo cardíaco."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Acceso a datos de sensores corporais, como o ritmo cardíaco, a temperatura, a porcentaxe de osíxeno en sangue etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"acceso en segundo plano a sensores corporais (como monitores de ritmo cardíaco)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Acceso en segundo plano a datos de sensores corporais, como o ritmo cardíaco, a temperatura, a porcentaxe de osíxeno en sangue etc."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Ler os detalles e os eventos do calendario"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Esta aplicación pode ler todos os eventos do calendario almacenados na túa tableta e compartir ou gardar os datos do calendario."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Esta aplicación pode ler todos os eventos do calendario almacenados no dispositivo Android TV e compartir ou gardar os datos do calendario."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite á aplicación ler e escribir a configuración do modo Non molestar."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso de permiso de vista"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite ao propietario iniciar o uso de permisos dunha aplicación. As aplicacións normais non deberían precisalo nunca."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"comezar a ver as funcións da aplicación"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que o propietario comece a ver a información das funcións dunha aplicación."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acceder aos datos dos sensores usando unha taxa de mostraxe alta"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 9971033..2996cc3 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ઍપને ઇનકમિંગ અને આઉટગોઇંગ કૉલ વિશેના ડેટા સહિત, તમારા Android TV ડિવાઇસના કૉલ લૉગને સંશોધિત કરવાની મંજૂરી આપે છે. દુર્ભાવનાપૂર્ણ ઍપ આનો ઉપયોગ તમારા કૉલ લૉગને કાઢી નાખવા અથવા સંશોધિત કરવા માટે કરી શકે છે."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"એપ્લિકેશનને ઇનકમિંગ અને આઉટગોઇંગ કૉલ્સ વિશેનાં ડેટા સહિત, તમારા ફોનના કૉલ લૉગને સંશોધિત કરવાની મંજૂરી આપે છે. દુર્ભાવનાપૂર્ણ ઍપ્લિકેશનો આનો ઉપયોગ તમારા કૉલ લૉગને કાઢી નાખવા અથવા સંશોધિત માટે કરી શકે છે."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"બૉડીસેન્સર્સ ઍક્સેસ(જેમકે હ્રદય ગતી મૉનિટર)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"એપ્લિકેશનને તમારી હૃદય ગતિ જેવી તમારી શારીરિક સ્થિતિને મૉનિટર કરતાં સેન્સર્સથી ડેટા ઍક્સેસ કરવાની મંજૂરી આપે છે."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"બૉડી સેન્સરના ડેટાનો ઍક્સેસ જેમ કે હૃદયના ધબકારા, તાપમાન, લોહીમાં ઑક્સિજનની ટકાવારી વગેરે."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"બૉડી સેન્સર (જેમ કે હૃદયના ધબકારાના નિરીક્ષણો) બૅકગ્રાઉન્ડમાં ઍક્સેસ કરો"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"બૅકગ્રાઉન્ડમાં હોય ત્યારે બૉડી સેન્સરના ડેટાનો ઍક્સેસ જેમ કે હૃદયના ધબકારા, તાપમાન, લોહીમાં ઑક્સિજનની ટકાવારી વગેરે."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"કૅલેન્ડર ઇવેન્ટ્સ અને વિગતો વાંચો"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"આ ઍપ્લિકેશન, તમારા ટેબ્લેટ પર સંગ્રહિત તમામ કૅલેન્ડર ઇવેન્ટ્સને વાંચી શકે છે અને તમારા કૅલેન્ડર ડેટાને શેર કરી અથવા સાચવી શકે છે."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"આ ઍપ, તમારા Android TV ડિવાઇસ પર સંગ્રહિત બધા કૅલેન્ડર ઇવેન્ટને વાંચી શકે છે અને તમારા કૅલેન્ડર ડેટાને શેર કરી અથવા સાચવી શકે છે."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"એપ્લિકેશનને ખલેલ પાડશો નહીં ગોઠવણી વાંચવા અને લખવાની મંજૂરી આપે છે."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"પરવાનગી વપરાશ જુઓને શરૂ કરો"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"કોઈ ઍપ માટે પરવાનગી વપરાશ શરૂ કરવાની ધારકને મંજૂરી આપે છે. સામાન્ય ઍપ માટે ક્યારેય જરૂર પડી ન શકે."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ઍપની સુવિધાઓ જોવા માટેની પરવાનગી ચાલુ કરો"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ધારકને ઍપ માટેની સુવિધાઓની માહિતી જોવાનું શરૂ કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ઉચ્ચ સેમ્પ્લિંગ રેટ પર સેન્સરનો ડેટા ઍક્સેસ કરો"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"ઍપનું કસ્ટમ નોટિફિકેશન"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g>ને <xliff:g id="ACCOUNT">%2$s</xliff:g> માટે એક નવા વપરાશકર્તા બનાવવાની મંજૂરી આપીએ (આ એકાઉન્ટ માટે એક વપરાશકર્તા પહેલાંથી અસ્તિત્વમાં છે) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g>ને <xliff:g id="ACCOUNT">%2$s</xliff:g> માટે એક નવા વપરાશકર્તા બનાવવાની મંજૂરી આપીએ ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"નિરીક્ષિત વપરાશકર્તા ઉમેરો"</string>
<string name="language_selection_title" msgid="52674936078683285">"ભાષા ઉમેરો"</string>
<string name="country_selection_title" msgid="5221495687299014379">"પ્રદેશ પસંદગી"</string>
<string name="search_language_hint" msgid="7004225294308793583">"ભાષાનું નામ ટાઇપ કરો"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index a30c9a9..5c6eaeb 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -303,21 +303,21 @@
<string name="user_owner_label" msgid="8628726904184471211">"प्रोफ़ाइल बदलकर निजी प्रोफ़ाइल पर जाएं"</string>
<string name="managed_profile_label" msgid="7316778766973512382">"प्रोफ़ाइल बदलकर वर्क प्रोफ़ाइल पर जाएं"</string>
<string name="permgrouplab_contacts" msgid="4254143639307316920">"संपर्क"</string>
- <string name="permgroupdesc_contacts" msgid="9163927941244182567">"अपने संपर्कों को ऐक्सेस करने की"</string>
+ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"अपने संपर्कों को ऐक्सेस करें"</string>
<string name="permgrouplab_location" msgid="1858277002233964394">"जगह की जानकारी"</string>
<string name="permgroupdesc_location" msgid="1995955142118450685">"इस डिवाइस की जगह तक पहुंचने दें"</string>
<string name="permgrouplab_calendar" msgid="6426860926123033230">"कैलेंडर"</string>
- <string name="permgroupdesc_calendar" msgid="6762751063361489379">"अपने कैलेंडर को ऐक्सेस करने"</string>
+ <string name="permgroupdesc_calendar" msgid="6762751063361489379">"अपने कैलेंडर को ऐक्सेस करें"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"मैसेज (एसएमएस)"</string>
<string name="permgroupdesc_sms" msgid="5726462398070064542">"मैसेज (एसएमएस) भेजें और देखें"</string>
<string name="permgrouplab_storage" msgid="1938416135375282333">"फ़ाइलें और मीडिया"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें ऐक्सेस करने की"</string>
+ <string name="permgroupdesc_storage" msgid="6351503740613026600">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया, और फ़ाइलें ऐक्सेस करें"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"माइक्रोफ़ोन"</string>
<string name="permgroupdesc_microphone" msgid="1047786732792487722">"ऑडियो रिकॉर्ड करें"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"शारीरिक गतिविधि"</string>
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"शारीरिक गतिविधि की जानकारी पा सकता है"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"कैमरा"</string>
- <string name="permgroupdesc_camera" msgid="7585150538459320326">"चित्र लेने और वीडियो रिकॉर्ड करने"</string>
+ <string name="permgroupdesc_camera" msgid="7585150538459320326">"फ़ोटो खीचें और वीडियो रिकॉर्ड करें"</string>
<string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"आस-पास मौजूद डिवाइस"</string>
<string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"आस-पास मौजूद डिवाइस खोजें और उनसे कनेक्ट करें"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"कॉल लॉग"</string>
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"यह ऐप्लिकेशन को आपके Android TV डिवाइस के कॉल लॉग में बदलाव करने की अनुमति देता है. इसमें किसी को की गई (आउटगोइंग) कॉल और किसी से मिली (इनकमिंग) कॉल शामिल हैं. हालांकि, नुकसान पहुंचाने वाले ऐप्लिकेशन इसका इस्तेमाल करके कॉल लॉग को मिटा सकते हैं या बदल सकते हैं."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ऐप को आने वाला कॉल (इनकमिंग) और किया जाने वाला कॉल (आउटगोइंग) डेटा सहित, आपके फ़ोन के कॉल लॉग को बदलने की अनुमति देता है. धोखा देने वाले ऐप, इसका इस्तेमाल करके आपके कॉल लॉग को मिटा या बदल सकते हैं."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"शरीर के लिए बने सेंसर (जैसे हृदय गति मॉनीटर) को ऐक्सेस करें"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"ऐप को आपकी शारीरिक स्थिति, जैसे आपकी हृदय गति पर नज़र रखने वाले सेंसर के डेटा तक पहुंचने देती है."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"बॉडी सेंसर से मिले डेटा का ऐक्सेस, जैसे कि धड़कन की दर, तापमान, खून में मौजूद ऑक्सीजन का प्रतिशत वगैरह."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"बैकग्राउंड में काम करने वाले बॉडी सेंसर (जैसे, धड़कन की दर मापने वाले मॉनिटर) से मिले डेटा का ऐक्सेस"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"बैकग्राउंड में काम करने वाले बॉडी सेंसर से मिले डेटा का ऐक्सेस, जैसे कि धड़कन की दर, तापमान, खून में मौजूद ऑक्सीजन का प्रतिशत वगैरह."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"कैलेंडर इवेंट और विवरण पढ़ें"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"यह ऐप्लिकेशन आपके टैबलेट पर संग्रहित सभी कैलेंडर इवेंट पढ़ सकता है और आपका कैलेंडर डेटा शेयर कर सकता है या सहेज सकता है."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"यह ऐप्लिकेशन आपके टीवी पर सेव किए गए सभी कैलेंडर इवेंट को पढ़ सकता है. इसके अलावा यह आपके कैलेंडर का डेटा शेयर कर सकता है या सेव कर सकता है."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ऐप को परेशान न करें कॉन्फ़िगरेशन पढ़ने और लिखने देती है."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"देखने की अनुमतियां चालू करें"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"इस्तेमाल करने वाले को किसी ऐप्लिकेशन के लिए अनुमतियों का इस्तेमाल शुरू करने देता है. सामान्य ऐप्लिकेशन के लिए इसकी ज़रूरत कभी नहीं पड़ती."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ऐप्लिकेशन की सुविधाओं को देखना शुरू करें"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ऐप्लिकेशन को, किसी ऐप्लिकेशन की सुविधाओं की जानकारी देखने की अनुमति देता है."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"सेंसर डेटा को, नमूने लेने की तेज़ दर पर ऐक्सेस करें"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 6afc049..15f59dc 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -430,7 +430,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Aplikaciji omogućuje izmjenu zapisnika poziva vašeg Android TV uređaja, uključujući podatke o dolaznim i odlaznim pozivima. Zlonamjerne aplikacije to mogu upotrijebiti za brisanje ili izmjenu zapisnika poziva."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Aplikaciji omogućuje izmjenu dnevnika poziva vašeg telefona zajedno s podacima o dolaznim i odlaznim pozivima. Zlonamjerne aplikacije to mogu upotrebljavati za brisanje ili izmjenu vašeg dnevnika poziva."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"pristupati biometrijskim senzorima (kao što su monitori otkucaja srca)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Omogućuje aplikaciji pristup podacima sa senzora koji nadziru vaše fizičko stanje, na primjer, broj otkucaja srca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Pristupite podacima biometrijskih senzora kao što su puls, temperatura, postotak kisika u krvi itd."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"pristup biometrijskim senzorima (kao što su monitori pulsa) u pozadini"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Pristupite podacima biometrijskih senzora kao što su puls, temperatura, postotak kisika u krvi itd. u pozadini."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Čitanje događaja i pojedinosti kalendara"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Aplikacija može čitati sve kalendarske događaje pohranjene na tabletu i dijeliti ili spremati podatke iz vašeg kalendara."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Aplikacija može čitati sve kalendarske događaje pohranjene na Android TV uređaju i dijeliti ili spremati podatke iz vašeg kalendara."</string>
@@ -734,6 +736,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Omogućuje aplikaciji čitanje i pisanje konfiguracije opcije Ne uznemiravaj."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pokrenuti upotrebu dopuštenja za pregled"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dopušta nositelju pokretanje upotrebe dopuštenja za aplikaciju. Ne bi smjelo biti potrebno za uobičajene aplikacije."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"pokretanje prikaza značajki aplikacije"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Dopušta nositelju pokretanje prikaza informacija o značajkama aplikacije."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pristup podacima senzora pri višoj brzini uzorkovanja"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index c736246..b7e35cf2 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Lehetővé teszi, hogy az alkalmazás módosítsa az Android TV eszköz híváslistáját, beleértve a bejövő és kimenő hívások adatait is. A rosszindulatú alkalmazások ezt felhasználhatják a híváslista törlésére vagy módosítására."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Lehetővé teszi, hogy az alkalmazás módosítsa a telefon híváslistáját, beleértve a bejövő és kimenő hívások adatait is. A rosszindulatú alkalmazások ezt arra használhatják, hogy híváslistáját töröljék vagy módosítsák."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"hozzáférés a testérzékelőkhöz (például pulzusmérők)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Engedélyezi az alkalmazásnak, hogy hozzáférjen az Ön fizikai állapotát – például a pulzusszámát – figyelő érzékelők adataihoz."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Hozzáférhet olyan, testérzékelőktől származó adatokhoz, mint a pulzusszám, a testhőmérséklet, a véroxigénszint stb."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"hozzáférés a háttérben futó testérzékelőkhöz (például pulzusmérők)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Hozzáférhet olyan, a háttérben futó testérzékelőktől származó adatokhoz, mint a pulzusszám, a testhőmérséklet, a véroxigénszint stb."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Naptáresemények és a naptári adatok olvasása"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Az alkalmazás olvashatja a táblagépen tárolt összes naptáreseményt, és megoszthatja vagy mentheti a naptáradatokat."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Az alkalmazás olvashatja az Android TV eszközön tárolt összes naptáreseményt, és megoszthatja vagy mentheti a naptáradatokat."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Az alkalmazás olvashatja és szerkesztheti a „Ne zavarjanak” funkció beállításait."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"engedélyhasználat megtekintésének elindítása"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lehetővé teszi a felhasználó számára, hogy elindítsa az alkalmazás engedélyhasználatát. A normál alkalmazásoknak erre soha nincs szükségük."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"alkalmazásfunkciók megtekintésének megkezdése"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Engedélyezi az alkalmazás számára, hogy megkezdje az alkalmazások funkcióira vonatkozó adatok megtekintését."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"hozzáférés a szenzoradatokhoz nagy mintavételezési gyakorisággal"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 4f8f8e8..13d8780 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Թույլ է տալիս հավելվածին փոփոխել Android TV սարքի զանգերի մատյանը, այդ թվում՝ մուտքային և ելքային զանգերի մասին տվյալները: Վնասարար հավելվածները կարող են սա օգտագործել՝ ձեր զանգերի մատյանը ջնջելու կամ փոփոխելու համար:"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Թույլ է տալիս հավելվածին փոփոխել ձեր հեռախոսի զանգերի մատյանը, այդ թվում` մուտքային և ելքային զանգերի մասին տվյալները: Վնասարար հավելվածները կարող են սա օգտագործել` ձեր զանգերի մատյանը ջնջելու կամ փոփոխելու համար:"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"օգտագործել մարմնի սենսորները (օրինակ՝ սրտի կծկումների հաճախականության չափիչ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Հավելվածին թույլ է տալիս մուտք ունենալ սենսորների տվյալներին, որոնք վերահսկում են ձեր ֆիզիկական վիճակը, օրինակ՝ ձեր սրտի զարկերը:"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Մարմնի սենսորների տվյալների (օրինակ՝ սրտի զարկերի հաճախականության, ջերմաստիճանի, արյան մեջ թթվածնի տոկոսային պարունակության ցուցանիշների) օգտագործման թույլտվություն"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ֆոնային ռեժիմում մարմնի սենսորների տվյալների օգտագործման թույլտվություն"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Ֆոնային ռեժիմում մարմնի սենսորների տվյալների (օրինակ՝ սրտի զարկերի հաճախականության, ջերմաստիճանի, արյան մեջ թթվածնի տոկոսային պարունակության ցուցանիշների) օգտագործման թույլտվություն"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Կարդալ օրացույցի միջոցառումները և տվյալները"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Այս հավելվածը կարող է կարդալ օրացույցի՝ ձեր պլանշետում պահված բոլոր միջոցառումները, ինչպես նաև հրապարակել կամ պահել ձեր օրացույցի տվյալները:"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Այս հավելվածը կարող է կարդալ օրացույցի՝ ձեր Android TV սարքում պահված բոլոր միջոցառումները, ինչպես նաև հրապարակել կամ պահել ձեր օրացույցի տվյալները:"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Թույլ է տալիս հավելվածին փոփոխել «Չանհանգստացնել» գործառույթի կազմաձևումը:"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"թույլտվությունների մասին տվյալների հասանելիություն"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Հավելվածին հասանելի կդառնան թույլտվությունների մասին տվյալները։ Այս թույլտվությունն անհրաժեշտ չէ սովորական հավելվածներին։"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"հավելվածի գործառույթների դիտում"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Թույլ է տալիս դիտել հավելվածի գործառույթների մասին տեղեկությունները։"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"օգտագործել սենսորների տվյալները բարձր հաճախականության վրա"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 1457450..997b25e 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -226,9 +226,9 @@
<string name="reboot_to_update_title" msgid="2125818841916373708">"Pemutakhiran sistem Android"</string>
<string name="reboot_to_update_prepare" msgid="6978842143587422365">"Bersiap untuk memperbarui..."</string>
<string name="reboot_to_update_package" msgid="4644104795527534811">"Memproses pembaruan paket…"</string>
- <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Memulai kembali…"</string>
+ <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Memulai ulang…"</string>
<string name="reboot_to_reset_title" msgid="2226229680017882787">"Kembalikan ke setelan pabrik"</string>
- <string name="reboot_to_reset_message" msgid="3347690497972074356">"Memulai kembali…"</string>
+ <string name="reboot_to_reset_message" msgid="3347690497972074356">"Memulai ulang…"</string>
<string name="shutdown_progress" msgid="5017145516412657345">"Sedang mematikan..."</string>
<string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"Tablet Anda akan dimatikan."</string>
<string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"Perangkat Android TV akan dimatikan."</string>
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Mengizinkan aplikasi mengubah log panggilan perangkat Android TV, termasuk data tentang panggilan masuk dan keluar. Aplikasi berbahaya dapat menggunakan izin ini untuk menghapus atau mengubah log panggilan Anda."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Memungkinkan apl memodifikasi log panggilan ponsel Anda, termasuk data tentang panggilan masuk dan keluar. Apl berbahaya dapat menggunakan ini untuk menghapus atau memodifikasi log panggilan Anda."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"akses sensor tubuh (misalnya, monitor detak jantung)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Mengizinkan aplikasi untuk mengakses data dari sensor yang memantau kondisi fisik Anda, seperti denyut jantung."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Akses ke data dari sensor tubuh seperti detak jantung, suhu, persentase oksigen dalam darah, dan lainnya."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"akses sensor tubuh (misalnya, monitor detak jantung) saat di latar belakang"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Akses ke data dari sensor tubuh seperti detak jantung, suhu, persentase oksigen dalam darah, dan lainnya saat di latar belakang."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Baca acara kalender dan detailnya"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Aplikasi ini dapat membaca semua acara kalender yang tersimpan di tablet dan membagikan atau menyimpan data kalender."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Aplikasi ini dapat membaca semua acara kalender yang tersimpan di perangkat Android TV dan membagikan atau menyimpan data kalender."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Mengizinkan aplikasi membaca dan menulis konfigurasi status Jangan Ganggu."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"mulai melihat penggunaan izin"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Memungkinkan pemegang memulai penggunaan izin untuk aplikasi. Tidak diperlukan untuk aplikasi normal."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"mulai lihat fitur aplikasi"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Memungkinkan pemegang mulai melihat info fitur untuk aplikasi."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"mengakses data sensor pada frekuensi pengambilan sampel yang tinggi"</string>
@@ -1366,7 +1372,7 @@
<string name="sim_done_button" msgid="6464250841528410598">"Selesai"</string>
<string name="sim_added_title" msgid="7930779986759414595">"Kartu SIM ditambahkan"</string>
<string name="sim_added_message" msgid="6602906609509958680">"Mulai ulang perangkat Anda untuk mengakses jaringan selular."</string>
- <string name="sim_restart_button" msgid="8481803851341190038">"Nyalakan Ulang"</string>
+ <string name="sim_restart_button" msgid="8481803851341190038">"Mulai Ulang"</string>
<string name="install_carrier_app_notification_title" msgid="5712723402213090102">"Aktifkan layanan seluler"</string>
<string name="install_carrier_app_notification_text" msgid="2781317581274192728">"Download aplikasi operator untuk mengaktifkan SIM baru"</string>
<string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"Download aplikasi <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengaktifkan SIM baru"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Notifikasi aplikasi kustom"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Izinkan <xliff:g id="APP">%1$s</xliff:g> membuat Pengguna baru dengan <xliff:g id="ACCOUNT">%2$s</xliff:g> (Pengguna dengan akun ini sudah ada) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Izinkan <xliff:g id="APP">%1$s</xliff:g> membuat Pengguna baru dengan <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Tambahkan pengguna yang diawasi"</string>
<string name="language_selection_title" msgid="52674936078683285">"Tambahkan bahasa"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Preferensi wilayah"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Ketik nama bahasa"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index cd28dc9..99e4d1a 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Leyfir forritinu að breyta símtalaskrá Android TV tækisins, þ. á m. gögnum um hringd og móttekin símtöl. Spilliforrit geta notað þetta til að eyða eða breyta símtalaskránni."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Leyfir forriti að breyta símtalaskrá símans, þ. á m. gögnum um hringd og móttekin símtöl. Spilliforrit geta notað þetta til að eyða eða breyta símtalaskránni."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"fá aðgang að líkamsskynjurum (s.s. hjartsláttarmælum)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Veitir forritinu aðgang að gögnum frá skynjurum sem fylgjast með líkamsstarfsemi þinni, svo sem hjartslætti."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Aðgangur að gögnum frá líkamsskynjurum, svo sem um hjartslátt, hitastig, súrefnismettun í blóði o.s.frv."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"aðgangur að líkamsskynjurum (svo sem púlsmælum) í bakgrunni"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Aðgangur að gögnum frá líkamsskynjurum, svo sem um hjartslátt, hitastig, súrefnismettun í blóði o.s.frv. í bakgrunni."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Lesa dagatalsviðburði og upplýsingar"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Þetta forrit getur lesið alla dagatalsviðburði sem eru vistaðir í spjaldtölvunni og deilt eða vistað dagatalsgögnin þín."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Þetta forrit getur lesið alla dagatalsviðburði sem eru vistaðir í Android TV og deilt eða vistað dagatalsgögnin þín."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Leyfir forriti að lesa og skrifa í grunnstillingu „Ónáðið ekki“."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"heimildanotkun upphafsyfirlits"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Leyfir handhafa að byrja heimildanotkun fyrir forrit. Ætti aldrei að þurfa fyrir venjuleg forrit."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"byrja að skoða eiginleika forrits"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Leyfir handhafa að skoða upplýsingar um eiginleika tiltekins forrits."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"aðgangur að skynjaragögnum með hárri upptökutíðni"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Sérsniðin forritatilkynning"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Viltu leyfa <xliff:g id="APP">%1$s</xliff:g> að stofna nýjan notanda með <xliff:g id="ACCOUNT">%2$s</xliff:g> (notandi með þennan reikning er þegar fyrir hendi)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Leyfa <xliff:g id="APP">%1$s</xliff:g> að stofna nýjan notanda með <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Bæta við stýrðum notanda"</string>
<string name="language_selection_title" msgid="52674936078683285">"Bæta við tungumáli"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Svæðisval"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Sláðu inn heiti tungumáls"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 6571f23..4b3f305 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -303,29 +303,29 @@
<string name="user_owner_label" msgid="8628726904184471211">"Passa al profilo personale"</string>
<string name="managed_profile_label" msgid="7316778766973512382">"Passa a profilo di lavoro"</string>
<string name="permgrouplab_contacts" msgid="4254143639307316920">"Contatti"</string>
- <string name="permgroupdesc_contacts" msgid="9163927941244182567">"accedere ai contatti"</string>
+ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"Possono accedere ai contatti"</string>
<string name="permgrouplab_location" msgid="1858277002233964394">"Posizione"</string>
- <string name="permgroupdesc_location" msgid="1995955142118450685">"accedere alla posizione di questo dispositivo"</string>
+ <string name="permgroupdesc_location" msgid="1995955142118450685">"Possono accedere alla posizione di questo dispositivo"</string>
<string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendario"</string>
- <string name="permgroupdesc_calendar" msgid="6762751063361489379">"accedere al calendario"</string>
+ <string name="permgroupdesc_calendar" msgid="6762751063361489379">"Possono accedere al calendario"</string>
<string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="5726462398070064542">"inviare e visualizzare SMS"</string>
- <string name="permgrouplab_storage" msgid="1938416135375282333">"File e contenuti multimediali"</string>
- <string name="permgroupdesc_storage" msgid="6351503740613026600">"accedere a foto, contenuti multimediali e file sul dispositivo"</string>
+ <string name="permgroupdesc_sms" msgid="5726462398070064542">"Possono inviare e visualizzare SMS"</string>
+ <string name="permgrouplab_storage" msgid="1938416135375282333">"File/contenuti multimediali"</string>
+ <string name="permgroupdesc_storage" msgid="6351503740613026600">"Possono accedere a foto, contenuti multimediali e file sul dispositivo"</string>
<string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfono"</string>
- <string name="permgroupdesc_microphone" msgid="1047786732792487722">"registrare audio"</string>
+ <string name="permgroupdesc_microphone" msgid="1047786732792487722">"Possono registrare audio"</string>
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Attività fisica"</string>
- <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"Consente di accedere all\'attività fisica"</string>
+ <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"Possono accedere all\'attività fisica"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"Fotocamera"</string>
- <string name="permgroupdesc_camera" msgid="7585150538459320326">"scattare foto e registrare video"</string>
+ <string name="permgroupdesc_camera" msgid="7585150538459320326">"Possono scattare foto e registrare video"</string>
<string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivi nelle vicinanze"</string>
<string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"Consente di rilevare dispositivi nelle vicinanze e di connettersi a tali dispositivi"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"Registri chiamate"</string>
- <string name="permgroupdesc_calllog" msgid="2026996642917801803">"leggere e modificare il registro chiamate del telefono"</string>
+ <string name="permgroupdesc_calllog" msgid="2026996642917801803">"Possono leggere e modificare il registro chiamate del telefono"</string>
<string name="permgrouplab_phone" msgid="570318944091926620">"Telefono"</string>
- <string name="permgroupdesc_phone" msgid="270048070781478204">"eseguire e gestire le telefonate"</string>
+ <string name="permgroupdesc_phone" msgid="270048070781478204">"Possono eseguire e gestire le telefonate"</string>
<string name="permgrouplab_sensors" msgid="9134046949784064495">"Sensori del corpo"</string>
- <string name="permgroupdesc_sensors" msgid="2610631290633747752">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
+ <string name="permgroupdesc_sensors" msgid="2610631290633747752">"Possono accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string>
<string name="permgrouplab_notifications" msgid="5472972361980668884">"Notifiche"</string>
<string name="permgroupdesc_notifications" msgid="4608679556801506580">"Visualizzazione di notifiche"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"Recuperare contenuti della finestra"</string>
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Consente all\'app di modificare il registro chiamate del dispositivo Android TV, inclusi i dati relativi alle chiamate in arrivo e in uscita. Le app dannose potrebbero farne uso per cancellare o modificare il registro chiamate."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Consente all\'applicazione di modificare il registro chiamate del telefono, inclusi i dati sulle chiamate in arrivo e in uscita. Le applicazioni dannose potrebbero farne uso per cancellare o modificare il registro chiamate."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"accesso ai sensori (come il cardiofrequenzimetro)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Consente all\'app di accedere ai dati relativi ai sensori che monitorano le tue condizioni fisiche, ad esempio la frequenza cardiaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Accedere ai dati dei sensori del corpo, ad esempio a frequenza cardiaca, temperatura, percentuale di ossigeno nel sangue e così via."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"Accesso ai sensori del corpo (come i cardiofrequenzimetri) in background"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Accedere ai dati dei sensori del corpo, ad esempio a frequenza cardiaca, temperatura, percentuale di ossigeno nel sangue e così via in background."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"lettura di eventi di calendario e dettagli"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Questa app può leggere tutti gli eventi di calendario memorizzati sul tablet e condividere o salvare i dati di calendario."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Questa app può leggere tutti gli eventi di calendario memorizzati sul dispositivo Android TV e condividere o salvare i dati di calendario."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Consente all\'app di leggere e modificare la configurazione della funzione Non disturbare."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"avvio dell\'uso dell\'autorizzazione di visualizzazione"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Consente al titolare di avviare l\'uso delle autorizzazioni per un\'app. Non dovrebbe essere mai necessaria per le normali applicazioni."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"Inizio della visualizzazione di funzionalità delle app"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Consente all\'app che ha questa autorizzazione di iniziare a visualizzare le informazioni relative alle funzionalità di un\'app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Accesso ai dati dei sensori a una frequenza di campionamento elevata"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 4214bc2..bdc87fe 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"מאפשרת לאפליקציה לשנות את יומן השיחות של מכשיר ה-Android TV, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות להשתמש בכך כדי למחוק או לשנות את יומן השיחות."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"מאפשרת לאפליקציה לשנות את יומן השיחות של הטלפון, כולל נתונים על שיחות נכנסות ויוצאות. אפליקציות זדוניות עלולות לעשות בכך שימוש כדי למחוק או לשנות את יומן השיחות שלך."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"גישה אל חיישני גוף (כמו מוניטורים לקצב לב)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"מאפשרת לאפליקציה לגשת אל נתוני חיישנים העוקבים אחר מצבך הגופני, כמו קצב הלב."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"גישה לנתונים מחיישנים גופניים כמו דופק, חום גוף, שיעור החמצן בדם ועוד."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"גישה לחיישנים גופניים (כמו מוניטורים למדידת דופק) תוך כדי פעילות ברקע"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"גישה לנתונים מחיישנים גופניים, כמו דופק, חום גוף, שיעור החמצן בדם, תוך כדי פעילות ברקע."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"קריאה של אירועי יומן והפרטים שלהם"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"האפליקציה הזו יכולה לקרוא את כל אירועי היומן המאוחסנים בטאבלט, ולשתף או לשמור את נתוני היומן."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"האפליקציה הזו יכולה לקרוא את כל אירועי היומן המאוחסנים במכשיר ה-Android TV, ולשתף או לשמור את נתוני היומן."</string>
@@ -737,6 +739,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"מאפשרת לאפליקציה לקרוא ולכתוב את התצורה של התכונה \'נא לא להפריע\'."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"התחלת צפייה בהרשאות השימוש"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"מאפשרת לבעלים להפעיל את השימוש בהרשאות עבור אפליקציה מסוימת. הרשאה זו אף פעם לא נדרשת עבור אפליקציות רגילות."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"התחלת צפייה בהרשאות של אפליקציות"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"בעלי ההרשאה יוכלו להתחיל לצפות בפרטי התכונות של אפליקציות."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"גישה לנתוני חיישנים בתדירות דגימה גבוהה"</string>
@@ -1348,7 +1354,7 @@
<string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"הוגדר רינגטון שקט"</string>
<string name="volume_call" msgid="7625321655265747433">"עוצמת קול בשיחה"</string>
<string name="volume_bluetooth_call" msgid="2930204618610115061">"עוצמת הקול בשיחה ב-Bluetooth"</string>
- <string name="volume_alarm" msgid="4486241060751798448">"עוצמת קול של התראה"</string>
+ <string name="volume_alarm" msgid="4486241060751798448">"עוצמת הקול של השעון המעורר"</string>
<string name="volume_notification" msgid="6864412249031660057">"עוצמת הקול של ההתראות"</string>
<string name="volume_unknown" msgid="4041914008166576293">"עוצמת קול"</string>
<string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"עוצמת הקול של Bluetooth"</string>
@@ -2053,8 +2059,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"התראות אפליקציה בהתאמה אישית"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"האם לאפשר לאפליקציה <xliff:g id="APP">%1$s</xliff:g> ליצור משתמש חדש באמצעות <xliff:g id="ACCOUNT">%2$s</xliff:g> (כבר קיים משתמש לחשבון הזה)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"לאפשר לאפליקציה <xliff:g id="APP">%1$s</xliff:g> ליצור משתמש חדש באמצעות <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"הוספת משתמש בפיקוח"</string>
<string name="language_selection_title" msgid="52674936078683285">"הוספת שפה"</string>
<string name="country_selection_title" msgid="5221495687299014379">"העדפת אזור"</string>
<string name="search_language_hint" msgid="7004225294308793583">"יש להקליד את שם השפה"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 7a6b566..e6e2ed8 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Android TV デバイスの通話履歴(着信や発信のデータなど)の変更をアプリに許可します。この許可を悪意のあるアプリに利用されると、通話履歴が消去または変更される恐れがあります。"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"モバイル デバイスの通話履歴(着信や発信のデータなど)の変更をアプリに許可します。この許可を悪意のあるアプリに利用されると、通話履歴が消去または変更される恐れがあります。"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"ボディーセンサー(心拍数モニターなど)へのアクセス"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"心拍数など、身体状態を監視するセンサーからのデータにアクセスすることをアプリに許可します。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"心拍数、体温、血液中の酸素の割合などのボディセンサー データにアクセスする権限です。"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ボディセンサー(心拍数モニター)のデータへのバックグラウンドでのアクセス権限"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"心拍数、体温、血液中の酸素の割合などのボディセンサー データにバックグラウンドでアクセスする権限です。"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"カレンダーの予定と詳細を読み取り"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"このアプリは、お使いのタブレットに保存されたカレンダーの予定をすべて読み取り、カレンダーのデータを共有したり、保存したりできます。"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"このアプリは、Android TV デバイスに保存されているカレンダーの予定をすべて読み取り、カレンダーのデータを共有したり、保存したりできます。"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"サイレント モード設定の読み取りと書き込みをアプリに許可します。"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"表示権限の使用の開始"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"アプリの権限使用の開始を所有者に許可します。通常のアプリでは不要です。"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"アプリ機能の表示の開始"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"アプリの機能情報の表示の開始を所有者に許可します。"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"高サンプリング レートでセンサーデータにアクセスする"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 6ab9312..16f3fe0 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ნებას რთავს აპს, შეცვალოს თქვენს Android TV მოწყობილობაზე ზარების ჟურნალი, შემომავალი და გამავალი ზარების მონაცემთა ჩათვლით. მავნე აპებს შეუძლიათ, ამის მეშვეობით, ამოშალონ ან შეცვალონ თქვენი ზარების ჟურნალი."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"აპს შეეძლება, შეცვალოს თქვენი ტელეფონის ზარების ჟურნალი, მათ შორის შემომავალი და გამავალი ზარების მონაცემები. მავნე აპებმა შეიძლება გამოიყენონ ეს თქვენი ზარების ჟურნალის წასაშლელად ან შესაცვლელად."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"სხეულის სენსორებზე წვდომა (მაგ., გულისცემის მონიტორები)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"აპისთვის ნების დართვა, რათა მას ჰქონდეს წვდომა თქვენი ფიზიკური მდგომარეობის მონიტორინგის სენსორების მონაცემებზე."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"წვდომა სხეულის ისეთ სენსორებზე, როგორიცაა გულისცემის სიხშირე, ტემპერატურა, სისხლში ჟანგბადის პროცენტული შემცველობა და ა.შ."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"სხეულის სენსორებზე წვდომა (მაგ., გულისცემის სიხშ. მონ.) ფონურ რეჟიმში მუშაობისას"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"წვდომა სხეულის ისეთ სენსორებზე, როგორიცაა გულისცემის სიხშირე, ტემპერატურა, სისხლში ჟანგბადის პროცენტული შემცველობა და ა.შ. ფონურ რეჟიმში მუშაობისას."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"კალენდრის მოვლენებისა და დეტალების წაკითხვა"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ამ აპს შეუძლია თქვენს ტაბლეტში შენახული კალენდრის ყველა მოვლენის წაკითხვა და თქვენი კალენდრის მონაცემების გაზიარება ან შენახვა."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ამ აპს შეუძლია თქვენს Android TV მოწყობილობაზე შენახული კალენდრის ყველა მოვლენის წაკითხვა და თქვენი კალენდრის მონაცემების გაზიარება ან შენახვა."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"საშუალებას აძლევს აპს, წაიკითხოს და დაწეროს კონფიგურაცია „არ შემაწუხოთ“."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ნახვის ნებართვის გამოყენების დაწყება"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"მფლობელს საშუალებას აძლევს, დაიწყოს აპის ნებართვის გამოყენება. ჩვეულებრივი აპებისთვის არასოდეს უნდა იყოს საჭირო."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"აპის ფუნქციების ნახვის დაწყება"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"მფლობელს საშუალებას აძლევს, დაიწყოს აპის ფუნქციების ინფორმაციის ნახვა."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"სენსორის მონაცემებზე წვდომა სემპლინგის მაღალი სიხშირით"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index b231be1..155a77a 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Қолданба Android TV құрылғысының қоңыраулар журналын, сонымен қатар кіріс және шығыс қоңыраулар туралы деректерді өзгерте алатын болады. Қоңыраулар журналын деректерден тазарту немесе оны өзгерту үшін зиянды қолданбалар осы рұқсатты пайдалануы мүмкін."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Қолданбаға сіздің телефоныңыздың қоңырау тіркеуін, келетін немесе шығатын қоңыраулар туралы деректерді қоса, өзгерту мүмкіндігін береді. Залалды қолданбалар бұны сіздің қоңырау тіркеуіңізді өшіру үшін қолдануы мүмкін."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"дене датчиктеріне (мысалы, жүрек соғу жиілігінің мониторларына) қатынасу"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Қолданбаға жүрек соғу жиілігіңіз сияқты дене күйіңізді бақылайтын сенсорлардың деректеріне қатынасуға рұқсат етеді."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Жүрек қағысы, температура, қандағы оттегі пайызы және т.б. сияқты дене датчиктерінен алынған деректерді пайдалану."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"дене датчиктерін (мысалы, жүрек қағысын өлшегіштерді) фондық режимде пайдалану"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Жүрек қағысы, температура, қандағы оттегі пайызы және т.б. сияқты дене датчиктерінен алынған деректерді фондық режимде пайдалану."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Күнтізбе оқиғалары мен мәліметтерін оқу"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Бұл қолданба планшетте сақталған барлық күнтізбе оқиғаларын оқи алады және күнтізбе деректерін бөлісе не сақтай алады."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Бұл қолданба Android TV құрылғыңызда сақталған барлық күнтізбе оқиғаларын оқи алады және күнтізбе деректерін бөлісе не сақтай алады."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Қолданбаға «Мазаламау» конфигурациясын оқу және жазу мүмкіндігін береді."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"рұқсаттарды пайдалану туралы деректерді көру"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Пайдаланушы қолданбаға берілетін рұқсаттарды басқара алады. Ондай рұқсаттар әдеттегі қолданбаларға керек емес."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"қолданба функцияларын көре бастау"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Қолданбаға функциялар туралы ақпаратты көре бастауды кідіртуге мүмкіндік береді."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"жоғары дискретизация жиілігіндегі датчик деректерін пайдалану"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Арнаулы хабар хабарландыруы"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g> қолданбасына <xliff:g id="ACCOUNT">%2$s</xliff:g> аккаунты бар жаңа пайдаланушы (мұндай аккаунтқа ие пайдаланушы бұрыннан бар) жасауға рұқсат етілсін бе?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g> қолданбасына <xliff:g id="ACCOUNT">%2$s</xliff:g> аккаунты бар жаңа пайдаланушы жасауға рұқсат етілсін бе?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Бақыланатын пайдаланушыны қосу"</string>
<string name="language_selection_title" msgid="52674936078683285">"Тіл қосу"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Аймақ параметрі"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Тіл атауын теріңіз"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 6d72625..8021330 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"អនុញ្ញាតឱ្យកម្មវិធីកែកំណត់ហេតុហៅទូរសព្ទនៃឧបករណ៍ Android TV របស់អ្នក រួមទាំងទិន្នន័យអំពីការហៅចូល និងការហៅចេញផងដែរ។ កម្មវិធីគ្រោះថ្នាក់អាចប្រើការអនុញ្ញាតនេះ ដើម្បីលុប ឬកែកំណត់ហេតុហៅទូរសព្ទរបស់អ្នក។"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ឲ្យកម្មវិធីកែបញ្ជីហៅនៃទូរស័ព្ទរបស់អ្នក រួមមានទិន្នន័យអំពីការហៅចូល និងចេញ។ កម្មវិធីព្យាបាទអាចប្រើវា ដើម្បីលុប ឬកែបញ្ជីការហៅរបស់អ្នក។"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"ចូលដំណើរការឧបករណ៍ចាប់សញ្ញារាងកាយ (ដូចជាម៉ាស៊ីនវាស់ចង្វាក់បេះដូង)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"ឲ្យកម្មវិធីចូលដំណើរការទិន្នន័យពីឧបករណ៍ចាប់សញ្ញាដែលតាមដានលក្ខខណ្ឌសុខភាពរបស់អ្នក ដូចជាចង្វាក់បេះដូង។"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"សិទ្ធិចូលប្រើទិន្នន័យពីឧបករណ៍ចាប់សញ្ញារាងកាយដូចជា ចង្វាក់បេះដូង សីតុណ្ហភាព ភាគរយនៃអុកស៊ីសែនក្នុងឈាម។ល។"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ចូលប្រើឧបករណ៍ចាប់សញ្ញារាងកាយ (ដូចជាឧបករណ៍វាស់ចង្វាក់បេះដូង) ខណៈពេលនៅផ្ទៃខាងក្រោយ"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"សិទ្ធិចូលប្រើទិន្នន័យពីឧបករណ៍ចាប់សញ្ញារាងកាយដូចជា ចង្វាក់បេះដូង សីតុណ្ហភាព ភាគរយនៃអុកស៊ីសែនក្នុងឈាម។ល។ ខណៈពេលនៅផ្ទៃខាងក្រោយ។"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"អានព្រឹត្តិការណ៍ប្រតិទិន និងព័ត៌មានលម្អិត"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"កម្មវិធីនេះអាចធ្វើការអានព្រឹត្តិការណ៍ប្រតិទិនទាំងអស់ ដែលផ្ទុកនៅលើថេប្លេតរបស់អ្នក និងចែករំលែក ឬរក្សាទុកទិន្នន័យប្រតិទិនរបស់អ្នក។"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"កម្មវិធីនេះអាចអានព្រឹត្តិការណ៍ក្នុងប្រតិទិនទាំងអស់ដែលបានរក្សាទុកនៅក្នុងឧបករណ៍ Android TV របស់អ្នក និងចែករំលែក ឬរក្សាទុកទិន្នន័យប្រតិទិនរបស់អ្នក។"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"អនុញ្ញាតឲ្យកម្មវិធីអាន និងសរសេរការកំណត់រចនាសម្ព័ន្ធមុខងារ កុំរំខាន។"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ចាប់ផ្ដើមមើលការប្រើប្រាស់ការអនុញ្ញាត"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"អនុញ្ញាតឱ្យម្ចាស់ចាប់ផ្ដើមការប្រើប្រាស់ការអនុញ្ញាតសម្រាប់កម្មវិធី។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ចាប់ផ្ដើមមើលមុខងារកម្មវិធី"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"អនុញ្ញាតឱ្យកម្មវិធីចាប់ផ្ដើមមើលព័ត៌មានមុខងារសម្រាប់កម្មវិធី។"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ចូលប្រើទិន្នន័យឧបករណ៍ចាប់សញ្ញានៅអត្រាសំណាកខ្ពស់"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 5ec2013..4c8871a 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ಒಳಬರುವ ಮತ್ತು ಹೊರಹೋಗುವ ಕರೆಗಳ ಕುರಿತ ಡೇಟಾ ಸೇರಿದಂತೆ ನಿಮ್ಮ Android TV ಸಾಧನದ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಅಳಿಸಲು ಅಥವಾ ಮಾರ್ಪಡಿಸಲು ಇದನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ಒಳಬರುವ ಮತ್ತು ಹೊರಹೋಗುವ ಕರೆಗಳ ಕುರಿತ ಡೇಟಾ ಸೇರಿದಂತೆ, ನಿಮ್ಮ ಫೋನ್ನ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಮಾರ್ಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ಅಳಿಸಲು ಅಥವಾ ಮಾರ್ಪಡಿಸಲು ಇದನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"ದೇಹ ಸೆನ್ಸರ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ (ಹೃದಯದ ಬಡಿತ ಮಾನಿಟರ್ಗಳಂತಹ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"ನಿಮ್ಮ ಹೃದಯ ಬಡಿತದಂತಹ ನಿಮ್ಮ ದೈಹಿಕ ಸ್ಥಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಸೆನ್ಸರ್ಗಳಿಂದ ಡೇಟಾ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"ಹೃದಯ ಬಡಿತ, ತಾಪಮಾನ, ರಕ್ತದ ಆಮ್ಲಜನಕದ ಶೇಕಡಾವಾರು ಮುಂತಾದ ದೇಹದ ಸೆನ್ಸರ್ಗಳಿಂದ ಡೇಟಾಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡುತ್ತದೆ."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ಹಿನ್ನೆಲೆಯಲ್ಲಿರುವ ದೇಹದ ಸೆನ್ಸರ್ಗಳಿಗೆ (ಹೃದಯದ ಬಡಿತ ಮಾನಿಟರ್ಗಳು) ಪ್ರವೇಶ ನೀಡುತ್ತದೆ"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"ಹೃದಯ ಬಡಿತ, ತಾಪಮಾನ, ರಕ್ತದ ಆಮ್ಲಜನಕದ ಶೇಕಡಾವಾರು ಮುಂತಾದ ಹಿನ್ನೆಲೆಯಲ್ಲಿರುವ ದೇಹದ ಸೆನ್ಸರ್ಗಳಿಂದ ಡೇಟಾಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡುತ್ತದೆ."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳು ಮತ್ತು ವಿವರಗಳನ್ನು ಓದಿ"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ಈ ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮ Android TV ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಎಲ್ಲಾ ಕ್ಯಾಲೆಂಡರ್ ಈವೆಂಟ್ಗಳನ್ನು ಓದಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕ್ಯಾಲೆಂಡರ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಅಥವಾ ಉಳಿಸಬಹುದು."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಓದಲು ಮತ್ತು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ವೀಕ್ಷಣಾ ಅನುಮತಿಯ ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ಆ್ಯಪ್ಗಾಗಿ ಅನುಮತಿ ಬಳಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಹೊಂದಿರುವವರಿಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸಾಮಾನ್ಯ ಆ್ಯಪ್ಗಳಿಗೆ ಎಂದಿಗೂ ಅಗತ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ಆ್ಯಪ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ಆ್ಯಪ್ನ ವೈಶಿಷ್ಟ್ಯಗಳ ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಲು ಬಳಕೆದಾರರನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ಹೆಚ್ಚಿನ ನಮೂನೆ ದರದಲ್ಲಿ ಸೆನ್ಸಾರ್ ಡೇಟಾ ಪ್ರವೇಶಿಸಿ"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"ಕಸ್ಟಮ್ ಆ್ಯಪ್ ಅಧಿಸೂಚನೆ"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="ACCOUNT">%2$s</xliff:g> (ಈ ಖಾತೆಯ ಬಳಕೆದಾರರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದಾರೆ) ಮೂಲಕ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು <xliff:g id="APP">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೆ ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ಮೂಲಕ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು <xliff:g id="APP">%1$s</xliff:g> ಗೆ ಅನುಮತಿಸುವುದೇ ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"ಮೇಲ್ವಿಚಾರಣೆಯ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string>
<string name="language_selection_title" msgid="52674936078683285">"ಭಾಷೆ ಸೇರಿಸಿ"</string>
<string name="country_selection_title" msgid="5221495687299014379">"ಪ್ರದೇಶ ಪ್ರಾಶಸ್ತ್ಯ"</string>
<string name="search_language_hint" msgid="7004225294308793583">"ಭಾಷೆ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 3b58e62..1f71f0f 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -303,7 +303,7 @@
<string name="user_owner_label" msgid="8628726904184471211">"개인 프로필로 전환"</string>
<string name="managed_profile_label" msgid="7316778766973512382">"직장 프로필로 전환"</string>
<string name="permgrouplab_contacts" msgid="4254143639307316920">"연락처"</string>
- <string name="permgroupdesc_contacts" msgid="9163927941244182567">"주소록에 액세스"</string>
+ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"연락처에 액세스"</string>
<string name="permgrouplab_location" msgid="1858277002233964394">"위치"</string>
<string name="permgroupdesc_location" msgid="1995955142118450685">"이 기기의 위치정보에 액세스"</string>
<string name="permgrouplab_calendar" msgid="6426860926123033230">"캘린더"</string>
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"앱이 수신 및 발신 통화에 관한 데이터를 비롯하여 Android TV 기기의 통화 기록을 수정하도록 허용합니다. 이렇게 하면 악성 앱이 통화 기록을 삭제하거나 수정할 수도 있습니다."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"앱에서 수신 및 발신 통화 데이터를 포함하여 휴대전화의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 지우거나 수정할 수 있습니다."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"인체 감지 센서(예: 심박수 모니터)에 액세스"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"앱이 심박수와 같은 신체 상태를 확인하는 센서의 데이터에 접근하도록 허용합니다."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"심박수, 체온, 혈중 산소 농도와 같은 생체 신호 센서의 데이터에 액세스합니다."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"백그라운드에서 생체 신호 센서(심박수 모니터 등)에 액세스"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"백그라운드에서 심박수, 체온, 혈중 산소 농도 등 생체 신호 센서의 데이터에 액세스합니다."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"캘린더 일정 및 세부정보 읽기"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"이 앱은 태블릿에 저장된 모든 캘린더 일정을 읽고 캘린더 데이터를 공유하거나 저장할 수 있습니다."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"앱이 Android TV 기기에 저장된 모든 캘린더 일정을 읽고 캘린더 데이터를 공유하거나 저장할 수 있습니다."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"앱에서 방해 금지 모드 설정을 읽고 작성하도록 허용합니다."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"권한 사용 보기 시작"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"앱의 권한 사용을 시작하려면 보유자를 허용하세요. 일반 앱에는 필요하지 않습니다."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"앱 기능 보기"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"권한을 보유한 앱에서 앱의 기능 정보를 보도록 허용합니다."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"더 높은 샘플링 레이트로 센서 데이터 액세스"</string>
@@ -1321,7 +1327,7 @@
<string name="ringtone_silent" msgid="397111123930141876">"없음"</string>
<string name="ringtone_picker_title" msgid="667342618626068253">"벨소리"</string>
<string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"알람 소리"</string>
- <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"알림 사운드"</string>
+ <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"알림음"</string>
<string name="ringtone_unknown" msgid="5059495249862816475">"알 수 없음"</string>
<string name="wifi_available_sign_in" msgid="381054692557675237">"Wi-Fi 네트워크에 로그인"</string>
<string name="network_available_sign_in" msgid="1520342291829283114">"네트워크에 로그인"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"맞춤 앱 알림"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g>에서 <xliff:g id="ACCOUNT">%2$s</xliff:g> 계정으로 신규 사용자를 만들도록 허용하시겠습니까? 이 계정으로 등록된 사용자가 이미 존재합니다."</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g>에서 <xliff:g id="ACCOUNT">%2$s</xliff:g> 계정으로 신규 사용자를 만들도록 허용하시겠습니까?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"관리 대상 사용자 추가"</string>
<string name="language_selection_title" msgid="52674936078683285">"언어 추가"</string>
<string name="country_selection_title" msgid="5221495687299014379">"지역 환경설정"</string>
<string name="search_language_hint" msgid="7004225294308793583">"언어 이름 입력"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index ab2ab9b..ca703f4 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Колдонмого Android TV түзмөгүңүздүн чалуулар тизмесин, анын ичинде кирүүчү жана чыгуучу чалуулар тууралуу маалыматтарды өзгөртүүгө уруксат берет. Зыянкеч колдонмолор ал уруксатты колдонуп чалуулар тизмеңизди тазалап же өзгөртүп коюшу мүмкүн."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Колдонмого телефонуңуздун чалуулар тизмегин, анын ичинде, чыгыш жана кириш чалууларына тиешелүү берилиштерди өзгөртүү уруксатын берет. Зыяндуу колдонмолор муну колдонуп чалуулар тизмегин өзгөртө же жок кыла алышат."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"дене-бой сенсорлоруна (жүрөктүн кагышын өлчөгүчтөр сыяктуу) уруксат"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Колдонмого жүрөгүңүздүн согушу сыяктуу дене-бой абалыңызды көзөмөлдөгөн сенсорлордогу маалыматтарды көрүп туруу мүмкүнчүлүгүн берет."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Жүрөктүн согушу, температура, кандагы кычкылтектин пайыздык үлүшү ж.б. сыяктуу дене сенсорлорунун маалыматын алуу."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"дене сенсорлорун (жүрөктүн согушун өлчөгүчтөр сыяктуу) фондо алуу"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Жүрөктүн согушу, температура, кандагы кычкылтектин пайыздык үлүшү ж.б. сыяктуу дене сенсорлорунун маалыматын фондо алуу."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Жылнаамадагы иш-чараларды жана алардын чоо-жайын окуу"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Бул колдонмо планшетиңизде сакталган жылнаамадагы иш-чаралардын баарын окуп жана андагы маалыматтарды бөлүшүп же сактай алат."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Бул колдонмо Android TV түзмөгүңүздө сакталган жылнаама иш-чараларынын баарын окуп, ошондой эле жылнаама дайындарын бөлүшүп же сактай алат."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Колдонмого \"Тынчымды алба\" режиминин конфигурациясын окуу жана жазуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"уруксаттын колдонулушун көрүп баштоо"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Колдонмонун пайдаланылышына уруксат берүүгө мүмкүнчүлүк берет. Кадимки колдонмолорго эч качан талап кылынбашы керек."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"колдонмонун функцияларын көрүп баштоо"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Колдонуучуга функциялары тууралуу маалыматты көрүп баштоо мүмкүнчүлүгүн берет."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"үлгүнү жаздыруу ылдамдыгы жогору болгон сенсор дайындарынын үлгүсүнө мүмкүнчүлүк алуу"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 2018524..20df320 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ອະນຸຍາດໃຫ້ແອັບແກ້ໄຂບັນທຶກການໂທຂອງອຸປະກອນ Android TV ທ່ານ, ຮວມທັງສາຍໂທເຂົ້າ ແລະ ໂທອອກ. ແອັບທີ່ເປັນອັນຕະລາຍສາມາດໃຊ້ຄຸນສົມບັດນີ້ເພື່ອລຶບ ຫຼື ແກ້ໄຂບັນທຶກການໂທຂອງທ່ານໄດ້."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ອະນຸຍາດໃຫ້ແອັບຯ ແກ້ໄຂລາຍການການໂທໃນໂທລະສັບຂອງທ່ານ, ຮວມທັງຂໍ້ມູນກ່ຽວກັບສາຍໂທເຂົ້າ ແລະການໂທອອກ. ແອັບຯທີ່ເປັນອັນຕະລາຍ ອາດໃຊ້ຄວາມສາມາດນີ້ ເພື່ອລຶບ ຫຼືແກ້ໄຂລາຍການການໂທຂອງທ່ານໄດ້."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"ເຂົ້າຫາເຊັນເຊີກວດຮ່າງກາຍ (ເຊັ່ນ: ຈໍຕິດຕາມອັດຕາການເຕັ້ນຂອງຫົວໃຈ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"ອະນຸຍາດໃຫ້ແອັບຯເຂົ້າເຖິງຂໍ້ມູນຈາກເຊັນເຊີທີ່ຕິດຕາມສະພາບຮ່າງການຂອງທ່ານ, ເຊັ່ນ: ອັດຕາການເຕັ້ນຂອງຫົວໃຈຂອງທ່ານ."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"ເຂົ້າເຖິງຂໍ້ມູນຈາກເຊັນເຊີຮ່າງກາຍ ເຊັ່ນ: ອັດຕາການເຕັ້ນຫົວໃຈ, ອຸນຫະພູມ, ເປີເຊັນອອກຊິເຈນໃນເລືອດ ແລະ ອື່ນໆ."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ເຂົ້າເຖິງເຊັນເຊີຮ່າງກາຍ (ເຊັ່ນ: ເຄື່ອງວັດແທກອັດຕາການເຕັ້ນຫົວໃຈ) ໃນຂະນະທີ່ຢູ່ໃນພື້ນຫຼັງ"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"ເຂົ້າເຖິງຂໍ້ມູນຈາກເຊັນເຊີຮ່າງກາຍ ເຊັ່ນ: ອັດຕາການເຕັ້ນຫົວໃຈ, ອຸນຫະພູມ, ເປີເຊັນອອກຊິເຈນໃນເລືອດ ແລະ ອື່ນໆໃນຂະນະທີ່ຢູ່ໃນພື້ນຫຼັງ."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Read calendar events and details"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"This app can read all calendar events stored on your tablet and share or save your calendar data."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ແອັບນີ້ສາມາດອ່ານນັດໝາຍປະຕິທິນທັງໝົດທີ່ບັນທຶກໄວ້ຢູ່ອຸປະກອນ Android TV ຂອງທ່ານ ແລະ ແບ່ງປັນ ຫຼື ບັນທຶກຂໍ້ມູນປະຕິທິນຂອງທ່ານ."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ອະນຸຍາດໃຫ້ແອັບອ່ານ ແລະຂຽນການກນຳດຄ່າ ບໍ່ລົບກວນ."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ເລີ່ມການໃຊ້ສິດອະນຸຍາດການເບິ່ງ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ອະນຸຍາດໃຫ້ຜູ້ຖືເລີ່ມການໃຊ້ສິດອະນຸຍາດສຳລັບແອັບໃດໜຶ່ງໄດ້. ແອັບປົກກະຕິບໍ່ຄວນຕ້ອງໃຊ້."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ເລີ່ມເບິ່ງຄຸນສົມບັດແອັບ"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ອະນຸຍາດໃຫ້ຜູ້ຖືເລີ່ມການເບິ່ງຂໍ້ມູນຄຸນສົມບັດສຳລັບແອັບໃດໜຶ່ງ."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ເຂົ້າເຖິງຂໍ້ມູນເຊັນເຊີໃນອັດຕາຕົວຢ່າງສູງ"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"ການແຈ້ງເຕືອນແອັບແບບກຳນົດເອງ"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"ອະນຸຍາດໃຫ້ <xliff:g id="APP">%1$s</xliff:g> ສ້າງຜູ້ໃຊ້ໃໝ່ກັບ <xliff:g id="ACCOUNT">%2$s</xliff:g> ໄດ້ບໍ່ (ມີຜູ້ໃຊ້ທີ່ໃຊ້ບັນຊີນີ້ຢູ່ກ່ອນແລ້ວ) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"ອະນຸຍາດໃຫ້ <xliff:g id="APP">%1$s</xliff:g> ສ້າງຜູ້ໃຊ້ໃໝ່ກັບ <xliff:g id="ACCOUNT">%2$s</xliff:g> ໄດ້ບໍ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"ເພີ່ມຜູ້ໃຊ້ທີ່ມີການເບິ່ງແຍງກວດກາ"</string>
<string name="language_selection_title" msgid="52674936078683285">"ເພີ່ມພາສາ"</string>
<string name="country_selection_title" msgid="5221495687299014379">"ການຕັ້ງຄ່າພາກພື້ນ"</string>
<string name="search_language_hint" msgid="7004225294308793583">"ພິມຊື່ພາສາ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index aea67f2..f307213 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Programai leidžiama keisti „Android TV“ įrenginio skambučių žurnalą, įskaitant gaunamųjų ir siunčiamųjų skambučių duomenis. Kenkėjiškos programos gali ištrinti arba keisti skambučių žurnalą."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Programai leidžiama skaityti telefono skambučių žurnalą, įskaitant duomenis apie gaunamuosius ir siunčiamuosius skambučius. Kenkėjiškos programos tai gali naudoti, kad ištrintų ar keistų jūsų skambučių žurnalą."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"pas. k. jut. (pvz., pul. dažn. st. įr.)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Programai leidžiama pasiekti duomenis, gautus iš jutiklių, stebinčių fizinę būseną, pvz., širdies ritmą."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Pasiekti kūno jutiklių duomenis, pvz., pulso dažnį, temperatūrą, deguonies procentinę dalį kraujyje ir kt."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"pasiekti kūno jutiklių duom. (pvz., pulso dažn. stebėjimo įreng.), veikiant fone"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Pasiekti kūno jutiklių duomenis, pvz., pulso dažnį, temperatūrą, deguonies procentinę dalį kraujyje ir kt., kai veikia fone."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Skaityti kalendoriaus įvykius arba išsamią informaciją"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Ši programa gali nuskaityti visus planšetiniame kompiuteryje saugomus kalendoriaus įvykius ir bendrinti arba išsaugoti kalendoriaus duomenis."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Ši programa gali nuskaityti visus „Android TV“ įrenginyje saugomus kalendoriaus įvykius ir bendrinti arba išsaugoti kalendoriaus duomenis."</string>
@@ -737,6 +739,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Leidžiama programai skaityti ir rašyti „Do Not Disturb“ konfigūraciją."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pradėti peržiūrėti leidimo naudojimą"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Leidžia savininkui pradėti naudoti programos leidimą. Įprastoms programoms to neturėtų prireikti."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"pradėti programos funkcijų peržiūrą"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Savininkui leidžiama pradėti programos funkcijų informacijos peržiūrą."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pasiekti jutiklių duomenis dideliu skaitmeninimo dažniu"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 495bc38..ee3ba28 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -430,7 +430,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Ļauj lietotnei pārveidot Android TV ierīces zvanu žurnālu, tostarp datus par ienākošajiem un izejošajiem zvaniem. Ļaunprātīgas lietotnes var to izmantot, lai dzēstu vai pārveidotu zvanu žurnālu."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Ļauj lietotnei pārveidot tālruņa zvanu žurnālu, tostarp ienākošo un izejošo zvanu datus. Ļaunprātīgas lietotnes var to izmantot, lai dzēstu vai pārveidotu savu zvanu žurnālu."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"Piekļūt ķermeņa sensoriem (piemēram, sirdsdarbības monitoriem)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Ļauj lietotnei piekļūt to sensoru datiem, kuri pārrauga jūsu fizisko stāvokli (piemēram, sirdsdarbības ātrumu)."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Piekļuve ķermeņa sensoru rādītāju datiem (piemēram, sirdsdarbības ātrumam, temperatūrai, procentuālajam skābekļa daudzumam asinīs u.c.)"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"piekļuve ķermeņa sensoru datiem (piemēram, sirdsdarbības ātrumam) fonā"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Piekļuve ķermeņa sensoru rādītāju datiem (piemēram, sirdsdarbības ātrumam, temperatūrai, procentuālajam skābekļa daudzumam asinīs u.c.) fonā."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Lasīt kalendāra pasākumus un informāciju"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Šī lietotne var lasīt visus kalendāra pasākumus, kas saglabāti planšetdatorā, un kopīgot vai saglabāt jūsu kalendāra datus."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Šī lietotne var lasīt visus kalendāra pasākumus, kas saglabāti Android TV ierīcē, un kopīgot vai saglabāt jūsu kalendāra datus."</string>
@@ -734,6 +736,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ļauj lietotnei lasīt un rakstīt režīma “Netraucēt” konfigurāciju."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Datu skatīšana par izmantojamajām atļaujām"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ļauj atļaujas īpašniekam sākt lietotnes atļauju izmantošanu. Parastām lietotnēm tas nekad nav nepieciešams."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"Skatīt lietotnes funkcijas"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Lietotne ar šo atļauju var skatīt informāciju par citas lietotnes funkcijām."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"piekļuve sensoru datiem, izmantojot augstu iztveršanas frekvenci"</string>
@@ -2021,8 +2027,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Pielāgots lietotnes paziņojums"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Vai atļaut lietotnei <xliff:g id="APP">%1$s</xliff:g> izveidot jaunu lietotāju, izmantojot e-pasta adresi <xliff:g id="ACCOUNT">%2$s</xliff:g> (lietotājs ar šādu kontu jau pastāv)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Vai atļaut lietotnei <xliff:g id="APP">%1$s</xliff:g> izveidot jaunu lietotāju, izmantojot e-pasta adresi <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Pievienot uzraudzītu lietotāju"</string>
<string name="language_selection_title" msgid="52674936078683285">"Pievienot valodu"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Reģiona preference"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Ierakstiet valodas nosaukumu"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 92e1d5f..2c460ab 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Дозволува апликацијата да го менува дневникот на повици на вашиот уред Android TV, вклучувајќи и податоци за дојдовните или појдовните повици. Злонамерните апликации може да го искористат ова за да го избришат или да го менуваат дневникот на повици."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Овозможува апликацијата да го менува дневникот на повици на вашиот телефон, вклучувајќи податоци за дојдовни и појдовни повици. Злонамерните апликации може да го искористат ова да го избришат или да го менуваат вашиот дневник на повици."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"пристап до телесните сензори (како мониторите за пулс)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Дозволува апликацијата да пристапува до податоци од сензори кои ја следат вашата физичка состојба, како на пр. отчукувањата на срцето."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Пристап до податоци од телесни сензори, како пулс, температура, процент на кислород во крвта итн."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"пристап до телесните сензори (како мониторите за пулс) додека се во заднина"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Пристап до податоци од телесни сензори, како пулс, температура, процент на кислород во крвта итн. додека се во заднина."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Чита настани и детали од календарот"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Апликацијава може да ги чита сите настани во календарот складирани во вашиот таблет и да ги споделува или зачувува податоците од календарот."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Апликацијава може да ги чита сите настани во календарот складирани во вашиот уред Android TV и да ги споделува или зачувува податоците од календарот."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дозволува апликацијата да чита и пишува конфигурација Не вознемирувај."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"започнете со користење на дозволата за приказ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дозволува сопственикот да почне со користење на дозволата за апликација. Не треба да се користи за стандардни апликации."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"да почне со прегледување на функциите на апликацијата"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"му дозволува на сопственикот да почне со прегледување на податоците за функциите за некоја апликација"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"пристапува до податоците со висока фреквенција на семпл"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 0d76eae..a0698a7 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ഇൻകമിംഗ്, ഔട്ട്ഗോയിംഗ് കോളുകളെക്കുറിച്ചുള്ള ഡാറ്റ ഉൾപ്പെടെ നിങ്ങളുടെ Android TV-യിലെ കോൾ ചരിത്രം പരിഷ്ക്കരിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു. നിങ്ങളുടെ കോൾ ചരിത്രം മായ്ക്കാനോ പരിഷ്ക്കരിക്കാനോ ദോഷകരമായ ആപ്പുകൾ ഇത് ഉപയോഗിച്ചേക്കാം."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ഇൻകമ്മിംഗ്-ഔട്ട്ഗോയിംഗ് കോളുകളെക്കുറിച്ചുള്ള ഡാറ്റയുൾപ്പെടെയുള്ള നിങ്ങളുടെ ഫോണിന്റെ കോൾ ചരിത്രം പരിഷ്ക്കരിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു.ഇതു വഴി കോൾ ചരിത്ര ഡാറ്റകൾ പരിഷ്ക്കരിക്കാനും ഇല്ലാതാക്കാനും ദോഷകരമായ അപ്ലിക്കേഷനുകൾക്ക് കഴിഞ്ഞേയ്ക്കാം."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"ശരീര സെൻസറുകൾ (ഹൃദയമിടിപ്പ് നിരക്ക് മോണിറ്ററുകൾ പോലെ) ആക്സസ് ചെയ്യുക"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"നിങ്ങളുടെ ഹൃദയമിടിപ്പ് പോലുള്ള ശാരീരികാവസ്ഥ നിരീക്ഷിക്കാൻ സെൻസറുകളിൽ നിന്ന് വിവരം ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"ഹൃദയമിടിപ്പ്, താപനില, രക്തത്തിലെ ഓക്സിജന്റെ ശതമാനം മുതലായവ പോലുള്ള ബോഡി സെൻസറുകളിൽ നിന്നുള്ള ഡാറ്റയിലേക്കുള്ള ആക്സസ്."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"പശ്ചാത്തലത്തിൽ ബോഡി സെൻസറുകൾ (ഹൃദയമിടിപ്പ് മോണിറ്ററുകൾ പോലുള്ളവ) ആക്സസ് ചെയ്യുക"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"പശ്ചാത്തലത്തിൽ ആയിരിക്കുമ്പോൾ ഹൃദയമിടിപ്പ്, താപനില, രക്തത്തിലെ ഓക്സിജന്റെ ശതമാനം മുതലായവ പോലുള്ള ബോഡി സെൻസറുകളിൽ നിന്നുള്ള ഡാറ്റയിലേക്കുള്ള ആക്സസ്."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"കലണ്ടർ ഇവന്റുകളും വിശദാംശങ്ങളും വായിക്കുക"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ഈ ആപ്പിന് നിങ്ങളുടെ ടാബ്ലെറ്റിൽ സംഭരിച്ചിരിക്കുന്ന എല്ലാ കലണ്ടർ ഇവന്റുകളും വായിക്കാനും നിങ്ങളുടെ കലണ്ടർ വിവരങ്ങൾ പങ്കിടാനും അല്ലെങ്കിൽ സംരക്ഷിക്കാനും കഴിയും."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ഈ ആപ്പിന് നിങ്ങളുടെ Android TV-യിൽ സംഭരിച്ചിരിക്കുന്ന എല്ലാ കലണ്ടർ ഇവന്റുകളും വായിക്കാനും നിങ്ങളുടെ കലണ്ടർ ഡാറ്റ പങ്കിടാനോ സംരക്ഷിക്കാനോ സാധിക്കുകയും ചെയ്യും."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"\'ശല്യപ്പെടുത്തരുത്\' കോൺഫിഗറേഷൻ വായിക്കുന്നതിനും എഴുതുന്നതിനും ആപ്പിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"അനുമതി ഉപയോഗം കാണാൻ ആരംഭിക്കുക"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ഒരു ആപ്പിനുള്ള അനുമതി ഉപയോഗം ആരംഭിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു. സാധാരണ ആപ്പുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ആപ്പ് ഫീച്ചറുകൾ കാണാൻ ആരംഭിക്കുക"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ആപ്പിനുള്ള ഫീച്ചറുകളുടെ വിവരങ്ങൾ കാണാൻ ആരംഭിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ഉയർന്ന സാംപ്ലിംഗ് റേറ്റിൽ സെൻസർ ഡാറ്റ ആക്സസ് ചെയ്യുക"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 24cad85..f86c875 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Аппад таны Android TV төхөөрөмжийн ирсэн болон залгасан дуудлага зэрэг өгөгдөл бүхий дуудлагын жагсаалтыг өөрчлөхийг зөвшөөрнө. Хортой аппууд үүнийг ашиглан таны дуудлагын жагсаалтыг устгаж эсвэл өөрчилж болзошгүй."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Апп нь таны утасны ирсэн гарсан дуудлага зэргийг агуулсан дуудлагын логыг өөрчлөх боломжтой. Хортой апп нь энийг ашиглан таны дуудлагын логыг өөрчлөх болон арилгах боломжтой."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"биеийн мэдрэгчид хандах (зүрхний хэмнэл шалгагч г.м)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Апп-т таны зүрхний цохилт гэх мэт биеийн байдлыг хянадаг мэдрэгчдийн датанд хандалт хийх боломж олгоно."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Зүрхний хэм, температур, цусны хүчилтөрөгчийн хувь гэх мэт биеийн мэдрэгчийн өгөгдөлд хандана уу"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"арын дэвсгэрт ажиллах үед биеийн мэдрэгчид (зүрхний хэм хянагч гэх мэт) хандах"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Арын дэвсгэрт ажиллах үед зүрхний хэм, температур, цусны хүчилтөрөгчийн хувь гэх мэт биеийн мэдрэгчийн өгөгдөлд хандана уу."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Календарийн арга хэмжээ, дэлгэрэнгүйг унших"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Энэ апп таны таблетад хадгалсан календарийн бүх арга хэмжээг унших, календарийн өгөгдлийг хуваалцах, хадгалах боломжтой."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Энэ апп таны Android TV төхөөрөмжид хадгалсан календарийн бүх арга хэмжээг унших болон таны календарийн өгөгдлийг хуваалцах эсвэл хадгалах боломжтой."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Апп-д Бүү саад бол тохируулгыг уншиж, бичихийг зөвшөөрөх"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"зөвшөөрлийн ашиглалтыг харж эхлэх"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Эзэмшигчид аппын зөвшөөрлөө ашиглаж эхлэхийг зөвшөөрдөг. Энгийн аппуудад шаардлагагүй."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"аппын онцлогуудыг үзэж эхлэх"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Аппын онцлогуудын мэдээллийг үзэж эхлэхийг эзэмшигчид зөвшөөрдөг."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"түүврийн өндөр хувиар мэдрэгчийн өгөгдөлд хандах"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 162b4ae..a244a2f 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"येणार्या आणि केल्या जाणार्या कॉलविषयीच्या डेटासह, तुमच्या Android TV डिव्हाइसचा कॉल लॉग सुधारित करण्यासाठी ॲपला अनुमती देते. दुर्भावनापूर्ण अॅप्स तुमचा कॉल लॉग मिटवण्यासाठी किंवा सुधारित करण्यासाठी याचा वापर करू शकतात."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"येणार्या आणि केल्या जाणार्या कॉलविषयीच्या डेटासह, आपल्या फोनचा कॉल लॉग सुधारित करण्यासाठी अॅप ला अनुमती देते. दुर्भावनापूर्ण अॅप्स तुमचा कॉल लॉग मिटवण्यासाठी किंवा सुधारित करण्यासाठी याचा वापर करू शकतात."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"शरीर सेन्सर (हृदय गती मॉनिटरसारखे) अॅक्सेस करा"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"हृदय गती सारख्या, आपल्या शारीरिक स्थितीचे नियंत्रण करणार्या सेन्सरवरून डेटामध्ये प्रवेश करण्यासाठी ॲपला अनुमती देते."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"हार्ट रेट, तापमान, रक्तातील ऑक्सिजनची टक्केवारी इ. सारख्या शरीर सेन्सरवरील डेटाचा अॅक्सेस आहे."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"बॅकग्राउंडमध्ये असताना शरीर सेन्सर (जसे की हार्ट रेट मॉनिटर) अॅक्सेस करा"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"बॅकग्राउंडमध्ये असताना हार्ट रेट, तापमान, रक्तातील ऑक्सिजनची टक्केवारी इ. सारखा शरीर सेन्सरवरील डेटा अॅक्सेस करा."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"कॅलेंडर इव्हेंट आणि तपशील वाचा"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"हा अॅप आपल्या टॅब्लेटवर स्टोअर केलेले सर्व कॅलेंडर इव्हेंट वाचू आणि शेअर करू शकतो किंवा तुमचा कॅलेंडर डेटा सेव्ह करू शकतो."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"हे अॅप तुमच्या Android TV डिव्हाइसवर स्टोअर केलेले सर्व कॅलेंडर इव्हेंट वाचू आणि शेअर करू शकतो किंवा तुमचा कॅलेंडर डेटा सेव्ह करू शकतो."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"व्यत्यय आणू नका कॉंफिगरेशन वाचण्यासाठी आणि लिहिण्यासाठी ॲपला अनुमती देते."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"व्ह्यू परवानगी वापर सुरू करा"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"धारकास अॅपसाठी परवानगी वापरणे सुरू करण्याची अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यकता नसते."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ॲप वैशिष्ट्ये पाहणे सुरू करा"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"होल्डरला ॲपसाठी वैशिष्ट्यांची माहिती पाहण्यास सुरू करण्याची अनुमती देते."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"उच्च नमुना दराने सेन्सर डेटा अॅक्सेस करते"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 4a50bc9..12cd501 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Membenarkan apl mengubah suai log panggilan peranti Android TV anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakan keupayaan ini untuk memadamkan atau mengubah suai log panggilan anda."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Membenarkan apl untuk mengubah suai panggilan telefon anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakannya untuk memadam atau mengubah suai log panggilan anda."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"akss pndia bdn (spt pmntau kdr dnyt jntg)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Membenarkan apl mengakses data dari penderia yang memantau keadaan fizikal anda, seperti kadar denyutan jantung anda."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Akses kepada data daripada penderia tubuh seperti kadar denyut jantung, suhu, peratusan oksigen darah, dsb."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"akses penderia tubuh (seperti pemantau kadar denyut jantung) semasa di latar"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Akses kepada data daripada penderia tubuh seperti kadar denyut jantung, suhu, peratusan oksigen darah, dsb. semasa di latar."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Baca acara dan butiran kalendar"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Apl ini boleh membaca semua acara kalendar yang disimpan pada tablet anda dan berkongsi atau menyimpan data kalendar anda."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Apl ini boleh membaca semua acara kalendar yang disimpan pada peranti Android TV anda dan berkongsi atau menyimpan data kalendar anda."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Membenarkan apl membaca dan menulis konfigurasi Jangan Ganggu."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"mulakan lihat penggunaan kebenaran"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Membenarkan pemegang memulakan penggunaan kebenaran untuk apl. Tidak sekali-kali diperlukan untuk apl biasa."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"mula melihat ciri apl"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Membenarkan pemegang mula melihat maklumat ciri untuk apl."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"akses data penderia pada data pensampelan yang tinggi"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Pemberitahuan apl tersuai"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Benarkan <xliff:g id="APP">%1$s</xliff:g> membuat Pengguna baharu dengan <xliff:g id="ACCOUNT">%2$s</xliff:g> (Pengguna dengan akaun ini sudah wujud) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Benarkan <xliff:g id="APP">%1$s</xliff:g> membuat Pengguna baharu dengan <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Tambahkan pengguna di bawah seliaan"</string>
<string name="language_selection_title" msgid="52674936078683285">"Tambahkan bahasa"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Pilihan wilayah"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Taipkan nama bahasa"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 169c0fd..59505a5 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -317,7 +317,7 @@
<string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ကိုယ်ခန္ဓာလှုပ်ရှားမှု"</string>
<string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"သင့်ကိုယ်ခန္ဓာလှုပ်ရှားမှုကို ဝင်ကြည့်ရန်"</string>
<string name="permgrouplab_camera" msgid="9090413408963547706">"ကင်မရာ"</string>
- <string name="permgroupdesc_camera" msgid="7585150538459320326">"ဓာတ်ပုံ ရိုက်ပြီးနောက် ဗွီဒီယို မှတ်တမ်းတင်ရန်"</string>
+ <string name="permgroupdesc_camera" msgid="7585150538459320326">"ဓာတ်ပုံနှင့် ဗီဒီယို ရိုက်ကူးရန်"</string>
<string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"အနီးတစ်ဝိုက်ရှိ စက်များ"</string>
<string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"အနီးတစ်ဝိုက်ရှိ စက်များကို ရှာဖွေပြီးချိတ်ဆက်မည်"</string>
<string name="permgrouplab_calllog" msgid="7926834372073550288">"ခေါ်ဆိုမှတ်တမ်း"</string>
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"အဝင်နှင့် အထွက်ခေါ်ဆိုမှု အချက်အလက်များ အပါအဝင် သင့် Android TV စက်ပစ္စည်းပေါ်ရှိ ခေါ်ဆိုထားသော မှတ်တမ်းကို အက်ပ်အား မွမ်းမံခွင့်ပြုသည်။ သံသယဖြစ်နိုင်ဖွယ်ရှိသည့် အက်ပ်များသည် ၎င်းကို အသုံးပြုပြီး သင်၏ ခေါ်ဆိုထားသော မှတ်တမ်းကို ဖျက်နိုင်သည်။"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"အပလီကေးရှင်းအား သင့်ဖုန်း၏ ဖုန်းခေါ်ဆိုမှု မှတ်တမ်း (အဝင်အထွက်ခေါ်ဆိုမှု အချက်အလက်များ) ကို ပြင်ဆင်ခွင့် ပေးခြင်း။ အန္တရာယ်ရှိ အပလီကေးရှင်းများမှ ဤအချက်ကို အသုံးပြု၍ သင့် ဖုန်းခေါ်ဆိုမှု မှတ်တမ်းကို ဖျက်ပစ်ခြင်း၊ ပြင်ဆင်ခြင်းများ ပြုလုပ်နိုင်ပါသည်"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"ခန္ဓာကိုယ် အာရုံကိရိယာများကို (နှလုံးခုန်နှုန်း မော်နီတာလို)ကို ရယူသုံးရန်"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"သင်၏ နှလုံးခုန်နှုန်းလို ရုပ်ပိုင်း အခြေအနေကို စောင့်ကြပ်သည့် အာရုံခံစက်များထံမှ ဒေတာများကို အက်ပ်အား ရယူသုံးခွင့် ပြုပါ။"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"နှလုံးခုန်နှုန်း၊ အပူချိန်၊ သွေးတွင်း အောက်ဆီဂျင် ရာခိုင်နှုန်း စသည့် ခန္ဓာကိုယ် အာရုံခံကိရိယာများမှ ဒေတာသုံးခွင့်။"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"(နှလုံးခုန်နှုန်း စောင့်ကြည့်ခြင်းကဲ့သို့) ခန္ဓာကိုယ် အာရုံခံကိရိယာများကို နောက်ခံ၌သုံးခွင့်"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"နှလုံးခုန်နှုန်း၊ အပူချိန်၊ သွေးတွင်း အောက်ဆီဂျင် ရာခိုင်နှုန်း စသည့် ခန္ဓာကိုယ် အာရုံခံကိရိယာများမှ ဒေတာကို နောက်ခံ၌သုံးခွင့်။"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"ပြက္ခဒိန်ဖြစ်ရပ်များနှင့် အသေးစိတ်အချက်အလက်များကို ဖတ်ခြင်း"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ဤအက်ပ်သည် သင့်တက်ဘလက်တွင် သိမ်းဆည်းထားသည့် ပြက္ခဒိန်ဖြစ်ရပ်များကို ကြည့်ရှုနိုင်ပြီး သင့်ပြက္ခဒိန်ဒေတာများကို မျှဝေခြင်းနှင့် သိမ်းဆည်းခြင်းတို့ ပြုလုပ်နိုင်ပါသည်။"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ဤအက်ပ်သည် သင့် Android TV စက်ပစ္စည်းတွင် သိမ်းဆည်းထားသည့် ပြက္ခဒိန်ဖြစ်ရပ်များအားလုံးကို ဖတ်နိုင်ပြီး သင်၏ ပြက္ခဒိန်ဒေတာများကို မျှဝေခြင်း သို့မဟုတ် သိမ်းဆည်းခြင်းတို့ ပြုလုပ်နိုင်သည်။"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"မနှောင့်ယှက်ရန် ချိန်ညှိမှုကို အပ်ဖ်များ ဖတ်ခြင်း ပြင်ခြင်းပြုလုပ်နိုင်ရန် ခွင့်ပြုမည်။"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"အစမြင်ကွင်း ခွင့်ပြုချက် အသုံးပြုမှု"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"အက်ပ်တစ်ခုအတွက် ခွင့်ပြုချက်စတင်အသုံးပြုမှုကို ကိုင်ဆောင်သူအား ခွင့်ပြုသည်။ ပုံမှန်အက်ပ်များအတွက် ဘယ်သောအခါမျှ မလိုအပ်ပါ။"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"အက်ပ်ဝန်ဆောင်မှုများကို စတင်ကြည့်ခြင်း"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ဝန်ဆောင်မှုအချက်အလက်ကိုများကို ခွင့်ပြုချက်ရထားသည့် အက်ပ်အား စတင်ကြည့်နိုင်ရန် ခွင့်ပြုသည်။"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"နမူနာနှုန်းမြင့်သော အာရုံခံစနစ်ဒေတာကို သုံးပါ"</string>
@@ -1711,12 +1717,12 @@
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"ဖယ်ရှားရန်"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"အသံကို အကြံပြုထားသည့် ပမာဏထက် မြှင့်ပေးရမလား?\n\nအသံကို မြင့်သည့် အဆင့်မှာ ကြာရှည်စွာ နားထောင်ခြင်းက သင်၏ နားကို ထိခိုက်စေနိုင်သည်။"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်ကို အသုံးပြုလိုပါသလား။"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ဖြတ်လမ်းလင့်ခ်ကို ဖွင့်ထားစဉ် အသံထိန်းခလုတ် နှစ်ခုစလုံးကို ၃ စက္ကန့်ခန့် ဖိထားခြင်းဖြင့် အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုကို ဖွင့်နိုင်သည်။"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ဖြတ်လမ်းလင့်ခ်ကို ဖွင့်ထားစဉ် အသံထိန်းခလုတ် နှစ်ခုစလုံးကို ၃ စက္ကန့်ခန့် ဖိထားခြင်းဖြင့် အများသုံးနိုင်သည့် ဝန်ဆောင်မှုကို ဖွင့်နိုင်သည်။"</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများအတွက် ဖြတ်လမ်းကို ဖွင့်မလား။"</string>
<string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများ ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nလက်ရှိ ဝန်ဆောင်မှုများ-\n<xliff:g id="SERVICE">%1$s</xliff:g>\n\'ဆက်တင်များ > အများသုံးစွဲနိုင်မှု\' တွင် ရွေးထားသည့် ဝန်ဆောင်မှုများကို ပြောင်းနိုင်သည်။"</string>
<string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string>
<string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> ဖြတ်လမ်းကို ဖွင့်မလား။"</string>
- <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုဖြစ်သော <xliff:g id="SERVICE">%1$s</xliff:g> ကို ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nဤဖြတ်လမ်းလင့်ခ်ကို \'ဆက်တင်များ > အများသုံးစွဲနိုင်မှု\' တွင် နောက်ဝန်ဆောင်မှုတစ်ခုသို့ ပြောင်းနိုင်သည်။"</string>
+ <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးနိုင်သည့် ဝန်ဆောင်မှုဖြစ်သော <xliff:g id="SERVICE">%1$s</xliff:g> ကို ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nဤဖြတ်လမ်းလင့်ခ်ကို ဆက်တင်များ > အများသုံးနိုင်မှုတွင် နောက်ဝန်ဆောင်မှုတစ်ခုသို့ ပြောင်းနိုင်သည်။"</string>
<string name="accessibility_shortcut_on" msgid="5463618449556111344">"ဖွင့်ရန်"</string>
<string name="accessibility_shortcut_off" msgid="3651336255403648739">"မဖွင့်ပါနှင့်"</string>
<string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ဖွင့်"</string>
@@ -1745,9 +1751,9 @@
<string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"အသံခလုတ်များကို ဖိထားသည်။ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ဖွင့်လိုက်သည်။"</string>
<string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"အသံခလုတ်များကို ဖိထားသည်။ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ပိတ်လိုက်သည်။"</string>
<string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို သုံးရန် အသံအတိုးအလျှော့ ခလုတ်နှစ်ခုလုံးကို သုံးစက္ကန့်ကြာ ဖိထားပါ"</string>
- <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့သည့်အခါ အသုံးပြုမည့် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ−"</string>
- <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"အများသုံးစွဲနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (ဖန်သားပြင်အောက်ခြေမှနေ၍ လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string>
- <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"အများသုံးစွဲနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (ဖန်သားပြင်အောက်ခြေမှနေ၍ လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string>
+ <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"သုံးနိုင်မှုခလုတ်ကို တို့ပြီးလျှင် ဝန်ဆောင်မှုတစ်ခု ရွေးပါ−"</string>
+ <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"သုံးနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (ဖန်သားပြင်အောက်ခြေမှနေ၍ လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string>
+ <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"သုံးနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (ဖန်သားပြင်အောက်ခြေမှနေ၍ လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string>
<string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် အများသုံးစွဲနိုင်မှုခလုတ်ကို ဖိထားပါ။"</string>
<string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပြီး ဖိထားပါ။"</string>
<string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပြီး ဖိထားပါ။"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"စိတ်ကြိုက်အက်ပ် အကြောင်းကြားချက်"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ဖြင့်အသုံးပြုသူအသစ်ကို <xliff:g id="APP">%1$s</xliff:g> အား ဖန်တီးခွင့်ပြုလိုပါသလား (ဤအကောင့်ဖြင့် အသုံးပြုသူ ရှိနှင့်ပြီးဖြစ်သည်) ။"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="ACCOUNT">%2$s</xliff:g> ဖြင့်အသုံးပြုသူအသစ်ကို <xliff:g id="APP">%1$s</xliff:g> အား ဖန်တီးခွင့်ပြုလိုပါသလား ။"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"ကြီးကြပ်ခံ အသုံးပြုသူ ထည့်ရန်"</string>
<string name="language_selection_title" msgid="52674936078683285">"ဘာသာစကားတစ်ခု ထည့်ပါ"</string>
<string name="country_selection_title" msgid="5221495687299014379">"ဒေသရွေးချယ်မှု"</string>
<string name="search_language_hint" msgid="7004225294308793583">"ဘာသာစကားအမည် ထည့်ပါ"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 7c5ae01..f12287f 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Lar appen endre samtaleloggen på Android TV-enheten din, inkludert data om innkommende og utgående anrop. Skadelige apper kan bruke denne tillatelsen til å slette eller endre samtaleloggen din."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Lar appen endre telefonens samtalelogg, inkludert data om innkommende og utgående anrop. Skadelige apper kan utnytte denne tillatelsen til å slette eller endre samtaleloggen din."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"få tilgang til kroppssensorer (f.eks. pulsmålere)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Gir appen tilgang til data fra sensorer som overvåker den fysiske tilstanden din, for eksempel hjertefrekvensen din."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Tilgang til data fra kroppssensorer, for eksempel puls, temperatur, oksygenmetning i blodet osv."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"få tilgang til kroppssensorer (f.eks. pulsmålere) i bakgrunnen"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Tilgang til data fra kroppssensorer, for eksempel puls, temperatur, oksygenmetning i blodet osv., i bakgrunnen."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Les kalenderaktivitet og detaljer"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Denne appen kan lese all kalenderaktivitet som er lagret på nettbrettet ditt, og dele eller lagre kalenderdataene."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Denne appen kan lese all kalenderaktivitet som er lagret på Android TV-enheten din, og dele eller lagre kalenderdataene."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Lar appen lese og skrive konfigurasjon av Ikke forstyrr."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"start visning av bruk av tillatelser"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lar innehaveren starte bruk av tillatelser for en app. Dette skal aldri være nødvendig for vanlige apper."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"starte visning av appfunksjoner"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Lar innehaveren se informasjon om funksjonene for en app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"tilgang til sensordata ved høy samplingfrekvens"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Tilpasset appvarsel"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Vil du la <xliff:g id="APP">%1$s</xliff:g> opprette en ny bruker med <xliff:g id="ACCOUNT">%2$s</xliff:g> (en bruker med denne kontoen eksisterer allerede)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Vil du la <xliff:g id="APP">%1$s</xliff:g> opprette en ny bruker med <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Legg til administrert bruker"</string>
<string name="language_selection_title" msgid="52674936078683285">"Legg til et språk"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Regionsinnstilling"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Skriv inn språknavn"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 7f9a832..bf8499e 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"एपलाई तपाईंको Android टिभी डिभाइसको आगमन र बहिर्गमन कलसम्बन्धी डेटासहित कल लग परिमार्जन गर्ने अनुमति दिन्छ। हानिकारक एपहरूले यसलाई तपाईंको कल लग मेटाउन वा परिमार्जन गर्न प्रयोग गर्न सक्छन्।"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"एपलाई तपाईंको फोनको आउने र बाहिर जाने कलहरूको बारेको डेटा सहित कल लग परिमार्जन गर्न अनुमति दिन्छ। खराब एपहरूले यसलाई तपाईंको कल लग मेटाउन वा परिमार्जन गर्न प्रयोग गर्न सक्दछ।"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"शरीरका सेन्सरहरूमा पहुँच गराउनुहोस् (जस्तै हृदय धड्कन निगरानीहरू)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"तपाईँको हृदय गति जस्तो सेंसर बाट डेटा पहुँचको लागि एप अनुमति दिन्छ जसले तपाईँको भौतिक अवस्था अनुगमन गर्छ।"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"बडी सेन्सरका सहायताले हृदयको गति, शरीरको तापक्रम, रगतमा रहेको अक्सिजनको प्रतिशतलगायतका डेटा हेर्ने अनुमति।"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ब्याकग्राउन्डमा काम गर्ने बडी सेन्सरका सहायताले (हृदयको गति मापन जस्ता) डेटा हेर्ने अनुमति"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"ब्याकग्राउन्डमा काम गर्ने बडी सेन्सरका सहायताले हृदयको गति, शरीरको तापक्रम, रगतमा रहेको अक्सिजनको प्रतिशतलगायतका डेटा हेर्ने अनुमति।"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"पात्रोका कार्यक्रम र विवरणहरू पढ्ने"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"यस एपले तपाईंको ट्याब्लेटमा भण्डारण गरिएका पात्रो सम्बन्धी सबै कार्यक्रमहरू पढ्न र तपाईंको पात्रोको डेटा आदान प्रदान वा सुरक्षित गर्न सक्छ।"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"यस एपले तपाईंको Android टिभी डिभाइसमा भण्डार गरिएका पात्रोसम्बन्धी सबै कार्यक्रमहरू पढ्न र तपाईंको पात्रोको डेटा आदान प्रदान वा सुरक्षित गर्न सक्छ।"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"बाधा नपुर्याउँनुहोस् कन्फिगरेसन पढ्न र लेख्नको लागि एपलाई अनुमति दिनुहोस्।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"हेर्ने अनुमतिको प्रयोग सुरु गर्नुहोस्"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"वाहकलाई कुनै एपसम्बन्धी अनुमतिको प्रयोग सुरु गर्न दिन्छ। साधारण एपहरूलाई कहिल्यै आवश्यक नपर्नु पर्ने हो।"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"एपका सुविधासम्बन्धी जानकारी हेर्न थाल्नुहोस्"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"होल्डरलाई एपका सुविधासम्बन्धी जानकारी हेर्न दिन्छ।"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"नमुना लिने उच्च दरमा सेन्सरसम्बन्धी डेटा प्रयोग गर्ने"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 5dcdda4..1dac982 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Toestaan dat de app de gesprekslijst van je Android TV-apparaat aanpast, waaronder gegevens over inkomende en uitgaande gesprekken. Schadelijke apps kunnen hiermee je gesprekslijst wissen of aanpassen."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Toestaan dat de app de gesprekslijst van je telefoon aanpast, waaronder gegevens over inkomende en uitgaande gesprekken. Schadelijke apps kunnen hiermee je gesprekslijst wissen of aanpassen."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"toegang tot lichaamssensoren (zoals hartslagmeters)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Hiermee kan de app toegang krijgen tot gegevens van sensoren die je lichamelijke conditie controleren, zoals je hartslag."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Toegang tot gegevens van lichaamssensoren, zoals hartslag, temperatuur en zuurstofpercentage in het bloed."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"toegang tot lichaamssensoren (zoals hartslagmeters) op de achtergrond"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Toegang tot gegevens van lichaamssensoren, zoals hartslag, temperatuur en zuurstofpercentage in het bloed, terwijl de app op de achtergrond wordt uitgevoerd."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Agenda-afspraken en -gegevens lezen"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Deze app kan alle agenda-afspraken lezen die zijn opgeslagen op je tablet en je agendagegevens delen of opslaan."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Deze app kan alle agenda-afspraken lezen die zijn opgeslagen op je Android TV-apparaat en je agendagegevens delen of opslaan."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Hiermee kan de app configuratie voor Niet storen lezen en schrijven."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"rechtengebruik starten"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Hiermee kan de houder het rechtengebruik voor een app starten. Nooit vereist voor normale apps."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"app-functies bekijken"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Hiermee kan de houder informatie over functies bekijken voor een app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"toegang krijgen tot sensorgegevens met een hoge samplingsnelheid"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 919d193..e825c2c 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ଇନ୍କମିଂ ତଥା ଆଉଟ୍ଗୋଇଂ କଲ୍ ଡାଟା ସହ ଆପଣଙ୍କ Android TV ଡିଭାଇସ୍ର କଲ୍ ଲଗ୍ ସଂଶୋଧନ କରିବାକୁ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ। କ୍ଷତିକାରକ ଆପ୍ଗୁଡ଼ିକ ଆପଣଙ୍କ କଲ୍ ଲଗ୍ ଲିଭାଇବାକୁ କିମ୍ବା ସଂଶୋଧନ କରିବା ପାଇଁ ଏହାକୁ ବ୍ୟବହାର କରିପାରନ୍ତି।"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ଇନ୍କମିଙ୍ଗ ତଥା ଆଉଟ୍ଗୋଇଙ୍ଗ କଲ୍ ଡାଟା ସହ ଆପଣଙ୍କ ଫୋନ୍ର କଲ୍ ଲଗ୍ ବଦଳାଇବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଏ। ହାନୀକାରକ ଆପ୍ ଆପଣଙ୍କ କଲ୍ ଲଗ୍ ଲିଭାଇବାକୁ କିମ୍ବା ବଦଳାଇବାକୁ ଏହା ବ୍ୟବହାର କରିପାରନ୍ତି।"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"ବଡୀ ସେନ୍ସର୍ ଆକ୍ସେସ୍ କରେ (ଯେପରିକି ହୃଦ୍ ହାର ମନିଟର୍)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"ଆପ୍କୁ ସେନ୍ସର୍ ଡେଟା ପର୍ଯ୍ୟନ୍ତ ପହଞ୍ଚିବାକୁ ଦେଇଥାଏ, ଯାହା ଆପଣଙ୍କ ଶାରୀରିକ ସ୍ଥିତିର ନିରୀକ୍ଷଣ କରିଥାଏ, ଯେପରିକି ଆପଣଙ୍କ ହୃଦୟ ସ୍ତର।"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"ହାର୍ଟ ରେଟ, ତାପମାତ୍ରା, ରକ୍ତରେ ଅମ୍ଳଜାନ ଶତକଡ଼ା ଇତ୍ୟାଦି ପରି ବଡି ସେନ୍ସରରୁ ଡାଟାକୁ ଆକ୍ସେସ।"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ପୃଷ୍ଠପଟରେ ଥିବା ସମୟରେ (ହାର୍ଟ ରେଟ ମନିଟର ପରି) ବଡି ସେନ୍ସରକୁ ଆକ୍ସେସ"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"ପୃଷ୍ଠପଟରେ ଥିବା ସମୟରେ ହାର୍ଟ ରେଟ, ତାପମାତ୍ରା, ରକ୍ତରେ ଅମ୍ଳଜାନ ଶତକଡ଼ା ଇତ୍ୟାଦି ପରି ବଡି ସେନ୍ସରରୁ ଡାଟାକୁ ଆକ୍ସେସ।"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"କ୍ୟାଲେଣ୍ଡର୍ ଇଭେଣ୍ଟ ଏବଂ ବିବରଣୀ ପଢ଼େ"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ଆପଣଙ୍କ ଟାବଲେଟ୍ରେ ଷ୍ଟୋର୍ କରାଯାଇଥିବା ସମସ୍ତ କ୍ୟାଲେଣ୍ଡର ଇଭେଣ୍ଟ ଏହି ଆପ୍ ପଢ଼ିପାରେ ଏବଂ ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର ଡାଟା ସେୟାର୍ କରିପାରେ କିମ୍ବା ସେଭ୍ କରିପାରେ।"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ଏହି ଆପ୍ ଆପଣଙ୍କ Android TV ଡିଭାଇସ୍ରେ ଷ୍ଟୋର୍ କରାଯାଇଥିବା ସମସ୍ତ କ୍ୟାଲେଣ୍ଡର ଇଭେଣ୍ଟ ପଢ଼ିପାରେ ଏବଂ ଆପଣଙ୍କ କ୍ୟାଲେଣ୍ଡର ଡାଟା ସେୟାର୍ କରିପାରେ କିମ୍ବା ସେଭ୍ କରିପାରେ।"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" କନଫିଗରେଶନ୍ ପଢ଼ିବା ତଥା ଲେଖିବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦେଇଥାଏ।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ଅନୁମତି ବ୍ୟବହାର ଦେଖିବା ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ଏକ ଆପ୍ ପାଇଁ ଅନୁମତିର ବ୍ୟବହାର ଆରମ୍ଭ କରିବାକୁ ଧାରକକୁ ଅନୁମତି ଦେଇଥାଏ। ସାଧାରଣ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ ଏହା ଆବଶ୍ୟକ ନୁହେଁ।"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ଆପର ଫିଚରଗୁଡ଼ିକୁ ଦେଖିବା ଆରମ୍ଭ କରନ୍ତୁ"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"କୌଣସି ଆପ ପାଇଁ ଫିଚରଗୁଡ଼ିକ ବିଷୟରେ ସୂଚନା ଦେଖିବା ଆରମ୍ଭ କରିବାକୁ ହୋଲଡରଙ୍କୁ ଅନୁମତି ଦିଏ।"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ଏକ ଉଚ୍ଚ ନମୁନାକରଣ ରେଟରେ ସେନ୍ସର୍ ଡାଟାକୁ ଆକ୍ସେସ୍ କରନ୍ତୁ"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"କଷ୍ଟମ୍ ଆପ୍ ବିଜ୍ଞପ୍ତି"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g>ରେ ଏକ ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବା ପାଇଁ <xliff:g id="ACCOUNT">%2$s</xliff:g>କୁ (ପୂର୍ବରୁ ଏହି ଆକାଉଣ୍ଟ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ନାମରେ ଅଛି) ଅନୁମତି ଦେବେ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g>ରେ ଏକ ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବା ପାଇଁ <xliff:g id="ACCOUNT">%2$s</xliff:g>କୁ ଅନୁମତି ଦେବେ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"ନିରୀକ୍ଷିତ ଉପଯୋଗକର୍ତ୍ତା ଯୋଗ କରନ୍ତୁ"</string>
<string name="language_selection_title" msgid="52674936078683285">"ଏକ ଭାଷା ଯୋଗ କରନ୍ତୁ"</string>
<string name="country_selection_title" msgid="5221495687299014379">"ପସନ୍ଦର ଅଞ୍ଚଳ"</string>
<string name="search_language_hint" msgid="7004225294308793583">"ଭାଷାର ନାମ ଟାଇପ୍ କରନ୍ତୁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index c628f1f..fd822a3 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ Android TV ਡੀਵਾਈਸ ਦਾ ਕਾਲ ਲੌਗ ਸੋਧਣ ਦਿੰਦੀ ਹੈ, ਇਸ ਵਿੱਚ ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਬਾਰੇ ਡਾਟਾ ਵੀ ਸ਼ਾਮਲ ਹੈ। ਭੈੜੀਆਂ ਐਪਾਂ ਤੁਹਾਡੀ ਜਾਣਕਾਰੀ ਤੋਂ ਬਿਨਾਂ ਕਾਲ ਲੌਗ ਡਾਟਾ ਮਿਟਾ ਜਾਂ ਸੋਧ ਸਕਦੀਆਂ ਹਨ।"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦਾ ਕਾਲ ਲੌਗ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਬਾਰੇ ਡਾਟਾ ਸਮੇਤ। ਖਰਾਬ ਐਪਾਂ ਇਸਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਕਾਲ ਲੌਗ ਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰਨ ਲਈ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"ਸਰੀਰ ਸੰਵੇਦਕਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰੋ (ਜਿਵੇਂ ਦਿਲ ਦੀ ਧੜਕਣ ਦੇ ਨਿਰੀਖਕ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"ਐਪ ਨੂੰ ਉਹਨਾਂ ਸੰਵੇਦਕਾਂ ਦੇ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ ਜੋ ਤੁਹਾਡੀ ਸਰੀਰਕ ਸਥਿਤੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੇ ਹਨ, ਜਿਵੇਂ ਤੁਹਾਡੇ ਦਿਲ ਦੀ ਧੜਕਣ।"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"ਸਰੀਰ ਸੰਬੰਧੀ ਸੈਂਸਰਾਂ ਜਿਵੇਂ ਕਿ ਦਿਲ ਦੀ ਧੜਕਣ, ਤਾਪਮਾਨ, ਖੂਨ ਵਿੱਚ ਮੌਜੂਦ ਆਕਸੀਜਨ ਦੀ ਫ਼ੀਸਦ ਆਦਿ ਤੋਂ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ।"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਰਹਿੰਦੇ ਹੋਏ (ਜਿਵੇਂ ਕਿ ਦਿਲ ਦੀ ਧੜਕਣ ਮਾਪਣ ਵਾਲੇ ਮਾਨੀਟਰ) ਸਰੀਰ ਸੰਬੰਧੀ ਸੈਂਸਰਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਰਹਿੰਦੇ ਹੋਏ ਸਰੀਰ ਸੰਬੰਧੀ ਸੈਂਸਰਾਂ ਜਿਵੇਂ ਕਿ ਦਿਲ ਦੀ ਧੜਕਣ, ਤਾਪਮਾਨ, ਖੂਨ ਵਿੱਚ ਮੌਜੂਦ ਆਕਸੀਜਨ ਦੀ ਫ਼ੀਸਦ ਆਦਿ ਤੋਂ ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰੋ।"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"ਕੈਲੰਡਰ ਵਰਤਾਰਿਆਂ ਅਤੇ ਵੇਰਵਿਆਂ ਨੂੰ ਪੜ੍ਹੋ"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਟੈਬਲੈੱਟ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਜਾਂ ਰੱਖਿਅਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ਇਹ ਐਪ ਤੁਹਾਡੇ Android TV ਡੀਵਾਈਸ \'ਤੇ ਸਟੋਰ ਕੀਤੇ ਸਾਰੇ ਕੈਲੰਡਰ ਇਵੈਂਟਾਂ ਨੂੰ ਪੜ੍ਹ ਸਕਦੀ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਜਾਂ ਰੱਖਿਅਤ ਕਰ ਸਕਦੀ ਹੈ।"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ਐਪ ਨੂੰ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਕੌਂਫਿਗਰੇਸ਼ਨ ਨੂੰ ਪੜ੍ਹਨ ਅਤੇ ਲਿਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਦੇਖਣਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ਧਾਰਕ ਨੂੰ ਕਿਸੇ ਹੋਰ ਐਪ ਲਈ ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ਐਪ ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਦੇਖਣਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ਇਸ ਨਾਲ ਹੋਲਡਰ ਨੂੰ ਕਿਸੇ ਐਪ ਦੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇਖਣ ਦੀ ਆਗਿਆ ਮਿਲਦੀ ਹੈ।"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ਉੱਚ ਸੈਂਪਲਿੰਗ ਰੇਟ \'ਤੇ ਸੈਂਸਰ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 6689a1a..c2e8663 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Pozwala aplikacji modyfikować rejestr połączeń na urządzeniu z Androidem TV, w tym dane o połączeniach przychodzących i wychodzących. Złośliwe aplikacje mogą wykorzystać tę możliwość, by wykasować lub zmodyfikować rejestr połączeń."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Zezwala aplikacji na modyfikowanie rejestru połączeń telefonu, w tym danych o połączeniach przychodzących i wychodzących. Złośliwe aplikacje mogą wykorzystać tę możliwość, by wyczyścić lub zmodyfikować rejestr połączeń."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"dostęp do czujników ciała (np. monitorujących tętno)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Pozwala aplikacji na dostęp do danych z czujników, które monitorują Twój stan fizyczny (np. tętno)."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Dostęp do danych pochodzących z czujników na ciele, takich jak tętno, temperatura, procent tlenu we krwi itd."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"dostęp do czujników na ciele (np. monitorujących tętno) podczas pracy w tle"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Dostęp do danych pochodzących z czujników na ciele, takich jak tętno, temperatura, procent tlenu we krwi itd., gdy aplikacja pracuje w tle."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Odczytywanie wydarzeń i informacji z kalendarza"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Ta aplikacja może odczytywać wszystkie zapisane na tablecie wydarzenia z kalendarza i udostępniać oraz zapisywać dane kalendarza."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Ta aplikacja może odczytywać wszystkie wydarzenia z kalendarza zapisane na urządzeniu z Androidem TV oraz udostępniać i zapisywać dane z kalendarza."</string>
@@ -737,6 +739,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Pozwala aplikacji na odczyt i zmianę konfiguracji trybu Nie przeszkadzać."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"rozpocząć wyświetlanie użycia uprawnień"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umożliwia rozpoczęcie korzystania z uprawnienia dotyczącego danej aplikacji jego posiadaczowi. Zwykłe aplikacje nie powinny potrzebować tego uprawnienia."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"rozpoczęcie wyświetlania funkcji aplikacji"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Umożliwia posiadaczowi rozpoczęcie przeglądania informacji o funkcjach aplikacji."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"dostęp do danych czujnika z wysoką częstotliwością"</string>
@@ -2053,8 +2059,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Niestandardowe powiadomienie z aplikacji"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Zezwolić aplikacji <xliff:g id="APP">%1$s</xliff:g> na utworzenie nowego użytkownika dla konta <xliff:g id="ACCOUNT">%2$s</xliff:g> (użytkownik dla tego konta już istnieje)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Zezwolić aplikacji <xliff:g id="APP">%1$s</xliff:g> na utworzenie nowego użytkownika dla konta <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Dodaj nadzorowanego użytkownika"</string>
<string name="language_selection_title" msgid="52674936078683285">"Dodaj język"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Ustawienie regionu"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Wpisz nazwę języka"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index e2bd6c5..3835310 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permite que o app modifique o registro de chamadas do seu dispositivo Android TV, incluindo dados sobre chamadas recebidas e realizadas. Apps maliciosos podem usar essa permissão para apagar ou modificar seu registro de chamadas."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permite que o app modifique o registro de chamadas de seu telefone, incluindo dados sobre chamadas recebidas e efetuadas. Apps maliciosos podem usar esta permissão para apagar ou modificar seu registro de chamadas."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"acessar sensores corporais (como monitores de frequência cardíaca)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permite que o app acesse dados de sensores que monitoram sua condição física, como a frequência cardíaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Acesso a dados dos sensores corporais, como frequência cardíaca, temperatura, porcentagem de oxigênio no sangue etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"acessar sensores corporais (como monitores de frequência cardíaca) em segundo plano"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Acesso a dados dos sensores corporais, como frequência cardíaca, temperatura, porcentagem de oxigênio no sangue etc. em segundo plano."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Ler detalhes e eventos da agenda"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Este app pode ler todos os eventos da agenda armazenados no seu tablet e compartilhar ou salvar os dados da sua agenda."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Este app pode ler todos os eventos da agenda armazenados no seu dispositivo Android TV e compartilhar ou salvar os dados da sua agenda."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permitir que o app leia e grave a configuração \"Não perturbe\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso da permissão para visualização"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"decisões de permissão da visualização inicial"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Autoriza o detentor a iniciar a tela para revisar as decisões de permissão. Não deve ser necessário para apps normais."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ver recursos do app"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que o sistema comece a ver as informações de recursos de um app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acessar os dados do sensor em uma taxa de amostragem elevada"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 1daf451..c2df19a 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permite à app modificar o registo de chamadas do seu dispositivo Android TV, incluindo os dados sobre as chamadas recebidas e efetuadas. As aplicações maliciosas podem utilizar esta funcionalidade para apagar ou modificar o seu registo de chamadas."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permite à app modificar o registo de chamadas do telemóvel, incluindo os dados sobre as chamadas recebidas e efetuadas. As aplicações maliciosas podem utilizar esta funcionalidade para apagar ou modificar o seu registo de chamadas."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"aceder a sensores corporais (como monitores do ritmo cardíaco)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permite que a app aceda a dados de sensores que monitorizam a sua condição física, como o ritmo cardíaco."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Acesso a dados dos sensores de corpo, como o ritmo cardíaco, a temperatura, a percentagem de oxigénio no sangue, etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"aceder a sensores de corpo (como monitores do ritmo cardíaco) em segundo plano"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Acesso a dados dos sensores de corpo, como o ritmo cardíaco, a temperatura, a percentagem de oxigénio no sangue, etc., em segundo plano."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Ler detalhes e eventos do calendário"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Esta app pode ler todos os eventos do calendário armazenados no seu tablet e partilhar ou guardar os dados do calendário."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Esta app pode ler todos os eventos do calendário armazenados no seu dispositivo Android TV e partilhar ou guardar os dados do calendário."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite à app ler e alterar a configuração de Não incomodar"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar utilização da autorização de visualização"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o titular inicie a utilização de autorizações para uma app. Nunca deverá ser necessário para aplicações normais."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"começar a ver as decisões de autorização"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Permite ao titular iniciar o ecrã para rever as decisões de autorização. Nunca deverá ser preciso para apps normais."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"começar a ver as funcionalidades da app"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que o titular comece a ver as informações das funcionalidades de uma app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"aceder aos dados de sensores a uma taxa de amostragem elevada"</string>
@@ -1989,8 +1993,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Notificação de app personalizada"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Permitir que a app <xliff:g id="APP">%1$s</xliff:g> crie um novo utilizador com a conta <xliff:g id="ACCOUNT">%2$s</xliff:g> (já existe um utilizador com esta conta)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Permitir que a app <xliff:g id="APP">%1$s</xliff:g> crie um novo utilizador com a conta <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Adicionar utilizador supervisionado"</string>
<string name="language_selection_title" msgid="52674936078683285">"Adicionar um idioma"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Preferência de região"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Intr. nome do idioma"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index e2bd6c5..3835310 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permite que o app modifique o registro de chamadas do seu dispositivo Android TV, incluindo dados sobre chamadas recebidas e realizadas. Apps maliciosos podem usar essa permissão para apagar ou modificar seu registro de chamadas."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permite que o app modifique o registro de chamadas de seu telefone, incluindo dados sobre chamadas recebidas e efetuadas. Apps maliciosos podem usar esta permissão para apagar ou modificar seu registro de chamadas."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"acessar sensores corporais (como monitores de frequência cardíaca)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permite que o app acesse dados de sensores que monitoram sua condição física, como a frequência cardíaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Acesso a dados dos sensores corporais, como frequência cardíaca, temperatura, porcentagem de oxigênio no sangue etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"acessar sensores corporais (como monitores de frequência cardíaca) em segundo plano"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Acesso a dados dos sensores corporais, como frequência cardíaca, temperatura, porcentagem de oxigênio no sangue etc. em segundo plano."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Ler detalhes e eventos da agenda"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Este app pode ler todos os eventos da agenda armazenados no seu tablet e compartilhar ou salvar os dados da sua agenda."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Este app pode ler todos os eventos da agenda armazenados no seu dispositivo Android TV e compartilhar ou salvar os dados da sua agenda."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permitir que o app leia e grave a configuração \"Não perturbe\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"iniciar uso da permissão para visualização"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite que o sistema inicie o uso de permissão para um app. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"decisões de permissão da visualização inicial"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Autoriza o detentor a iniciar a tela para revisar as decisões de permissão. Não deve ser necessário para apps normais."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ver recursos do app"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite que o sistema comece a ver as informações de recursos de um app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"acessar os dados do sensor em uma taxa de amostragem elevada"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 035d1eb..2f89483 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -430,7 +430,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Permite aplicației să modifice jurnalul de apeluri al dispozitivului Android TV, inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul de apeluri."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Permite aplicației să modifice jurnalul de apeluri al telefonului dvs., inclusiv datele despre apelurile primite sau efectuate. Aplicațiile rău intenționate pot utiliza această permisiune pentru a șterge sau pentru a modifica jurnalul dvs. de apeluri."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"să acceseze senzorii corporali (cum ar fi monitoarele cardiace)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Permite aplicației să acceseze date de la senzorii care vă monitorizează starea fizică, cum ar fi ritmul cardiac."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Acces la date de la senzori corporali, cum ar fi senzorii pentru puls, temperatură, procentul de oxigen din sânge etc."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"Acces la senzorii corporali (cum ar fi monitoarele cardiace) din fundal"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Acces din fundal la date de la senzori corporali, cum ar fi senzorii pentru puls, temperatură, procentul de oxigen din sânge etc."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"să citească evenimentele din calendar și detaliile"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Această aplicație poate să citească toate evenimentele din calendar stocate pe tabletă și să trimită sau să salveze datele din calendar."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Această aplicație poate să citească toate evenimentele din calendar stocate pe dispozitivul Android TV și să trimită sau să salveze datele din calendar."</string>
@@ -734,6 +736,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Permite aplicației să citească și să scrie configurația Nu deranja."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"porniți folosirea permisiunii de vizualizare"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Permite proprietarului să pornească folosirea permisiunii pentru o aplicație. Nu ar trebui să fie necesară pentru aplicațiile obișnuite."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"începeți să vedeți funcțiile aplicației"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Permite proprietarului să înceapă să vadă informațiile despre funcții pentru o aplicație."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"să acceseze date de la senzori la o rată de eșantionare mare"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 1b64a3b..e4d6527 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Приложение сможет изменять список вызовов и данные о входящих и исходящих звонках на устройстве Android TV. Вредоносные программы смогут воспользоваться этим для удаления или изменения информации о звонках."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Приложение сможет вносить изменения в список вызовов телефона и данные о входящих и исходящих звонках. Вредоносные приложения смогут воспользоваться этим для удаления или изменения информации о звонках."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"Датчики (например, пульсометр)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Приложение сможет получить доступ к данным датчиков, размещенных на теле, например измеряющих частоту сердцебиения."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Доступ к данным датчиков на теле (например, пульсу, температуре, уровню кислорода в крови)."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"Доступ к датчикам на теле (например, пульсометру) в фоновом режиме"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Доступ к данным датчиков на теле (например, пульсу, температуре, уровню кислорода в крови) в фоновом режиме."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Чтение мероприятий и данных"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Приложение может считывать, отправлять и сохранять информацию о мероприятиях в календаре планшета."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Приложение может считывать, отправлять и сохранять информацию о мероприятиях в календаре устройства Android TV."</string>
@@ -737,6 +739,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Открывает приложению доступ к настройкам режима \"Не беспокоить\" и позволяет изменять их."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"Просмотр данных об используемых разрешениях"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Приложение получит доступ к данным об используемых разрешениях. Это разрешение не требуется обычным приложениям."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"Просмотр функций приложения"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Позволяет просматривать информацию о функциях приложения."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"Доступ к данным датчиков при высокой частоте дискретизации"</string>
@@ -2053,8 +2059,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Уведомление пользовательского приложения"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Разрешить приложению \"<xliff:g id="APP">%1$s</xliff:g>\" создать нового пользователя с аккаунтом <xliff:g id="ACCOUNT">%2$s</xliff:g> (пользователь с этим аккаунтом уже существует)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Разрешить приложению \"<xliff:g id="APP">%1$s</xliff:g>\" создать нового пользователя с аккаунтом <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Создать контролируемый профиль"</string>
<string name="language_selection_title" msgid="52674936078683285">"Добавить язык"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Региональные настройки"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Введите название языка"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index cf7fc87..027fcd2 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ලැබෙන ඇමතුම් සහ පිටවන ඇමතුම් දත්ත ඇතුළත්ව ඔබගේ Android TV උපාංගයෙහි ඇමතුම් ලොගය වෙනස් කිරීමට යෙදුමට ඉඩ දෙයි. ඔබගේ ඇමතුම් ලොගය මැකීමට හෝ වෙනස් කිරීමට අනිෂ්ට යෙදුම් මෙය භාවිත කළ හැකිය."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"පැමිණෙන සහ පිටවෙන ඇමතුම් දත්ත ඇතුළුව ඔබගේ දුරකථනයේ ඇමතුම් ලොගය වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. ඔබගේ ඇමතුම් ලොගය මැකීමට හෝ වෙනස් කිරීමට අනිෂ්ට යෙදුම් මෙය භාවිත කල හැක."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"දේහ සංවේදකවලට (හෘද ස්පන්දන වේග මොනිටර වැනි) පිවිසීම"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"හෘද ස්පන්දන වේගය වැනි ඔබගේ ශාරීරික තත්ත්වය නිරීක්ෂණය කරන සංවේදක වලින් දත්ත ලබාගැනීමට යෙදුමට ඉඩ දෙන්න."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"හෘද ස්පන්දන වේගය, උෂ්ණත්වය, රුධිර ඔක්සිජන් ප්රතිශතය වැනි ශරීර සංවේදකවලින් දත්ත වෙත ප්රවේශය."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"පසුබිමේ සිටියදී ශරීර සංවේදක (හෘද ස්පන්දන වේග මොනිටර වැනි) වෙත ප්රවේශය"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"පසුබිමේ සිටියදී, හෘද ස්පන්දන වේගය, උෂ්ණත්වය, රුධිර ඔක්සිජන් ප්රතිශතය වැනි ශරීර සංවේදකවලින් දත්ත වෙත ප්රවේශය."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"දින දර්ශන සිදුවීම් හා විස්තර කියවන්න"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"මෙම යෙදුමට ඔබගේ ටැබ්ලට් පරිගණකය මත ගබඩා වී ඇති සියලු දින දර්ශන කියවීමට සහ සහ ඔබගේ දින දර්ශන දත්ත බෙදා ගැනීමට සහ සුරැකීමට හැකිය."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"මෙම යෙදුමට ඔබගේ Android TV මත ගබඩා කර ඇති සියලු දින දර්ශන සිදුවීම් කියවීමට සහ ඔබගේ දින දර්ශන දත්ත බෙදා ගැනීමට හෝ සුරැකීමට හැකිය."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"බාධා නොකරන්න වින්යාස කිරීම කියවීමට සහ ලිවීමට යෙදුමට ඉඩ දෙයි."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"අවසර භාවිතය බැලීමට ආරම්භ කරන්න"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"තබා සිටින්නාට යෙදුමක් සඳහා අවසර භාවිතය ආරම්භ කිරීමට ඉඩ දෙයි. සාමාන්ය යෙදුම් සඳහා කිසි විටෙක අවශ්ය නොවිය යුතු ය."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"යෙදුම බලන්න විශේෂාංග ආරම්භ කරන්න"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"යෙදුමක් සඳහා විශේෂාංග තොරතුරු බැලීම ආරම්භ කිරීමට දරන්නාට ඉඩ දෙන්න."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ඉහළ නියැදි කිරීමේ වේගයකින් සංවේදක දත්ත වෙත පිවිසෙන්න"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"අභිරුචි යෙදුම් දැනුම් දීම"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g> හට <xliff:g id="ACCOUNT">%2$s</xliff:g> සමගින් නව පරිශීලකයෙකු සෑදීමට ඉඩ දෙන්නද (මෙම ගිණුම සහිත පරිශීලකයෙකු දැනටමත් සිටී) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g> හට <xliff:g id="ACCOUNT">%2$s</xliff:g> සමගින් නව පරිශීලකයෙකු සෑදීමට ඉඩ දෙන්නද ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"අධීක්ෂණය කළ පරිශීලක එක් කරන්න"</string>
<string name="language_selection_title" msgid="52674936078683285">"භාෂාවක් එක් කරන්න"</string>
<string name="country_selection_title" msgid="5221495687299014379">"ප්රදේශ මනාපය"</string>
<string name="search_language_hint" msgid="7004225294308793583">"භාෂා නම ටයිප් කරන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index c6423dc..517ce6c 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Umožňuje aplikácii upravovať denník hovorov zariadenia Android TV vrátane údajov o prichádzajúcich a odchádzajúcich hovoroch. Škodlivé aplikácie to môžu zneužiť na vymazanie alebo úpravu denníkov hovorov."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Umožňuje aplikácii upravovať zoznam hovorov vo vašom telefóne vrátane údajov o prichádzajúcich a odchádzajúcich hovoroch. Škodlivé aplikácie to môžu zneužiť na vymazanie alebo úpravu vášho zoznamu hovorov."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"prístup k telovým senzorom (ako sú snímače tepu)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Umožňuje aplikácii získať prístup k údajom senzorov monitorujúcich vašu fyzickú kondíciu (napríklad pulz)."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Prístup k údajom z telových senzorov, ako sú pulz, teplota, saturácia atď."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"prístup k telovým senzorom (ako sú snímače pulzu) na pozadí"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Prístup k údajom z telových senzorov, ako sú pulz, teplota, saturácia atď., na pozadí."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Čítanie udalostí kalendára a podrobností"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Táto aplikácia môže čítať všetky udalosti kalendára uložené vo vašom tablete a zdieľať alebo ukladať dáta kalendára."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Táto aplikácia môže čítať všetky udalosti kalendára uložené vo vašom zariadení Android TV a zdieľať alebo ukladať údaje kalendára."</string>
@@ -737,6 +739,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Umožňuje aplikácii čítať a zapisovať konfiguráciu režimu bez vyrušení."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"spustenie používania povolenia na zobrazenie"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Umožňuje držiteľovi spustiť používanie povolenia aplikáciou. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"spustenie zobrazenia rozhodnutí o povolení"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Umožňuje držiteľovi spustiť obrazovku a skontrolovať rozhodnutia o povoleniach. Bežné aplikácie by toto povolenie nemali nikdy potrebovať."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"zobrazenie informácií o funkciách aplikácie"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Umožňuje držiteľovi zobraziť informácie o funkciách aplikácie."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"prístup k dátam senzorom s vysokou vzorkovacou frekvenciou"</string>
@@ -2053,8 +2057,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Vlastné upozornenie na aplikáciu"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Chcete povoliť aplikácii <xliff:g id="APP">%1$s</xliff:g> vytvoriť nového používateľa pomocou účtu <xliff:g id="ACCOUNT">%2$s</xliff:g> (používateľ s týmto účtom už existuje)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Chcete povoliť aplikácii <xliff:g id="APP">%1$s</xliff:g> vytvoriť nového používateľa pomocou účtu <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Pridať kontrolovaného používateľa"</string>
<string name="language_selection_title" msgid="52674936078683285">"Pridať jazyk"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Preferovaný región"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Zadajte názov jazyka"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 1e8f264..7bcc257 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Aplikaciji dovoljuje spreminjanje dnevnika klicev v napravi Android TV, vključno s podatki o dohodnih in odhodnih klicih. Zlonamerne aplikacije lahko tako izbrišejo ali spreminjajo vaš dnevnik klicev."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Aplikaciji dovoli spreminjanje dnevnika klicev v telefonu, vključno s podatki o dohodnih in odhodnih klicih. Zlonamerne aplikacije lahko tako izbrišejo ali spreminjajo vaš dnevnik klicev."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"dostop do tipal telesnih funkcij (npr. merilnikov srčnega utripa)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Aplikaciji omogoča dostop do podatkov tipal, ki nadzirajo vaše fizično stanje, med drugim vaš srčni utrip."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Dostop do podatkov iz tipal telesnih funkcij, kot so srčni utrip, temperatura, odstotek kisika v krvi itd."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"dostop do tipal telesnih funkcij (npr. merilnika srčnega utripa) v ozadju"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Dostop do podatkov iz tipal telesnih funkcij, kot so srčni utrip, temperatura, odstotek kisika v krvi itd., med delovanjem v ozadju."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Branje dogodkov v koledarjih in podrobnosti koledarjev"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Ta aplikacija lahko prebere vse dogodke v koledarju, ki so shranjeni v tabličnem računalniku, ter shrani podatke koledarja ali jih deli z drugimi."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Ta aplikacija lahko prebere vse dogodke v koledarju, ki so shranjeni v napravi Android TV, ter shrani podatke koledarja ali jih deli z drugimi."</string>
@@ -737,6 +739,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Aplikaciji omogoča branje in pisanje konfiguracije načina »ne moti«."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"začetek uporabe dovoljenja za ogledovanje"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Imetniku omogoča začetek uporabe dovoljenj za aplikacijo. Nikoli ni potrebno za navadne aplikacije."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"prikaz odločitev o dovoljenjih"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Imetniku omogoča prikaz zaslona za pregled odločitev o dovoljenjih. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"začetek ogledovanja funkcij aplikacije"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Imetniku omogoča začetek ogledovanja informacij o funkcijah poljubne aplikacije."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"dostop do podatkov tipal z večjo hitrostjo vzorčenja"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 705e309..eab7f73 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Lejon aplikacionin të modifikojë ditarin e telefonatave të pajisjes sate Android TV, duke përfshirë të dhëna rreth telefonatave hyrëse dhe dalëse. Aplikacionet keqdashëse mund ta përdorin këtë për të spastruar ose modifikuar evidencën tënde të telefonatave."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Lejon aplikacionin të modifikojë ditarin e telefonatave të telefonit tënd, përfshirë të dhënat rreth telefonatave hyrëse dhe dalëse. Aplikacionet keqdashëse mund ta përdorin këtë për të fshirë ose modifikuar ditarin tënd të telefonatave."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"qasu te sensorët e trupit (si monitorimet e rrahjeve të zemrës)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Lejon aplikacionin të ketë qasje në të dhënat nga ndjesorë që monitorojnë gjendjen tënde fizike, siç janë rrahjet e zemrës."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Qasje te të dhënat nga sensorët e trupit, si p.sh. rrahjet e zemrës, temperatura, përqindja e oksigjenit në gjak etj."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"qasje te sensorët e trupit (si p.sh. monitorët e rrahjeve të zemrës) ndërkohë që është në sfond"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Qasje te të dhënat nga sensorët e trupit, si p.sh. rrahjet e zemrës, temperatura, përqindja e oksigjenit në gjak etj. ndërkohë që është në sfond."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Lexo ngjarjet e kalendarit dhe detajet"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Ky aplikacion mund të lexojë të gjitha ngjarjet e kalendarit të ruajtura në tabletin tënd dhe të ndajë ose të ruajë të dhënat e kalendarit."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Ky aplikacion mund të lexojë të gjitha ngjarjet e kalendarit të ruajtura në pajisjen tënde Android TV dhe të ndajë ose të ruajë të dhënat e kalendarit."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Lejon aplikacionin të lexojë dhe shkruajë konfigurimin e \"Mos shqetëso\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"nis përdorimin e lejes për shikimin"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Lejon që mbajtësi të nisë përdorimin e lejeve për një aplikacion. Nuk duhet të nevojitet asnjëherë për aplikacionet normale."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"fillojë shikimin e veçorive të aplikacionit"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Lejon që zotëruesi të fillojë të shikojë informacionin e veçorive për një aplikacion."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"qasu te të dhënat e sensorit me një shpejtësi kampionimi më të lartë"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Njoftim i personalizuar për aplikacionin"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Të lejohet <xliff:g id="APP">%1$s</xliff:g> që të krijojë një përdorues të ri me <xliff:g id="ACCOUNT">%2$s</xliff:g> (një përdorues me këtë llogari ekziston tashmë) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Të lejohet <xliff:g id="APP">%1$s</xliff:g> që të krijojë një përdorues të ri me <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Shto përdorues të kontrolluar"</string>
<string name="language_selection_title" msgid="52674936078683285">"Shto një gjuhë"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Preferenca e rajonit"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Shkruaj emrin e gjuhës"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index dde0e33..8d49f2a 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -430,7 +430,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Дозвољава апликацији да мења евиденцију позива на Android TV уређају, укључујући податке о долазним и одлазним позивима. Злонамерне апликације могу ово да користе за брисање или мењање евиденције позива."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Дозвољава апликацији да мења евиденцију позива на телефону, укључујући податке о долазним и одлазним позивима. Злонамерне апликације могу ово да користе да би брисале или мењале евиденцију позива."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"приступ сензорима на телу (попут монитора за праћење пулса)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Дозвољава апликацији да приступа подацима са сензора који надгледају физичку кондицију, као што је број откуцаја срца."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Приступ подацима сензора за тело, попут пулса, температуре, проценат кисеоника у крви итд."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"приступ сензорима на телу (нпр. монитори за праћење пулса) током рада у позадини"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Приступ подацима сензора за тело, попут пулса, температуре, проценат кисеоника у крви итд, током рада у позадини."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Читање догађаја и података из календара"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Ова апликација може да чита све догађаје из календара које чувате на таблету, као и да дели или чува податке из календара."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Ова апликација може да чита све догађаје из календара које чувате на Android TV уређају, као и да дели или чува податке из календара."</string>
@@ -734,6 +736,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Дозвољава апликацији да чита и уписује конфигурацију подешавања Не узнемиравај."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"почетак коришћења дозволе за преглед"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Дозвољава власнику да започне коришћење дозволе за апликацију. Никада не би требало да буде потребна за уобичајене апликације."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"покретање приказа функција апликације"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Дозвољава носиоцу дозволе да започне прегледање информација о функцијама апликације."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"приступ подацима сензора при великој брзини узорковања"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 2003e64..af3586b 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Tillåter att appen gör ändringar i Android TV-enhetens samtalshistorik, inklusive i uppgifter om inkommande och utgående samtal. Skadliga appar kan använda detta för att radera eller ändra samtalshistoriken."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Tillåter att appen gör ändringar i mobilens samtalslista, inklusive i uppgifter om inkommande och utgående samtal. Skadliga program kan använda detta för att radera eller ändra din samtalslista."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"få åtkomst till kroppssensorer (till exempel pulsmätare)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Ger appen åtkomst till information från sensorer om ditt fysiska tillstånd, till exempel din puls."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Åtkomst till data från kroppssensorer, t.ex. puls, kroppstemperatur, procentandel syre i blodet med mera."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"åtkomst till kroppssensorer (t.ex. pulsmätare) i bakgrunden"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Åtkomst till data från kroppssensorer, t.ex. puls, kroppstemperatur, procentandel syre i blodet med mera, i bakgrunden."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Läsa kalenderhändelser och kalenderuppgifter"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Appen kan läsa alla kalenderhändelser som sparats på surfplattan och dela eller spara uppgifter i din kalender."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Appen kan läsa alla kalenderhändelser som sparats på Android TV-enheten och dela eller spara uppgifter i din kalender."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ger appen läs- och skrivbehörighet till konfigurationen för Stör ej."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"börja visa behörighetsanvändningen"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Gör att innehavaren kan öppna behörighetsanvändning för en app. Ska inte behövas för vanliga appar."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"börja visa appfunktioner"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Tillåter att innehavaren börjar visa information om funktioner för en app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"åtkomst till sensordata med en hög samplingsfrekvens"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index f955203..f70bfcd 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Huruhusu programu irekebishe kumbukumbu za simu ya kifaa chako cha Android TV, ikiwa ni pamoja na data kuhusu simu zinazoingia na simu unazopiga. Huenda programu hasidi zikatumia ruhusa hii ili kufuta au kurekebisha kumbukumbu zako za simu."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Huruhusu programu kurekebisha rajisi ya simu yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kufuta au kurekebisha rajisi ya simu yako."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"fikia vitambua shughuli za mwili (kama vifuatiliaji vya mapigo ya moyo)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Huruhusu programu kufikia data kutoka vihisi vinavyofuatilia hali yako ya kimwili, kama vile mapigo ya moyo."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Kufikia data katika vitambuzi vya shughuli za mwili kama vile mapigo ya moyo, halijoto, asilimia ya oksijeni kwenye damu n.k."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"kufikia vitambuzi vya shughuli za mwili (kama vile vifuatiliaji vya mapigo ya moyo) inapotumika chinichini"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Kufikia data katika vitambuzi vya shughuli za mwili kama vile mapigo ya moyo, halijoto, asilimia ya oksijeni kwenye damu n.k. inapotumika chinichini."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Soma matukio na maelezo ya kalenda"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Programu hii inaweza kusoma matukio yote ya kalenda yaliyohifadhiwa kwenye kompyuta yako kibao na kushiriki au kuhifadhi data yako ya kalenda."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Programu hii inaweza kusoma matukio yote ya kalenda yaliyohifadhiwa kwenye kifaa chako cha Android TV na kushiriki au kuhifadhi data ya kalenda yako."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Inaruhusu programu kusoma na kuandika usanidi wa kipengee cha Usinisumbue."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"anzisha kipengele cha kuona matumizi ya ruhusa"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Huruhusu kishikiliaji kuanzisha matumizi ya ruhusa ya programu. Haipaswi kuhitajika kwa ajili ya programu za kawaida."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"anzisha kipengele cha kuangalia vipengele vya programu"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Huruhusu mmiliki kuanza kuangalia maelezo ya vipengele vya programu."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"fikia data ya vitambuzi kwa kasi ya juu ya sampuli"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index a7296dc..1114bf1 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"உள்வரும், வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உட்பட உங்கள் Android TVயின் அழைப்புப் பதிவைத் திருத்த ஆப்ஸை அனுமதிக்கும். உங்கள் அழைப்புப் பதிவை அழிக்கவோ திருத்தவோ தீங்கு விளைவிக்கும் ஆப்ஸ் இதைப் பயன்படுத்தக்கூடும்."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் மொபைல் அழைப்புப் பதிவைத் திருத்துவதற்குப் ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் ஆப்ஸ் இதைப் பயன்படுத்தலாம்."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"உடல் உணர்விகளை (இதயத் துடிப்பு மானிட்டர்கள் போன்றவை) அணுகுதல்"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"உங்கள் இதயத்துடிப்பு விகிதம் போன்ற உங்கள் உடல்நிலையைக் கண்காணிக்கும் உணர்விகளில் இருந்து தரவை அணுக ஆப்ஸை அனுமதிக்கும்."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"இதயத் துடிப்பு, வெப்பநிலை, ரத்த ஆக்ஸிஜன் சதவீதம் போன்ற உடல் சென்சார்களில் இருந்து கிடைக்கும் தரவை அணுகலாம்."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"பின்னணியில் உடல் சென்சார்களை (இதயத் துடிப்பைக் கண்காணித்தல் போன்றவை) அணுகுதல்"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"பின்னணியில் இருக்கும்போது இதயத் துடிப்பு, வெப்பநிலை, ரத்த ஆக்ஸிஜன் சதவீதம் போன்ற உடல் சென்சார்களில் இருந்து கிடைக்கும் தரவை அணுகலாம்."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"கேலெண்டர் நிகழ்வுகளையும் விவரங்களையும் படிக்கலாம்"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"இந்த ஆப்ஸ் உங்கள் டேப்லெட்டில் சேமிக்கப்பட்டுள்ள கேலெண்டர் நிகழ்வுகள் அனைத்தையும் படிக்கலாம், உங்கள் கேலெண்டர் தரவைப் பகிரலாம் அல்லது சேமிக்கலாம்."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"உங்கள் Android TVயில் சேமித்துள்ள அனைத்துக் கேலெண்டர் நிகழ்வுகளையும் இந்த ஆப்ஸால் தெரிந்துகொள்ள முடியும். அத்துடன் உங்களின் கேலெண்டர் தரவைப் பகிரவும் சேமிக்கவும் முடியும்."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"தொந்தரவு செய்ய வேண்டாம் உள்ளமைவைப் படிக்கவும் எழுதவும், ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"அனுமதி உபயோகத்தை அணுகுதல்"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ஆப்ஸிற்கான அனுமதி உபயோகத்தை ஹோல்டருக்கு வழங்கும். இயல்பான ஆப்ஸிற்கு இது எப்போதுமே தேவைப்படாது."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ஆப்ஸின் அம்சங்களைப் பார்க்கத் தொடங்குதல்"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ஆப்ஸின் அம்சங்கள் குறித்த தகவல்களைப் பார்ப்பதற்கான அனுமதியை ஹோல்டருக்கு வழங்கும்."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"அதிகளவிலான சாம்பிளிங் ரேட்டில் சென்சார் தரவை அணுகுதல்"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index dc21719..0d9cb8b 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్స్కు సంబంధించిన డేటాతో సహా మీ Android TV పరికరం కాల్ లాగ్ను సవరించడానికి యాప్ని అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను తీసివేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ఇన్కమింగ్ మరియు అవుట్గోయింగ్ కాల్స్ల గురించిన డేటాతో సహా మీ ఫోన్ యొక్క కాల్ లాగ్ను సవరించడానికి యాప్ను అనుమతిస్తుంది. హానికరమైన యాప్లు మీ కాల్ లాగ్ను ఎరేజ్ చేయడానికి లేదా సవరించడానికి దీన్ని ఉపయోగించవచ్చు."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"శరీర సెన్సార్లను (గుండె స్పందన రేటు మానిటర్ల వంటివి) యాక్సెస్ చేయండి"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"మీ శారీరక పరిస్థితిని అనగా మీ గుండె స్పందన రేటు వంటి వాటిని పర్యవేక్షించే సెన్సార్ల నుండి డేటాను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"గుండె స్పందన రేటు, ఉష్ణోగ్రత, రక్తంలో ఆక్సిజన్ శాతం మొదలైన శరీర సెన్సార్ల నుండి డేటాను యాక్సెస్ చేయండి."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"బ్యాక్గ్రౌండ్లో శరీర సెన్సార్లను (గుండె రేటు మానిటర్స్) యాక్సెస్ చేయండి"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"బ్యాక్గ్రౌండ్లో ఉన్నప్పుడు గుండె స్పందన రేటు, ఉష్ణోగ్రత, రక్తంలో ఆక్సిజన్ శాతం మొదలైన శరీర సెన్సార్ల నుండి డేటాకు యాక్సెస్ చేయండి."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"క్యాలెండర్ ఈవెంట్లు మరియు వివరాలను చదవడం"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"ఈ యాప్ మీ టాబ్లెట్లో నిల్వ చేసిన క్యాలెండర్ ఈవెంట్లన్నీ చదవగలదు మరియు మీ క్యాలెండర్ డేటాను షేర్ చేయగలదు లేదా సేవ్ చేయగలదు."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"ఈ యాప్ మీ Android TV పరికరంలో నిల్వ చేసిన క్యాలెండర్ ఈవెంట్లన్నీ చదవగలదు, మీ క్యాలెండర్ డేటాను షేర్ చేయగలదు లేదా సేవ్ చేయగలదు."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు రాయడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"యాప్నకు అనుమతి వినియోగాన్ని ప్రారంభించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ ఇటువంటి అనుమతి అవసరం ఉండదు."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"యాప్ ఫీచర్లను చూడటాన్ని ప్రారంభించండి"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"యాప్ ఫీచర్ల సమాచారాన్ని చూడటాన్ని ప్రారంభించడానికి హోల్డర్ను అనుమతిస్తుంది."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"అధిక శాంపిల్ రేటు వద్ద సెన్సార్ డేటాను యాక్సెస్ చేయండి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 15d7f30..b6b0345 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"อนุญาตให้แอปแก้ไขบันทึกการโทรจากอุปกรณ์ Android TV รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและสายโทรออก แอปที่เป็นอันตรายอาจใช้สิทธิ์นี้เพื่อลบหรือแก้ไขบันทึกการโทรได้"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"อนุญาตให้แอปแก้ไขบันทึกการโทรจากโทรศัพท์ของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อลบหรือแก้ไขบันทึกการโทรของคุณ"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"เข้าถึงเซ็นเซอร์ร่างกาย (เช่น ตัววัดอัตราการเต้นของหัวใจ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"อนุญาตให้แอปเข้าถึงข้อมูลจากเซ็นเซอร์ที่ตรวจสอบสภาพทางกายภาพ เช่น อัตราการเต้นของหัวใจ"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"เข้าถึงข้อมูลจากเซ็นเซอร์ร่างกาย เช่น อัตราการเต้นของหัวใจ อุณหภูมิ เปอร์เซ็นต์ออกซิเจนในเลือด ฯลฯ"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"เข้าถึงเซ็นเซอร์ร่างกาย (เช่น เครื่องวัดอัตราการเต้นของหัวใจ) ในเบื้องหลัง"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"เข้าถึงข้อมูลจากเซ็นเซอร์ร่างกาย เช่น อัตราการเต้นของหัวใจ อุณหภูมิ เปอร์เซ็นต์ออกซิเจนในเลือด ฯลฯ ในเบื้องหลัง"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"อ่านกิจกรรมในปฏิทินและรายละเอียด"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"แอปนี้สามารถอ่านกิจกรรมทั้งหมดในปฏิทินที่เก็บไว้ในแท็บเล็ต รวมถึงแชร์หรือบันทึกข้อมูลในปฏิทินของคุณ"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"แอปนี้อ่านกิจกรรมทั้งหมดในปฏิทินที่จัดเก็บไว้ในอุปกรณ์ Android TV ได้ รวมถึงแชร์หรือบันทึกข้อมูลในปฏิทินของคุณได้ด้วย"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"อนุญาตให้แอปอ่านและเขียนการกำหนดค่าโหมดห้ามรบกวน"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"เริ่มการใช้สิทธิ์การดู"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"อนุญาตให้เจ้าของเริ่มการใช้สิทธิ์ของแอป ไม่จำเป็นสำหรับแอปทั่วไป"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"เริ่มดูฟีเจอร์ของแอป"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"อนุญาตให้เจ้าของเริ่มดูข้อมูลฟีเจอร์สำหรับแอป"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"เข้าถึงข้อมูลเซ็นเซอร์ที่อัตราการสุ่มตัวอย่างสูง"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index cb6c485..fa73788 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Nagbibigay-daan sa app na baguhin ang log ng tawag ng iyong Android TV device, kasama ang data tungkol sa mga papasok at papalabas na tawag. Puwede itong gamitin ng mga mapaminsalang app para burahin o baguhin ang iyong log ng tawag."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Binibigyan-daan ang app na baguhin ang log ng tawag ng iyong telepono, kabilang ang data tungkol sa mga paparating at papalabas na tawag. Maaari itong gamitin ng nakakahamak na apps upang burahin o baguhin ang iyong log ng tawag."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"i-access ang mga sensor sa katawan (tulad ng mga monitor ng bilis ng tibok ng puso)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Pinapayagan ang app na i-access ang data mula sa mga sensor na sumusubaybay sa iyong pisikal na kondisyon, tulad ng iyong heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Access sa data mula sa mga sensor ng katawan gaya ng bilis ng tibok ng puso, temperatura, porsyento ng oxygen sa dugo, atbp."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"i-access ang body sensors (tulad ng heart rate monitors) habang nasa background"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Access sa data mula sa mga sensor ng katawan gaya ng bilis ng tibok ng puso, temperatura, porsyento ng oxygen sa dugo, atbp. habang nasa background."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Magbasa ng mga event sa kalendaryo at detalye"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Mababasa ng app na ito ang lahat ng event sa kalendaryo na naka-store sa iyong tablet at maibabahagi o mase-save nito ang data ng iyong kalendaryo."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Mababasa ng app na ito ang lahat ng event sa kalendaryo na naka-store sa iyong Android TV device at maibabahagi o mase-save nito ang data ng kalendaryo mo."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Nagbibigay-daan sa app na basahin at isulat ang configuration ng Huwag Istorbohin."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"simulan ang paggamit sa pahintulot sa pagtingin"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Binibigyang-daan ang may hawak na simulan ang paggamit ng pahintulot para sa isang app. Hindi dapat kailanganin kailanman para sa mga normal na app."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"simulang tingnan ang mga feature ng app"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Nagbibigay-daan sa may hawak na simulang tingnan ang impormasyon ng mga feature para sa isang app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"mag-access ng data ng sensor sa mataas na rate ng pag-sample"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Custom na notification ng app"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Payagan ang <xliff:g id="APP">%1$s</xliff:g> na gumawa ng bagong User sa <xliff:g id="ACCOUNT">%2$s</xliff:g> (mayroon nang User sa account na ito) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Payagan ang <xliff:g id="APP">%1$s</xliff:g> na gumawa ng bagong User sa <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Magdagdag ng pinapangasiwaang user"</string>
<string name="language_selection_title" msgid="52674936078683285">"Magdagdag ng wika"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Kagustuhan sa rehiyon"</string>
<string name="search_language_hint" msgid="7004225294308793583">"I-type ang wika"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index df4a960..adf96e0 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Uygulamaya, Android TV cihazınızın arama günlüğünde (gelen ve giden aramalarla ilgili veriler dahil olmak üzere) değişiklik yapma izni verir. Kötü amaçlı uygulamalar bu izni kullanarak arama günlüğünüzü silebilir veya değiştirebilir."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Uygulamaya telefonunuzun arama günlüğünde (gelen ve giden aramalarla ilgili veriler dahil olmak üzere) değişiklik yapma izni verir. Kötü amaçlı uygulamalar bu izni kullanarak arama günlüğünüzü silebilir veya değiştirebilir."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"vücut sensörlerine erişme (nabız takip cihazları gibi)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Uygulamanın, nabzınız gibi fiziksel durumunuzu izleyen sensörlerin gönderdiği verilere erişmesine izin verir."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Nabız, vücut ısısı, kandaki oksijen yüzdesi gibi vücut sensörlerinden gelen verilere erişim."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"arka plandayken vücut sensörlerine erişim (nabız takip cihazları gibi)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Arka plandayken nabız, vücut ısısı, kandaki oksijen yüzdesi gibi vücut sensörlerinden gelen verilere erişim."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Takvim etkinlikleri ve ayrıntılarını okuma"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Bu uygulama, tabletinizde kayıtlı tüm takvim etkinliklerini okuyabilir ve takvim verilerinizi paylaşabilir ya da kaydedebilir."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Bu uygulama, Android TV cihazınızda kayıtlı tüm takvim etkinliklerini okuyabilir ve takvim verilerinizi paylaşabilir ya da kaydedebilir."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Uygulamaya, Rahatsız Etmeyin yapılandırmasını okuma ve yazma izni verir."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"izin kullanımı görüntülemeye başlama"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"İzin sahibinin bir uygulama için izin kullanımı başlatmasına olanak tanır. Normal uygulamalar için hiçbir zaman kullanılmamalıdır."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"uygulama özelliklerini görüntülemeye başlama"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"İzin sahibinin, bir uygulamanın özellik bilgilerini görüntülemeye başlamasına izin verir."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"sensör verilerine daha yüksek örnekleme hızında eriş"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Özel uygulama bildirimi"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g> uygulamasının <xliff:g id="ACCOUNT">%2$s</xliff:g> hesabına sahip yeni bir Kullanıcı eklemesine izin verilsin mi (bu hesaba sahip bir kullanıcı zaten var)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="APP">%1$s</xliff:g> uygulamasının <xliff:g id="ACCOUNT">%2$s</xliff:g> hesabına sahip yeni bir Kullanıcı eklemesine izin verilsin mi?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Denetlenen kullanıcı ekle"</string>
<string name="language_selection_title" msgid="52674936078683285">"Dil ekleyin"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Bölge tercihi"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Dil adını yazın"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 0539beba..b86402a 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -433,7 +433,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Дозволяє додатку змінювати журнал викликів пристрою, зокрема дані про вхідні та вихідні дзвінки. Шкідливі додатки можуть стирати або змінювати журнал викликів."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Дозволяє програмі змінювати журнал викликів вашого телефону, включно з даними про вхідні та вихідні дзвінки. Шкідливі програми можуть використовувати це для стирання або зміни вашого журналу викликів."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"отримувати дані з датчиків на тілі (наприклад, з пульсометра)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Додаток має доступ до даних із датчиків, які відстежують фізичний стан, зокрема пульс."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Доступ до даних із датчиків на тілі, наприклад про пульс, температуру, вміст кисню в крові тощо."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"отримувати дані з датчиків на тілі (наприклад, з пульсометра) у фоновому режимі"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Доступ до даних із датчиків на тілі, наприклад про пульс, температуру, вміст кисню в крові тощо (у фоновому режимі)."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Переглядати події календаря й додаткову інформацію"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Цей додаток може переглядати всі події календаря, збережені на вашому планшеті, а також надсилати та зберігати дані календаря."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Додаток може переглядати всі події календаря, збережені на вашому пристрої Android TV, а також надсилати та зберігати дані календаря."</string>
@@ -737,6 +739,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Додаток зможе переглядати та змінювати конфігурацію режиму \"Не турбувати\"."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"перегляньте дані про використання дозволів"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Власник зможе використовувати дозволи для цього додатка. Цей дозвіл не потрібен для звичайних додатків."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"почати перегляд функцій додатка"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Дозволяє додатку почати перегляд інформації про функції іншого додатка."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"доступ до даних датчиків із високою частотою дикретизації"</string>
@@ -2053,8 +2059,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Користувацьке сповіщення додатка"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Дозволити додатку <xliff:g id="APP">%1$s</xliff:g> створити нового користувача з обліковим записом <xliff:g id="ACCOUNT">%2$s</xliff:g> (користувач із таким обліковим записом уже існує)?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Дозволити додатку <xliff:g id="APP">%1$s</xliff:g> створити нового користувача з обліковим записом <xliff:g id="ACCOUNT">%2$s</xliff:g>?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Додати контрольованого користувача"</string>
<string name="language_selection_title" msgid="52674936078683285">"Додати мову"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Вибір регіону"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Введіть назву мови"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 9d3c357..65fe847 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"آنے والی اور باہر جانے والی کالز کے بارے میں ڈیٹا سمیت، ایپ کو آپ کے Android TV آلہ کے کال لاگ میں ترمیم کرنے کی اجازت دیتا ہے۔ نقصان دہ ایپس آپ کی کال لاگ مٹانے یا اس میں ترمیم کرنے کیلئے اسے استعمال کر سکتی ہیں۔"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ایپ کو آپ کے فون کی کال لاگ، بشمول آنے والی اور باہر جانے والی کالوں کے بارے میں ڈیٹا میں ترمیم کرنے کی اجازت دیتا ہے۔ نقصان دہ ایپس آپ کی کال لاگ مٹانے یا اس میں ترمیم کرنے کیلئے اسے استعمال کرسکتی ہیں۔"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"باڈی سینسرز تک رسائی حاصل کریں (جیسے حرکت قلب شرح مانیٹرز)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"ان سینسرز سے ڈیٹا تک رسائی حاصل کرنے کی اجازت دیتی ہے جو آپ کی حرکت قلب کی شرح جیسی آپ کی فزیکل صورتحال کو مانیٹر کرتے ہیں۔"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"باڈی سینسرز سے ڈیٹا تک رسائی حاصل کریں جیسے حرکت قلب کی شرح، درجہ حرارت، خون میں آکسیجن فیصد وغیرہ۔"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"پس منظر میں رہتے ہوئے باڈی سینسرز تک رسائی حاصل کریں (جیسے حرکت قلب کی شرح کے مانیٹرز)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"پس منظر میں رہتے ہوئے باڈی سینسرز سے ڈیٹا تک رسائی حاصل کریں جیسے حرکت قلب کی شرح، درجہ حرارت، خون میں آکسیجن کا فیصد وغیرہ۔"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"کیلنڈر ایونٹس اور تفاصیل پڑھیں"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"یہ ایپ آپ کے ٹیبلیٹ پر اسٹور کردہ سبھی کیلنڈر ایونٹس کو پڑھ سکتی ہے اور آپ کے کیلنڈر ڈیٹا کا اشتراک یا اسے محفوظ کر سکتی ہے۔"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"یہ ایپ آپ کے Android TV آلہ پر اسٹور کردہ سبھی کیلنڈر ایونٹس کو پڑھ سکتی ہے اور آپ کے کیلنڈر ڈیٹا کا اشتراک یا اسے محفوظ کر سکتی ہے۔"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ایپ کو ڈسٹرب نہ کریں کنفیگریشن لکھنے اور پڑھنے کے قابل کرتا ہے۔"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"اجازت کی استعمال کا ملاحظہ شروع کریں"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"حامل کو ایپ کی اجازت کے استعمال کو شروع کرنے کی اجازت دیتا ہے۔ عام ایپس کے لیے کبھی بھی درکار نہیں ہونا چاہیے۔"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ایپ کی خصوصیات کا ملاحظہ شروع کریں"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"ہولڈر کو ایپ کے لیے خصوصیات کی معلومات دیکھنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"نمونہ کاری کی اعلی شرح پر سینسر کے ڈیٹا تک رسائی حاصل کریں"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"حسب ضرورت ایپ کی اطلاع"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="APP">%1$s</xliff:g> کو <xliff:g id="ACCOUNT">%2$s</xliff:g> کے ساتھ ایک نیا صارف بنانے کی اجازت دیں (اس اکاؤنٹ کے ساتھ ایک صارف پہلے سے موجود ہے) ؟"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="ACCOUNT">%2$s</xliff:g> کے ساتھ نئے صارف کو تخلیق کرنے کے لیے <xliff:g id="APP">%1$s</xliff:g> کو اجازت دیں ؟"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"زیر نگرانی صارف شامل کریں"</string>
<string name="language_selection_title" msgid="52674936078683285">"ایک زبان شامل کریں"</string>
<string name="country_selection_title" msgid="5221495687299014379">"علاقہ کی ترجیح"</string>
<string name="search_language_hint" msgid="7004225294308793583">"زبان کا نام ٹائپ کریں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index ab03056..42a88d7 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Ilovaga Android TV qurilmangizdagi chaqiruvlar jurnali, kirish va chiqish chaqiruvlari haqidagi axborotni oʻzgartirish huquqini beradi. Zararli ilovalar undan chaqiruvlar jurnalini oʻzgartirish yoki oʻchirish uchun foydalanishi mumkin."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Ilovaga telefoningizdagi qo‘ng‘iroq jurnallari, kiruvchi va chiquvchi qo‘ng‘rioqlar haqidagi ma’lumotlarni o‘zgartirishga ruxsat beradi. Zararli ilovalar bundan qo‘ng‘iroqlar jurnalini o‘zgartirish yoki o‘chirish uchun foydalanishi mumkin."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"tana sezgichlari (m-n, yurak urishi sensori) ma’lumotlaridan foydalanishga ruxsat"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Ilovaga sezgichlardan olingan jismoniy holatingiz haqidagi ma’lumotlarni, masalan, yurak urishini kuzatish uchun ruxsat beradi."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Yurak urishi, harorat, qondagi kislorod foizi kabi tana sezgilaridan olingan maʼlumotlarga kirish."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"orqa fonda tana sezgilari (m-n, yurak urishi sensori) maʼlumotlariga kirish"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Yurak urishi, harorat, qondagi kislorod foizi kabi tana sezgilaridan olingan maʼlumotlarga orqa fonda kirish."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Taqvim tadbirlari va tafsilotlarini o‘qish"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Bu ilova planshetdagi barcha taqvim tadbirlarini o‘qiy olishi hamda taqvim ma’lumotlarini ulashishi yoki saqlashi mumkin."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Bu ilova Android TV qurilmangizda barcha taqvim tadbirlarini oʻqiy olishi hamda taqvim maʼlumotlarini ulashishi yoki saqlashi mumkin."</string>
@@ -731,6 +733,8 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"“Bezovta qilinmasin” rejimi sozlamalarini ko‘rish va o‘zgartirish."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"foydalaniladigan ruxsatlar axborotini ochish"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ilova foydalanadigan ruxsatlar axborotini ishga tushirishga ruxsat beradi. Oddiy ilovalar uchun talab qilinmaydi."</string>
+ <string name="permlab_startReviewPermissionDecisions" msgid="8690578688476599284">"ilova ruxsatlarini tekshirishni boshlash"</string>
+ <string name="permdesc_startReviewPermissionDecisions" msgid="2775556853503004236">"Qurilma egasiga ilova ruxsatlarini tekshirishni boshlash imkonini beradi. Oddiy ilovalar uchun talab qilinmaydi."</string>
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"ilova funksiyalari axborotini koʻrish"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Qurilma egasiga ilova funksiyalari axborotini koʻrishga ruxsat beradi."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"yuqori diskretlash chastotali sensor axborotiga ruxsat"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 9225c16..bbfadf6 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Cho phép ứng dụng sửa đổi nhật ký cuộc gọi trên thiết bị Android TV, bao gồm cả dữ liệu về cuộc gọi đến và cuộc gọi đi. Các ứng dụng độc hại có thể sử dụng quyền này để xóa hoặc sửa đổi nhật ký cuộc gọi của bạn."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Cho phép ứng dụng sửa đổi nhật ký cuộc gọi trên điện thoại của bạn, bao gồm dữ liệu về các cuộc gọi đến và gọi đi. Các ứng dụng độc hại có thể sử dụng quyền này để xóa hoặc sửa đổi nhật ký cuộc gọi của bạn."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"truy cập cảm biến cơ thể (như máy đo nhịp tim)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Cho phép ứng dụng truy cập dữ liệu từ bộ cảm biến giám sát tình trạng sức khỏe của bạn, ví dụ như nhịp tim."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Quyền truy cập vào dữ liệu từ các cảm biến cơ thể, chẳng hạn như dữ liệu về nhịp tim, nhiệt độ, tỷ lệ phần trăm oxy trong máu và các dữ liệu khác."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"truy cập vào các cảm biến cơ thể (như máy đo nhịp tim) khi ở trong nền"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Quyền truy cập vào dữ liệu từ các cảm biến cơ thể, chẳng hạn như dữ liệu về nhịp tim, nhiệt độ, tỷ lệ phần trăm oxy trong máu và các dữ liệu khác khi ở trong nền."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Đọc chi tiết và sự kiện lịch"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Ứng dụng này có thể đọc tất cả các sự kiện lịch được lưu trữ trên máy tính bảng của bạn và chia sẻ hoặc lưu dữ liệu lịch của bạn."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Ứng dụng này có thể đọc tất cả sự kiện trên lịch mà bạn lưu vào thiết bị Android TV cũng như chia sẻ hoặc lưu dữ liệu lịch của bạn."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Cho phép ứng dụng đọc và ghi cấu hình Không làm phiền."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"cấp quyền xem"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Cho phép chủ sở hữu cấp quyền cho một ứng dụng. Các ứng dụng thông thường sẽ không bao giờ cần quyền này."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"bắt đầu xem các tính năng của ứng dụng"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Cho phép chủ sở hữu bắt đầu xem thông tin về tính năng của một ứng dụng."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"truy cập vào dữ liệu cảm biến ở tốc độ lấy mẫu cao"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 6793baa..b7e1972 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"允许应用修改您的 Android TV 设备的通话记录,包括关于来电和去电的数据。恶意应用可能会借此清空或修改您的通话记录。"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"允许该应用修改手机的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"访问身体传感器(如心率监测器)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"允许该应用存取监测您身体状况的传感器所收集的数据,例如您的心率。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"访问身体传感器获得的数据,例如心率、体温、血氧百分比等。"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"在后台时访问身体传感器(如心率监测器)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"在后台时访问身体传感器获得的数据,例如心率、体温、血氧百分比等。"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"读取日历活动和详情"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"此应用可读取您平板电脑上存储的所有日历活动,并分享或保存您的日历数据。"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"此应用可读取您的 Android TV 设备上存储的所有日历活动,以及分享或保存您的日历数据。"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允许此应用读取和写入“勿扰”模式配置。"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"授权使用“查看权限”"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允许该应用开始查看应用的权限使用情况(普通应用绝不需要此权限)。"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"开始查看应用功能"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"允许具有该权限的应用开始查看某个应用的功能信息。"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"以高采样率访问传感器数据"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"自定义应用通知"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"允许<xliff:g id="APP">%1$s</xliff:g>使用 <xliff:g id="ACCOUNT">%2$s</xliff:g>(目前已有用户使用此帐号)创建新用户吗?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"允许<xliff:g id="APP">%1$s</xliff:g>使用 <xliff:g id="ACCOUNT">%2$s</xliff:g> 创建新用户吗?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"添加受监管用户"</string>
<string name="language_selection_title" msgid="52674936078683285">"添加语言"</string>
<string name="country_selection_title" msgid="5221495687299014379">"区域偏好设置"</string>
<string name="search_language_hint" msgid="7004225294308793583">"输入语言名称"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index d63bf16..86de22f 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"允許應用程式修改 Android TV 裝置的通話記錄,包括來電和撥出電話的相關資料。惡意應用程式可能會藉此清除或修改您的通話記錄。"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"允許應用程式修改手機的通話記錄,包括來電和已撥電話相關資料。惡意應用程式可能會藉此刪除或修改您的通話記錄。"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"存取人體感應器 (例如心跳監測器)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"允許應用程式存取感應器所收集的資料 (這類感應器可監測您的體能狀態,例如您的心率)。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"存取人體感應器的資料,例如心率、體溫、血氧百分比等。"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"在背景中存取人體感應器 (例如心率感應器)"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"在背景中存取人體感應器的資料,例如心率、體溫、血氧百分比等。"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"讀取日曆活動和詳情"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"此應用程式可以讀取所有儲存在您的平板電腦的日曆活動,並分享或儲存您的日曆資料。"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"此應用程式可以讀取所有儲存在 Android TV 裝置上的日曆活動,並分享或儲存您的日曆資料。"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允許應用程式讀取和寫入「請勿騷擾」設定。"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"開始查看權限使用情況"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允許應用程式開始查看應用程式的權限使用情況 (一般應用程式並不需要)。"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"開始查看應用程式功能"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"允許擁有者開始查看應用程式的功能資料。"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"以高取樣率存取感應器資料"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 8890f66..a4e6fbb 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"允許應用程式修改 Android TV 裝置的通話記錄,包括來電和撥出電話相關資料。惡意應用程式可能會藉此清除或修改你的通話記錄。"</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"允許應用程式修改手機的通話記錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改你的通話記錄。"</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"存取人體感應器 (例如心跳速率監測器)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"允許應用程式存取感測器所收集的資料 (這類感測器可監測你的體能狀態,例如你的心跳速率)。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"存取人體感應器的資料,例如心跳速率、體溫、血氧比例等等。"</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"在背景存取人體感應器 (例如心跳速率監測器) 的資料"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"在背景存取人體感應器的資料,例如心跳速率、體溫、血氧比例等等。"</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"讀取日曆活動和詳細資訊"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"這個應用程式可讀取所有儲存在平板電腦上的日曆活動資訊,以及共用或儲存日曆資料。"</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"這個應用程式可讀取所有儲存在 Android TV 裝置上的日曆活動,以及共用或儲存日曆資料。"</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"允許應用程式讀取及寫入「零打擾」設定。"</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"啟動檢視權限用途"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"允許應用程式開始使用其他應用程式 (一般應用程式並不需要)。"</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"開始查看應用程式功能"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"允許具有這項權限的應用程式開始查看其他應用程式的功能資訊。"</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"以高取樣率存取感應器資料"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"自訂應用程式通知"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"要允許「<xliff:g id="APP">%1$s</xliff:g>」替 <xliff:g id="ACCOUNT">%2$s</xliff:g> (這個帳戶目前已有使用者) 建立新使用者嗎?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"要允許「<xliff:g id="APP">%1$s</xliff:g>」替 <xliff:g id="ACCOUNT">%2$s</xliff:g> 建立新使用者嗎?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"新增受監管的使用者"</string>
<string name="language_selection_title" msgid="52674936078683285">"新增語言"</string>
<string name="country_selection_title" msgid="5221495687299014379">"地區偏好設定"</string>
<string name="search_language_hint" msgid="7004225294308793583">"請輸入語言名稱"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index bfc0f1b..4e8cfd4 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -427,7 +427,9 @@
<string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"Ivumela uhlelo lokusebenza ukuthi liguqule ilogi yekholi yedivayisi yakho ye-Android TV, okufaka idatha emayelana namakholi angenayo naphumayo. Izinhlelo zokusebenza ezinobungozi zingasebenzisa lokhu ukususa noma ukuguqula ilogi yakho yekholi."</string>
<string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"Ivumela uhlelo lokusebenza ukushintsha irekhodi lamakholi efoni yakho, kufaka phakathi idatha emayelana namakholi angenayo naphumayo. Izinhlelo zikusebenza ezingalungile zingasebenzisa lokhu ukusula noma ukushintsha irekhodi lwamakholi wakho."</string>
<string name="permlab_bodySensors" msgid="3411035315357380862">"finyelela kuzinzwa zomzimba (ezifana neziqaphi zokulinganisela inhliziyo)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"Ivumela uhlelo lokusebenza ukuthi lufinyelele kudatha kusukela kuzinzwa eziqapha isimo sakho somzimba, esifana nesilinganiso senhliziyo yakho."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="3208940894182188063">"Ukufinyelela kudatha kusuka kuzinzwa zomzimba ezifana nokushaya kwenhliziyo, izinga lokushisa, amaphesenti womoyampilo wegazi, njll."</string>
+ <string name="permlab_bodySensors_background" msgid="4352831883331744370">"finyelela izinzwa zomzimba (njengeziqapha ukushaya kwenhliziyo) kuyilapho ingemuva"</string>
+ <string name="permdesc_bodySensors_background" product="default" msgid="8512392249166660872">"Ukufinyelela kudatha evela kuzinzwa zomzimba ezinjengokushaya kwenhliziyo, izinga lokushisa, amaphesenti omoyampilo wegazi, njll. kuyilapho ingemuva."</string>
<string name="permlab_readCalendar" msgid="6408654259475396200">"Funda imicimbi yekhalenda nemininingwane"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="515452384059803326">"Lolu hlelo lokusebenza lungafunda yonke imicimbi yekhalenda elondolozwe kuthebhulethi yakho nokwabelana noma ukulondoloza idatha yakho yekhalenda."</string>
<string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Lolu hlelo lokusebenza lungafunda yonke imicimbi yekhalenda elondolozwe kudivayisi yakho ye-Android TV nokwabelana noma ukulondoloza idatha yakho yekhalenda."</string>
@@ -731,6 +733,10 @@
<string name="permdesc_access_notification_policy" msgid="8538374112403845013">"Ivumela izinhlelo zokusebenza ukufunda nokubhala ukulungiswa kokuthi Ungaphazamisi."</string>
<string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"qala ukusetshenziswa kokubuka imvume"</string>
<string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Ivumela umphathi ukuthi aqale ukusetshenziswa kwemvume kohlelo lokusebenza. Akumele idingelwe izinhlelo zokusebenza ezijwayelekile."</string>
+ <!-- no translation found for permlab_startReviewPermissionDecisions (8690578688476599284) -->
+ <skip />
+ <!-- no translation found for permdesc_startReviewPermissionDecisions (2775556853503004236) -->
+ <skip />
<string name="permlab_startViewAppFeatures" msgid="7955084203185903001">"qala ukubuka izakhi ze-app"</string>
<string name="permdesc_startViewAppFeatures" msgid="7207240860165206107">"Vumela isibambi ukuthi siqale ukubuka ulwazi lwezakhi lwe-app."</string>
<string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"finyelela idatha yenzwa ngenani eliphezulu lokwenza isampuli"</string>
@@ -1390,7 +1396,7 @@
<string name="usb_midi_notification_title" msgid="7404506788950595557">"I-MIDI nge-USB ivuliwe"</string>
<string name="usb_accessory_notification_title" msgid="1385394660861956980">"Insiza ye-USB ixhunyiwe"</string>
<string name="usb_notification_message" msgid="4715163067192110676">"Thepha ngezinketho eziningi."</string>
- <string name="usb_power_notification_message" msgid="7284765627437897702">"Ishaja idivayisi exhunyiwe. Thepha ukuze uthole ezinye izinketho."</string>
+ <string name="usb_power_notification_message" msgid="7284765627437897702">"Ishaja idivayisi exhunyiwe. Thepha ukuze uthole okunye okungakhethwa."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Kutholwe isisetshenziswa se-analog yomsindo"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Idivayisi enamathiselwe kwi-imeyili ayihambisani nale foni. Thepha ukuze ufunde kabanzi."</string>
<string name="adb_active_notification_title" msgid="408390247354560331">"Ukulungisa iphutha le-USB kuxhunyiwe"</string>
@@ -1989,8 +1995,7 @@
<string name="notification_history_title_placeholder" msgid="7748630986182249599">"Isaziso sohlelo lokusebenza olungokwezifiso"</string>
<string name="user_creation_account_exists" msgid="2239146360099708035">"Vumela i-<xliff:g id="APP">%1$s</xliff:g> ukuthi idale umsebenzisi omusha nge-<xliff:g id="ACCOUNT">%2$s</xliff:g> (Umsebenzisi onale akhawunti usevele ukhona) ?"</string>
<string name="user_creation_adding" msgid="7305185499667958364">"Vumela i-<xliff:g id="APP">%1$s</xliff:g> ukuthi idale umsebenzisi omusha nge-<xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string>
- <!-- no translation found for supervised_user_creation_label (6884904353827427515) -->
- <skip />
+ <string name="supervised_user_creation_label" msgid="6884904353827427515">"Engeza umsebenzisi ogadiwe"</string>
<string name="language_selection_title" msgid="52674936078683285">"Engeza ulimi"</string>
<string name="country_selection_title" msgid="5221495687299014379">"Okuncamelayo kwesifunda"</string>
<string name="search_language_hint" msgid="7004225294308793583">"Thayipha igama lolimi"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 1705371..86c83c5 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -8442,6 +8442,9 @@
<attr name="settingsActivity" />
<!-- A preview, in a drawable resource id, of what the Dream will look like. -->
<attr name="previewImage" format="reference" />
+ <!-- Whether to show clock and other complications such as weather in the overlay. Default
+ to true. Note that the overlay on dreams is currently only supported on tablets. -->
+ <attr name="showClockAndComplications" format="boolean" />
</declare-styleable>
<!-- Use <code>trust-agent</code> as the root tag of the XML resource that
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 7d8bcea..2836c98 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1179,10 +1179,18 @@
<string-array translatable="false" name="config_ringtoneEffectUris">
</string-array>
+ <!-- The default intensity level for alarm vibrations. See
+ Settings.System.ALARM_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultAlarmVibrationIntensity">2</integer>
<!-- The default intensity level for haptic feedback. See
Settings.System.HAPTIC_FEEDBACK_INTENSITY more details on the constant values and
meanings. -->
<integer name="config_defaultHapticFeedbackIntensity">2</integer>
+ <!-- The default intensity level for media vibrations. See
+ Settings.System.MEDIA_VIBRATION_INTENSITY more details on the constant values and
+ meanings. -->
+ <integer name="config_defaultMediaVibrationIntensity">2</integer>
<!-- The default intensity level for notification vibrations. See
Settings.System.NOTIFICATION_VIBRATION_INTENSITY more details on the constant values and
meanings. -->
@@ -2125,6 +2133,8 @@
<string name="config_deviceManager" translatable="false"></string>
<!-- The name of the package that will hold the app protection service role. -->
<string name="config_systemAppProtectionService" translatable="false"></string>
+ <!-- The name of the package that will hold the system calendar sync manager role. -->
+ <string name="config_systemAutomotiveCalendarSyncManager" translatable="false"></string>
<!-- The name of the package that will be allowed to change its components' label/icon. -->
<string name="config_overrideComponentUiPackage" translatable="false">com.android.stk</string>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 9449f60..5fa7409 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3250,6 +3250,7 @@
<public name="supportedTypes" />
<public name="resetEnabledSettingsOnAppDataCleared" />
<public name="supportsStylusHandwriting" />
+ <public name="showClockAndComplications" />
<!-- @hide @SystemApi -->
<public name="gameSessionService" />
</staging-public-group>
@@ -3273,6 +3274,8 @@
<public name="config_deviceManager" />
<!-- @hide @SystemApi -->
<public name="config_systemAppProtectionService" />
+ <!-- @hide @SystemApi @TestApi -->
+ <public name="config_systemAutomotiveCalendarSyncManager" />
</staging-public-group>
<staging-public-group type="dimen" first-id="0x01db0000">
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ba4aa81..a4b5d3c 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3867,7 +3867,9 @@
<java-symbol type="drawable" name="ic_arrow_forward" />
<java-symbol type="drawable" name="ic_permission" />
+ <java-symbol type="integer" name="config_defaultAlarmVibrationIntensity" />
<java-symbol type="integer" name="config_defaultHapticFeedbackIntensity" />
+ <java-symbol type="integer" name="config_defaultMediaVibrationIntensity" />
<java-symbol type="integer" name="config_defaultNotificationVibrationIntensity" />
<java-symbol type="integer" name="config_defaultRingVibrationIntensity" />
diff --git a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
index 47b14bb..4f8b855 100644
--- a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
+++ b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
@@ -16,6 +16,7 @@
package android.content.res;
+import android.platform.test.annotations.Presubmit;
import android.test.ActivityInstrumentationTestCase2;
import android.util.TypedValue;
@@ -25,6 +26,7 @@
import java.lang.reflect.InvocationTargetException;
+@Presubmit
public class ConfigurationBoundResourceCacheTest
extends ActivityInstrumentationTestCase2<ResourceCacheActivity> {
diff --git a/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java b/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
index 57f01e9..9aef2ca 100644
--- a/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
+++ b/core/tests/coretests/src/android/content/res/FontResourcesParserTest.java
@@ -27,6 +27,7 @@
import static org.junit.Assert.assertNotNull;
import android.app.Instrumentation;
+import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -45,6 +46,7 @@
/**
* Tests for {@link FontResourcesParser}.
*/
+@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
public class FontResourcesParserTest {
diff --git a/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java b/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java
index c4df88b..f7f9569 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesDrawableTest.java
@@ -24,6 +24,7 @@
import android.graphics.drawable.ColorStateListDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
+import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -34,6 +35,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ResourcesDrawableTest {
diff --git a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
index aa1a534..25c3db5 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java
@@ -18,6 +18,7 @@
import android.os.FileUtils;
import android.os.LocaleList;
+import android.platform.test.annotations.Presubmit;
import android.test.AndroidTestCase;
import android.util.DisplayMetrics;
@@ -30,6 +31,7 @@
import java.util.Arrays;
import java.util.Locale;
+@Presubmit
public class ResourcesLocaleTest extends AndroidTestCase {
private String extractApkAndGetPath(int id) throws Exception {
diff --git a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
index e7ee9dc..34a8bde 100644
--- a/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
+++ b/core/tests/coretests/src/android/content/res/ResourcesManagerTest.java
@@ -20,6 +20,7 @@
import android.app.ResourcesManager;
import android.os.Binder;
import android.os.LocaleList;
+import android.platform.test.annotations.Postsubmit;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Display;
@@ -32,6 +33,7 @@
import java.util.HashMap;
import java.util.Map;
+@Postsubmit
public class ResourcesManagerTest extends TestCase {
private static final int SECONDARY_DISPLAY_ID = 1;
private static final String APP_ONE_RES_DIR = "app_one.apk";
diff --git a/core/tests/coretests/src/android/content/res/TEST_MAPPING b/core/tests/coretests/src/android/content/res/TEST_MAPPING
new file mode 100644
index 0000000..4ea6e40
--- /dev/null
+++ b/core/tests/coretests/src/android/content/res/TEST_MAPPING
@@ -0,0 +1,43 @@
+{
+ "presubmit": [
+ {
+ "name": "FrameworksCoreTests",
+ "options": [
+ {
+ "include-filter": "android.content.res."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "android.platform.test.annotations.Postsubmit"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ }
+ ]
+ }
+ ],
+ "postsubmit": [
+ {
+ "name": "FrameworksCoreTests",
+ "options": [
+ {
+ "include-filter": "android.content.res."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Postsubmit"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ }
+ ]
+ }
+ ]
+}
diff --git a/core/tests/coretests/src/android/os/OWNERS b/core/tests/coretests/src/android/os/OWNERS
index a42285e..f2d6ff8 100644
--- a/core/tests/coretests/src/android/os/OWNERS
+++ b/core/tests/coretests/src/android/os/OWNERS
@@ -2,11 +2,7 @@
per-file BrightnessLimit.java = michaelwr@google.com, santoscordon@google.com
# Haptics
-per-file CombinedVibrationEffectTest.java = file:/services/core/java/com/android/server/vibrator/OWNERS
-per-file ExternalVibrationTest.java = file:/services/core/java/com/android/server/vibrator/OWNERS
-per-file VibrationEffectTest.java = file:/services/core/java/com/android/server/vibrator/OWNERS
-per-file VibratorInfoTest.java = file:/services/core/java/com/android/server/vibrator/OWNERS
-per-file VibratorTest.java = file:/services/core/java/com/android/server/vibrator/OWNERS
+per-file *Vibrat*.java = file:/services/core/java/com/android/server/vibrator/OWNERS
# Power
per-file PowerManager*.java = michaelwr@google.com, santoscordon@google.com
\ No newline at end of file
diff --git a/core/tests/coretests/src/android/os/VibrationEffectTest.java b/core/tests/coretests/src/android/os/VibrationEffectTest.java
index 781564b..10cec82 100644
--- a/core/tests/coretests/src/android/os/VibrationEffectTest.java
+++ b/core/tests/coretests/src/android/os/VibrationEffectTest.java
@@ -125,8 +125,8 @@
VibrationEffect.startWaveform()
.addStep(/* amplitude= */ 1, /* duration= */ 10)
.addRamp(/* amplitude= */ 0, /* duration= */ 20)
- .addStep(/* amplitude= */ 1, /* frequency*/ 1, /* duration= */ 100)
- .addRamp(/* amplitude= */ 0.5f, /* frequency*/ -1, /* duration= */ 50)
+ .addStep(/* amplitude= */ 1, /* frequencyHz= */ 1, /* duration= */ 100)
+ .addRamp(/* amplitude= */ 0.5f, /* frequencyHz= */ 100, /* duration= */ 50)
.build()
.validate();
@@ -150,10 +150,22 @@
.addStep(/* amplitude= */ -2, 10).build().validate());
assertThrows(IllegalArgumentException.class,
() -> VibrationEffect.startWaveform()
+ .addStep(1, /* frequencyHz= */ -1f, 10).build().validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> VibrationEffect.startWaveform()
.addStep(1, /* duration= */ -1).build().validate());
assertThrows(IllegalArgumentException.class,
() -> VibrationEffect.startWaveform()
- .addStep(1, 0, /* duration= */ -1).build().validate());
+ .addStep(1, 100f, /* duration= */ -1).build().validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> VibrationEffect.startWaveform()
+ .addRamp(/* amplitude= */ -3, 10).build().validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> VibrationEffect.startWaveform()
+ .addRamp(1, /* frequencyHz= */ 0, 10).build().validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> VibrationEffect.startWaveform()
+ .addRamp(1, 10f, /* duration= */ -3).build().validate());
}
@Test
diff --git a/core/tests/coretests/src/android/os/VibratorInfoTest.java b/core/tests/coretests/src/android/os/VibratorInfoTest.java
index 6e07fa2..d0e03a2 100644
--- a/core/tests/coretests/src/android/os/VibratorInfoTest.java
+++ b/core/tests/coretests/src/android/os/VibratorInfoTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.hardware.vibrator.Braking;
@@ -43,19 +44,17 @@
/* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f, /* 200Hz= */ 0.8f};
private static final VibratorInfo.FrequencyMapping EMPTY_FREQUENCY_MAPPING =
- new VibratorInfo.FrequencyMapping(Float.NaN, Float.NaN, Float.NaN, Float.NaN, null);
+ new VibratorInfo.FrequencyMapping(Float.NaN, Float.NaN, Float.NaN, null);
private static final VibratorInfo.FrequencyMapping TEST_FREQUENCY_MAPPING =
- new VibratorInfo.FrequencyMapping(TEST_MIN_FREQUENCY,
- TEST_RESONANT_FREQUENCY, TEST_FREQUENCY_RESOLUTION,
- /* suggestedSafeRangeHz= */ 50, TEST_AMPLITUDE_MAP);
+ new VibratorInfo.FrequencyMapping(TEST_RESONANT_FREQUENCY, TEST_MIN_FREQUENCY,
+ TEST_FREQUENCY_RESOLUTION, TEST_AMPLITUDE_MAP);
@Test
public void testHasAmplitudeControl() {
VibratorInfo noCapabilities = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build();
assertFalse(noCapabilities.hasAmplitudeControl());
VibratorInfo composeAndAmplitudeControl = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
- .setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS
- | IVibrator.CAP_AMPLITUDE_CONTROL)
+ .setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS | IVibrator.CAP_AMPLITUDE_CONTROL)
.build();
assertTrue(composeAndAmplitudeControl.hasAmplitudeControl());
}
@@ -143,138 +142,95 @@
}
@Test
- public void testGetFrequencyRange_invalidFrequencyMappingReturnsEmptyRange() {
+ public void testGetFrequencyRangeHz_invalidFrequencyMappingReturnsNull() {
// Invalid, contains NaN values or empty array.
- assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(
- TEST_VIBRATOR_ID).build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
+ assertNull(new VibratorInfo.Builder(TEST_VIBRATOR_ID).build().getFrequencyRangeHz());
+ assertNull(new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- Float.NaN, 150, 25, 50, TEST_AMPLITUDE_MAP))
- .build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
+ Float.NaN, 50, 25, TEST_AMPLITUDE_MAP))
+ .build().getFrequencyRangeHz());
+ assertNull(new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- 50, Float.NaN, 25, 50, TEST_AMPLITUDE_MAP))
- .build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
+ 150, Float.NaN, 25, TEST_AMPLITUDE_MAP))
+ .build().getFrequencyRangeHz());
+ assertNull(new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- 50, 150, Float.NaN, 50, TEST_AMPLITUDE_MAP))
- .build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
- .setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- 50, 150, 25, Float.NaN, TEST_AMPLITUDE_MAP))
- .build().getFrequencyRange());
- assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
- .setFrequencyMapping(new VibratorInfo.FrequencyMapping(50, 150, 25, 50, null))
- .build().getFrequencyRange());
+ 150, 50, Float.NaN, TEST_AMPLITUDE_MAP))
+ .build().getFrequencyRangeHz());
+ assertNull(new VibratorInfo.Builder(TEST_VIBRATOR_ID)
+ .setFrequencyMapping(new VibratorInfo.FrequencyMapping(150, 50, 25, null))
+ .build().getFrequencyRangeHz());
// Invalid, minFrequency > resonantFrequency
- assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
+ assertNull(new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- /* minFrequencyHz= */ 250, /* resonantFrequency= */ 150, 25, 50, null))
- .build().getFrequencyRange());
+ /* resonantFrequencyHz= */ 150, /* minFrequencyHz= */ 250, 25, null))
+ .build().getFrequencyRangeHz());
// Invalid, maxFrequency < resonantFrequency by changing resolution.
- assertEquals(Range.create(0f, 0f), new VibratorInfo.Builder(TEST_VIBRATOR_ID)
+ assertNull(new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- 50, 150, /* frequencyResolutionHz= */10, 50, null))
- .build().getFrequencyRange());
+ 150, 50, /* frequencyResolutionHz= */ 10, null))
+ .build().getFrequencyRangeHz());
}
@Test
- public void testGetFrequencyRange_safeRangeLimitedByMaxFrequency() {
+ public void testGetFrequencyRangeHz_resultRangeDerivedFromHalMapping() {
VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- /* minFrequencyHz= */ 50, /* resonantFrequencyHz= */ 150,
- /* frequencyResolutionHz= */ 25, /* suggestedSafeRangeHz= */ 200,
- TEST_AMPLITUDE_MAP))
+ /* resonantFrequencyHz= */ 150,
+ /* minFrequencyHz= */ 50,
+ /* frequencyResolutionHz= */ 25,
+ new float[]{
+ /* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f,
+ /* 200Hz= */ 0.8f}))
.build();
- // Mapping should range from 50Hz = -2 to 200Hz = 1
- // Safe range [-1, 1] = [100Hz, 200Hz] defined by max - resonant = 50Hz
- assertEquals(Range.create(-2f, 1f), info.getFrequencyRange());
+ assertEquals(Range.create(50f, 200f), info.getFrequencyRangeHz());
}
@Test
- public void testGetFrequencyRange_safeRangeLimitedByMinFrequency() {
- VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
- .setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- /* minFrequencyHz= */ 50, /* resonantFrequencyHz= */ 150,
- /* frequencyResolutionHz= */ 50, /* suggestedSafeRangeHz= */ 200,
- TEST_AMPLITUDE_MAP))
- .build();
-
- // Mapping should range from 50Hz = -1 to 350Hz = 2
- // Safe range [-1, 1] = [50Hz, 250Hz] defined by resonant - min = 100Hz
- assertEquals(Range.create(-1f, 2f), info.getFrequencyRange());
- }
-
- @Test
- public void testGetFrequencyRange_validMappingReturnsFullRelativeRange() {
- VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
- .setFrequencyMapping(new VibratorInfo.FrequencyMapping(
- /* minFrequencyHz= */ 50, /* resonantFrequencyHz= */ 150,
- /* frequencyResolutionHz= */ 50, /* suggestedSafeRangeHz= */ 100,
- TEST_AMPLITUDE_MAP))
- .build();
-
- // Mapping should range from 50Hz = -2 to 350Hz = 4
- // Safe range [-1, 1] = [100Hz, 200Hz] defined by suggested safe range 100Hz
- assertEquals(Range.create(-2f, 4f), info.getFrequencyRange());
- }
-
- @Test
- public void testAbsoluteFrequency_emptyMappingReturnsNaN() {
+ public void testGetMaxAmplitude_emptyMappingReturnsAlwaysZero() {
VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build();
- assertTrue(Float.isNaN(info.getAbsoluteFrequency(-1)));
- assertTrue(Float.isNaN(info.getAbsoluteFrequency(0)));
- assertTrue(Float.isNaN(info.getAbsoluteFrequency(1)));
- }
+ assertEquals(0f, info.getMaxAmplitude(Float.NaN), TEST_TOLERANCE);
+ assertEquals(0f, info.getMaxAmplitude(100f), TEST_TOLERANCE);
+ assertEquals(0f, info.getMaxAmplitude(200f), TEST_TOLERANCE);
- @Test
- public void testAbsoluteFrequency_validRangeReturnsOriginalValue() {
- VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID).setFrequencyMapping(
- TEST_FREQUENCY_MAPPING).build();
- assertEquals(TEST_RESONANT_FREQUENCY, info.getAbsoluteFrequency(0), TEST_TOLERANCE);
+ info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
+ .setFrequencyMapping(new VibratorInfo.FrequencyMapping(
+ /* resonantFrequencyHz= */ 150,
+ /* minFrequencyHz= */ Float.NaN,
+ /* frequencyResolutionHz= */ Float.NaN,
+ null))
+ .build();
- // Safe range [-1, 1] = [125Hz, 175Hz] defined by suggested safe range 100Hz
- assertEquals(125, info.getAbsoluteFrequency(-1), TEST_TOLERANCE);
- assertEquals(175, info.getAbsoluteFrequency(1), TEST_TOLERANCE);
- assertEquals(155, info.getAbsoluteFrequency(0.2f), TEST_TOLERANCE);
- assertEquals(140, info.getAbsoluteFrequency(-0.4f), TEST_TOLERANCE);
-
- // Full range [-4, 2] = [50Hz, 200Hz] defined by min frequency and amplitude mapping size
- assertEquals(50, info.getAbsoluteFrequency(info.getFrequencyRange().getLower()),
- TEST_TOLERANCE);
- assertEquals(200, info.getAbsoluteFrequency(info.getFrequencyRange().getUpper()),
- TEST_TOLERANCE);
- }
-
- @Test
- public void testGetMaxAmplitude_emptyMappingReturnsOnlyResonantFrequency() {
- VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build();
- assertEquals(1f, info.getMaxAmplitude(0), TEST_TOLERANCE);
- assertEquals(0f, info.getMaxAmplitude(0.1f), TEST_TOLERANCE);
- assertEquals(0f, info.getMaxAmplitude(-1), TEST_TOLERANCE);
+ assertEquals(0f, info.getMaxAmplitude(Float.NaN), TEST_TOLERANCE);
+ assertEquals(0f, info.getMaxAmplitude(100f), TEST_TOLERANCE);
+ assertEquals(0f, info.getMaxAmplitude(150f), TEST_TOLERANCE);
}
@Test
public void testGetMaxAmplitude_validMappingReturnsMappedValues() {
VibratorInfo info = new VibratorInfo.Builder(TEST_VIBRATOR_ID)
- .setFrequencyMapping(new VibratorInfo.FrequencyMapping(/* minFrequencyHz= */ 50,
- /* resonantFrequencyHz= */ 150, /* frequencyResolutionHz= */ 25,
- /* suggestedSafeRangeHz= */ 50, TEST_AMPLITUDE_MAP))
+ .setFrequencyMapping(new VibratorInfo.FrequencyMapping(
+ /* resonantFrequencyHz= */ 150,
+ /* minFrequencyHz= */ 50,
+ /* frequencyResolutionHz= */ 25,
+ new float[]{
+ /* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f,
+ /* 200Hz= */ 0.8f}))
.build();
- assertEquals(1f, info.getMaxAmplitude(0), TEST_TOLERANCE); // 150Hz
- assertEquals(0.9f, info.getMaxAmplitude(1), TEST_TOLERANCE); // 175Hz
- assertEquals(0.8f, info.getMaxAmplitude(-1), TEST_TOLERANCE); // 125Hz
- assertEquals(0.8f, info.getMaxAmplitude(info.getFrequencyRange().getUpper()),
+ assertEquals(1f, info.getMaxAmplitude(150f), TEST_TOLERANCE);
+ assertEquals(0.9f, info.getMaxAmplitude(175f), TEST_TOLERANCE);
+ assertEquals(0.8f, info.getMaxAmplitude(125f), TEST_TOLERANCE);
+ assertEquals(0.8f, info.getMaxAmplitude(info.getFrequencyRangeHz().getUpper()),
TEST_TOLERANCE); // 200Hz
- assertEquals(0.1f, info.getMaxAmplitude(info.getFrequencyRange().getLower()),
+ assertEquals(0.1f, info.getMaxAmplitude(info.getFrequencyRangeHz().getLower()),
TEST_TOLERANCE); // 50Hz
- // Rounds 145Hz to the max amplitude for 125Hz, which is lower.
- assertEquals(0.8f, info.getMaxAmplitude(-0.1f), TEST_TOLERANCE); // 145Hz
- // Rounds 185Hz to the max amplitude for 200Hz, which is lower.
- assertEquals(0.8f, info.getMaxAmplitude(1.2f), TEST_TOLERANCE); // 185Hz
+ // 145Hz maps to the max amplitude for 125Hz, which is lower.
+ assertEquals(0.8f, info.getMaxAmplitude(145f), TEST_TOLERANCE); // 145Hz
+ // 185Hz maps to the max amplitude for 200Hz, which is lower.
+ assertEquals(0.8f, info.getMaxAmplitude(185f), TEST_TOLERANCE); // 185Hz
}
@Test
@@ -317,9 +273,11 @@
assertNotEquals(complete, completeWithDifferentPrimitiveDuration);
VibratorInfo completeWithDifferentFrequencyMapping = completeBuilder
- .setFrequencyMapping(new VibratorInfo.FrequencyMapping(TEST_MIN_FREQUENCY + 10,
- TEST_RESONANT_FREQUENCY + 20, TEST_FREQUENCY_RESOLUTION + 5,
- /* suggestedSafeRangeHz= */ 100, TEST_AMPLITUDE_MAP))
+ .setFrequencyMapping(new VibratorInfo.FrequencyMapping(
+ TEST_RESONANT_FREQUENCY + 20,
+ TEST_MIN_FREQUENCY + 10,
+ TEST_FREQUENCY_RESOLUTION + 5,
+ TEST_AMPLITUDE_MAP))
.build();
assertNotEquals(complete, completeWithDifferentFrequencyMapping);
diff --git a/core/tests/coretests/src/android/os/VibratorTest.java b/core/tests/coretests/src/android/os/VibratorTest.java
index bdd76a5..981086d 100644
--- a/core/tests/coretests/src/android/os/VibratorTest.java
+++ b/core/tests/coretests/src/android/os/VibratorTest.java
@@ -27,14 +27,22 @@
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.ContextWrapper;
import android.hardware.vibrator.IVibrator;
import android.media.AudioAttributes;
import android.platform.test.annotations.Presubmit;
import androidx.test.InstrumentationRegistry;
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.internal.util.test.FakeSettingsProviderRule;
+
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -50,11 +58,19 @@
@RunWith(MockitoJUnitRunner.class)
public class VibratorTest {
+ @Rule
+ public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
+
+ private Context mContextSpy;
private Vibrator mVibratorSpy;
@Before
public void setUp() {
- mVibratorSpy = spy(InstrumentationRegistry.getContext().getSystemService(Vibrator.class));
+ mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
+
+ ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
+ when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
+ mVibratorSpy = spy(new SystemVibrator(mContextSpy));
}
@Test
diff --git a/core/tests/coretests/src/android/os/vibrator/OWNERS b/core/tests/coretests/src/android/os/vibrator/OWNERS
new file mode 100644
index 0000000..b54d6bf
--- /dev/null
+++ b/core/tests/coretests/src/android/os/vibrator/OWNERS
@@ -0,0 +1 @@
+include platform/frameworks/base:/services/core/java/com/android/server/vibrator/OWNERS
\ No newline at end of file
diff --git a/core/tests/coretests/src/android/os/vibrator/RampSegmentTest.java b/core/tests/coretests/src/android/os/vibrator/RampSegmentTest.java
index 5f80d2a..3291b2d 100644
--- a/core/tests/coretests/src/android/os/vibrator/RampSegmentTest.java
+++ b/core/tests/coretests/src/android/os/vibrator/RampSegmentTest.java
@@ -39,19 +39,19 @@
@Test
public void testCreation() {
RampSegment ramp = new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 0,
- /* StartFrequency= */ -1, /* endFrequency= */ 1, /* duration= */ 100);
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 200, /* duration= */ 100);
assertEquals(100L, ramp.getDuration());
assertTrue(ramp.hasNonZeroAmplitude());
assertEquals(1f, ramp.getStartAmplitude());
assertEquals(0f, ramp.getEndAmplitude());
- assertEquals(-1f, ramp.getStartFrequency());
- assertEquals(1f, ramp.getEndFrequency());
+ assertEquals(100f, ramp.getStartFrequencyHz());
+ assertEquals(200f, ramp.getEndFrequencyHz());
}
@Test
public void testSerialization() {
- RampSegment original = new RampSegment(0, 1, 0, 0.5f, 10);
+ RampSegment original = new RampSegment(0, 1, 10, 20.5f, 10);
Parcel parcel = Parcel.obtain();
original.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
@@ -61,7 +61,9 @@
@Test
public void testValidate() {
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 0,
- /* StartFrequency= */ -1, /* endFrequency= */ 1, /* duration= */ 100).validate();
+ /* startFrequencyHz= */ 2, /* endFrequencyHz= */ 1, /* duration= */ 100).validate();
+ // Zero frequency is still used internally for unset frequency.
+ new RampSegment(0, 0, 0, 0, 0).validate();
assertThrows(IllegalArgumentException.class,
() -> new RampSegment(VibrationEffect.DEFAULT_AMPLITUDE, 0, 0, 0, 0).validate());
@@ -70,7 +72,15 @@
assertThrows(IllegalArgumentException.class,
() -> new RampSegment(0, /* endAmplitude= */ 2, 0, 0, 0).validate());
assertThrows(IllegalArgumentException.class,
+ () -> new RampSegment(0, 0, /* startFrequencyHz= */ -1, 0, 0).validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> new RampSegment(0, 0, 0, /* endFrequencyHz= */ -3, 0).validate());
+ assertThrows(IllegalArgumentException.class,
() -> new RampSegment(0, 0, 0, 0, /* duration= */ -1).validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> new RampSegment(/* startAmplitude= */ Float.NaN, 0, 0, 0, 0).validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> new RampSegment(0, 0, /* startFrequencyHz= */ Float.NaN, 0, 0).validate());
}
@Test
diff --git a/core/tests/coretests/src/android/os/vibrator/StepSegmentTest.java b/core/tests/coretests/src/android/os/vibrator/StepSegmentTest.java
index fdce86a..4424127 100644
--- a/core/tests/coretests/src/android/os/vibrator/StepSegmentTest.java
+++ b/core/tests/coretests/src/android/os/vibrator/StepSegmentTest.java
@@ -38,13 +38,13 @@
@Test
public void testCreation() {
- StepSegment step = new StepSegment(/* amplitude= */ 1f, /* frequency= */ -1f,
+ StepSegment step = new StepSegment(/* amplitude= */ 1f, /* frequencyHz= */ 1f,
/* duration= */ 100);
assertEquals(100, step.getDuration());
assertTrue(step.hasNonZeroAmplitude());
assertEquals(1f, step.getAmplitude());
- assertEquals(-1f, step.getFrequency());
+ assertEquals(1f, step.getFrequencyHz());
}
@Test
@@ -58,14 +58,22 @@
@Test
public void testValidate() {
- new StepSegment(/* amplitude= */ 0f, /* frequency= */ -1f, /* duration= */ 100).validate();
+ new StepSegment(/* amplitude= */ 0f, /* frequencyHz= */ 10f, /* duration= */ 10).validate();
+ // Zero frequency is still used internally for unset frequency.
+ new StepSegment(0, 0, 0).validate();
assertThrows(IllegalArgumentException.class,
() -> new StepSegment(/* amplitude= */ -2, 1f, 10).validate());
assertThrows(IllegalArgumentException.class,
() -> new StepSegment(/* amplitude= */ 2, 1f, 10).validate());
assertThrows(IllegalArgumentException.class,
+ () -> new StepSegment(1, /* frequencyHz*/ -1f, 10).validate());
+ assertThrows(IllegalArgumentException.class,
() -> new StepSegment(2, 1f, /* duration= */ -1).validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> new StepSegment(/* amplitude= */ Float.NaN, 1f, 10).validate());
+ assertThrows(IllegalArgumentException.class,
+ () -> new StepSegment(1, /* frequencyHz*/ Float.NaN, 10).validate());
}
@Test
diff --git a/core/tests/coretests/src/com/android/internal/content/res/TEST_MAPPING b/core/tests/coretests/src/com/android/internal/content/res/TEST_MAPPING
new file mode 100644
index 0000000..9aed8be
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/content/res/TEST_MAPPING
@@ -0,0 +1,21 @@
+{
+ "presubmit": [
+ {
+ "name": "FrameworksCoreTests",
+ "options": [
+ {
+ "include-filter": "com.android.internal.content."
+ },
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ },
+ {
+ "exclude-annotation": "org.junit.Ignore"
+ }
+ ]
+ }
+ ]
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java
index 8d9d79d..ce2f764 100644
--- a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.app.usage.NetworkStatsManager;
import android.net.NetworkCapabilities;
import android.net.NetworkStats;
import android.os.BatteryConsumer;
@@ -44,6 +45,7 @@
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
@RunWith(AndroidJUnit4.class)
@SmallTest
@@ -51,6 +53,8 @@
public class MobileRadioPowerCalculatorTest {
private static final double PRECISION = 0.00001;
private static final int APP_UID = Process.FIRST_APPLICATION_UID + 42;
+ @Mock
+ NetworkStatsManager mNetworkStatsManager;
@Rule
public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
@@ -95,7 +99,8 @@
ModemActivityInfo mai = new ModemActivityInfo(10000, 2000, 3000,
new int[]{100, 200, 300, 400, 500}, 600);
- stats.noteModemControllerActivity(mai, POWER_DATA_UNAVAILABLE, 10000, 10000);
+ stats.noteModemControllerActivity(mai, POWER_DATA_UNAVAILABLE, 10000, 10000,
+ mNetworkStatsManager);
mStatsRule.setTime(12_000_000, 12_000_000);
@@ -157,7 +162,8 @@
mStatsRule.setNetworkStats(new NetworkStats(10000, 1)
.insertEntry("cellular", APP_UID, 0, 0, 1000, 100, 2000, 20, 100));
- stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 10000, 10000);
+ stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 10000, 10000,
+ mNetworkStatsManager);
uid.setProcessStateForTest(
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, 11000);
@@ -165,7 +171,8 @@
mStatsRule.setNetworkStats(new NetworkStats(12000, 1)
.insertEntry("cellular", APP_UID, 0, 0, 1000, 250, 2000, 80, 200));
- stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 12000, 12000);
+ stats.noteModemControllerActivity(null, POWER_DATA_UNAVAILABLE, 12000, 12000,
+ mNetworkStatsManager);
assertThat(uid.getMobileRadioMeasuredBatteryConsumptionUC()).isAtMost(0);
// 12000-8000 = 4000 ms == 4_000_000 us
@@ -239,7 +246,7 @@
ModemActivityInfo mai = new ModemActivityInfo(10000, 2000, 3000,
new int[]{100, 200, 300, 400, 500}, 600);
- stats.noteModemControllerActivity(mai, 10_000_000, 10000, 10000);
+ stats.noteModemControllerActivity(mai, 10_000_000, 10000, 10000, mNetworkStatsManager);
mStatsRule.setTime(12_000_000, 12_000_000);
@@ -301,7 +308,7 @@
mStatsRule.setNetworkStats(new NetworkStats(10000, 1)
.insertEntry("cellular", APP_UID, 0, 0, 1000, 100, 2000, 20, 100));
- stats.noteModemControllerActivity(null, 10_000_000, 10000, 10000);
+ stats.noteModemControllerActivity(null, 10_000_000, 10000, 10000, mNetworkStatsManager);
uid.setProcessStateForTest(
BatteryStats.Uid.PROCESS_STATE_BACKGROUND, 11000);
@@ -309,7 +316,7 @@
mStatsRule.setNetworkStats(new NetworkStats(12000, 1)
.insertEntry("cellular", APP_UID, 0, 0, 1000, 250, 2000, 80, 200));
- stats.noteModemControllerActivity(null, 15_000_000, 12000, 12000);
+ stats.noteModemControllerActivity(null, 15_000_000, 12000, 12000, mNetworkStatsManager);
mStatsRule.setTime(20000, 20000);
diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
index 4faf349..bddb3a1 100644
--- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
+++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
@@ -20,6 +20,8 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.annotation.NonNull;
+import android.app.usage.NetworkStatsManager;
import android.net.NetworkStats;
import android.os.Handler;
import android.os.Looper;
@@ -116,7 +118,8 @@
}
@Override
- protected NetworkStats readNetworkStatsLocked(String[] ifaces) {
+ protected NetworkStats readNetworkStatsLocked(@NonNull NetworkStatsManager networkStatsManager,
+ String[] ifaces) {
return mNetworkStats;
}
diff --git a/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
index fc44ddc..e7ce9a0 100644
--- a/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/WifiPowerCalculatorTest.java
@@ -21,6 +21,7 @@
import static com.google.common.truth.Truth.assertThat;
+import android.app.usage.NetworkStatsManager;
import android.net.NetworkCapabilities;
import android.net.NetworkStats;
import android.os.BatteryConsumer;
@@ -35,6 +36,7 @@
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
@RunWith(AndroidJUnit4.class)
@SmallTest
@@ -43,6 +45,9 @@
private static final int APP_UID = Process.FIRST_APPLICATION_UID + 42;
+ @Mock
+ NetworkStatsManager mNetworkStatsManager;
+
@Rule
public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
.setAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_IDLE, 360.0)
@@ -80,7 +85,8 @@
final BatteryStatsImpl batteryStats = setupTestNetworkNumbers();
final WifiActivityEnergyInfo energyInfo = setupPowerControllerBasedModelEnergyNumbersInfo();
- batteryStats.updateWifiState(energyInfo, POWER_DATA_UNAVAILABLE, 1000, 1000);
+ batteryStats.updateWifiState(energyInfo, POWER_DATA_UNAVAILABLE, 1000, 1000,
+ mNetworkStatsManager);
WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
@@ -113,7 +119,7 @@
final BatteryStatsImpl batteryStats = setupTestNetworkNumbers();
final WifiActivityEnergyInfo energyInfo = setupPowerControllerBasedModelEnergyNumbersInfo();
- batteryStats.updateWifiState(energyInfo, 1_000_000, 1000, 1000);
+ batteryStats.updateWifiState(energyInfo, 1_000_000, 1000, 1000, mNetworkStatsManager);
WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
mStatsRule.apply(calculator);
@@ -160,7 +166,8 @@
// Don't pass WifiActivityEnergyInfo, making WifiPowerCalculator rely exclusively
// on the packet counts.
- batteryStats.updateWifiState(/* energyInfo */ null, POWER_DATA_UNAVAILABLE, 1000, 1000);
+ batteryStats.updateWifiState(/* energyInfo */ null, POWER_DATA_UNAVAILABLE, 1000, 1000,
+ mNetworkStatsManager);
WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
@@ -180,7 +187,8 @@
// Don't pass WifiActivityEnergyInfo, making WifiPowerCalculator rely exclusively
// on the packet counts.
- batteryStats.updateWifiState(/* energyInfo */ null, 1_000_000, 1000, 1000);
+ batteryStats.updateWifiState(/* energyInfo */ null, 1_000_000, 1000, 1000,
+ mNetworkStatsManager);
WifiPowerCalculator calculator = new WifiPowerCalculator(mStatsRule.getPowerProfile());
mStatsRule.apply(calculator);
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index f17fa3b..878d302 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -293,6 +293,7 @@
<privapp-permissions package="com.android.shell">
<!-- Needed for test only -->
+ <permission name="android.permission.LAUNCH_DEVICE_MANAGER_SETUP"/>
<permission name="android.permission.MODIFY_DAY_NIGHT_MODE"/>
<permission name="android.permission.ACCESS_LOWPAN_STATE"/>
<permission name="android.permission.BACKUP"/>
@@ -518,13 +519,9 @@
<permission name="android.permission.MANAGE_VOICE_KEYPHRASES" />
<!-- Permission required for ATS test - CarDevicePolicyManagerTest -->
<permission name="android.permission.LOCK_DEVICE" />
- <!-- Permission required for CTS test - CtsSafetyCenterTestCases -->
+ <!-- Permissions required for CTS test - CtsSafetyCenterTestCases -->
<permission name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
- <!-- Permission required for CTS test - CtsSafetyCenterTestCases -->
<permission name="android.permission.READ_SAFETY_CENTER_STATUS" />
- <!-- Permission required for CTS test - CommunalManagerTest -->
- <permission name="android.permission.WRITE_COMMUNAL_STATE" />
- <permission name="android.permission.READ_COMMUNAL_STATE" />
</privapp-permissions>
<privapp-permissions package="com.android.statementservice">
diff --git a/graphics/java/android/graphics/Outline.java b/graphics/java/android/graphics/Outline.java
index fc7f84c..618e6dc 100644
--- a/graphics/java/android/graphics/Outline.java
+++ b/graphics/java/android/graphics/Outline.java
@@ -169,8 +169,7 @@
}
/**
- * Sets the Outline to the rounded rect defined by the input rect, and
- * corner radius.
+ * Sets the Outline to the rect defined by the input coordinates.
*/
public void setRect(int left, int top, int right, int bottom) {
setRoundRect(left, top, right, bottom, 0.0f);
@@ -184,7 +183,7 @@
}
/**
- * Sets the Outline to the rounded rect defined by the input rect, and corner radius.
+ * Sets the Outline to the rounded rect defined by the input coordinates and corner radius.
* <p>
* Passing a zero radius is equivalent to calling {@link #setRect(int, int, int, int)}
*/
diff --git a/graphics/java/android/graphics/RuntimeShader.java b/graphics/java/android/graphics/RuntimeShader.java
index 9ca8e3b..ef57f4a 100644
--- a/graphics/java/android/graphics/RuntimeShader.java
+++ b/graphics/java/android/graphics/RuntimeShader.java
@@ -178,36 +178,6 @@
setUniform(uniformName, values, false);
}
- /**
- * Old method signature used by some callers within the platform code
- * @hide
- * @deprecated use setFloatUniform instead
- */
- @Deprecated
- public void setUniform(@NonNull String uniformName, float[] values) {
- setFloatUniform(uniformName, values);
- }
-
- /**
- * Old method signature used by some callers within the platform code
- * @hide
- * @deprecated use setFloatUniform instead
- */
- @Deprecated
- public void setUniform(@NonNull String uniformName, float value) {
- setFloatUniform(uniformName, value);
- }
-
- /**
- * Old method signature used by some callers within the platform code
- * @hide
- * @deprecated use setFloatUniform instead
- */
- @Deprecated
- public void setUniform(@NonNull String uniformName, float value1, float value2) {
- setFloatUniform(uniformName, value1, value2);
- }
-
private void setFloatUniform(@NonNull String uniformName, float value1, float value2,
float value3, float value4, int count) {
if (uniformName == null) {
diff --git a/graphics/java/android/graphics/drawable/RippleShader.java b/graphics/java/android/graphics/drawable/RippleShader.java
index 272b840..53a6731 100644
--- a/graphics/java/android/graphics/drawable/RippleShader.java
+++ b/graphics/java/android/graphics/drawable/RippleShader.java
@@ -17,7 +17,6 @@
package android.graphics.drawable;
import android.annotation.ColorInt;
-import android.graphics.Color;
import android.graphics.RuntimeShader;
import android.graphics.Shader;
@@ -37,8 +36,8 @@
+ "uniform vec2 in_tRotation1;\n"
+ "uniform vec2 in_tRotation2;\n"
+ "uniform vec2 in_tRotation3;\n"
- + "uniform vec4 in_color;\n"
- + "uniform vec4 in_sparkleColor;\n"
+ + "layout(color) uniform vec4 in_color;\n"
+ + "layout(color) uniform vec4 in_sparkleColor;\n"
+ "uniform shader in_shader;\n";
private static final String SHADER_LIB =
"float triangleNoise(vec2 n) {\n"
@@ -134,78 +133,68 @@
if (shader != null) {
setInputShader("in_shader", shader);
}
- setUniform("in_hasMask", shader == null ? 0 : 1);
+ setFloatUniform("in_hasMask", shader == null ? 0 : 1);
}
public void setRadius(float radius) {
- setUniform("in_maxRadius", radius * 2.3f);
+ setFloatUniform("in_maxRadius", radius * 2.3f);
}
public void setOrigin(float x, float y) {
- setUniform("in_origin", new float[] {x, y});
+ setFloatUniform("in_origin", x, y);
}
public void setTouch(float x, float y) {
- setUniform("in_touch", new float[] {x, y});
+ setFloatUniform("in_touch", x, y);
}
public void setProgress(float progress) {
- setUniform("in_progress", progress);
+ setFloatUniform("in_progress", progress);
}
/**
* Continuous offset used as noise phase.
*/
public void setNoisePhase(float phase) {
- setUniform("in_noisePhase", phase * 0.001f);
+ setFloatUniform("in_noisePhase", phase * 0.001f);
//
// Keep in sync with: frameworks/base/libs/hwui/pipeline/skia/AnimatedDrawables.h
//
final float turbulencePhase = phase;
- setUniform("in_turbulencePhase", turbulencePhase);
+ setFloatUniform("in_turbulencePhase", turbulencePhase);
final float scale = 1.5f;
- setUniform("in_tCircle1", new float[]{
+ setFloatUniform("in_tCircle1",
(float) (scale * 0.5 + (turbulencePhase * 0.01 * Math.cos(scale * 0.55))),
- (float) (scale * 0.5 + (turbulencePhase * 0.01 * Math.sin(scale * 0.55)))
- });
- setUniform("in_tCircle2", new float[]{
+ (float) (scale * 0.5 + (turbulencePhase * 0.01 * Math.sin(scale * 0.55))));
+ setFloatUniform("in_tCircle2",
(float) (scale * 0.2 + (turbulencePhase * -0.0066 * Math.cos(scale * 0.45))),
- (float) (scale * 0.2 + (turbulencePhase * -0.0066 * Math.sin(scale * 0.45)))
- });
- setUniform("in_tCircle3", new float[]{
+ (float) (scale * 0.2 + (turbulencePhase * -0.0066 * Math.sin(scale * 0.45))));
+ setFloatUniform("in_tCircle3",
(float) (scale + (turbulencePhase * -0.0066 * Math.cos(scale * 0.35))),
- (float) (scale + (turbulencePhase * -0.0066 * Math.sin(scale * 0.35)))
- });
+ (float) (scale + (turbulencePhase * -0.0066 * Math.sin(scale * 0.35))));
final double rotation1 = turbulencePhase * PI_ROTATE_RIGHT + 1.7 * Math.PI;
- setUniform("in_tRotation1", new float[]{
- (float) Math.cos(rotation1), (float) Math.sin(rotation1)
- });
+ setFloatUniform("in_tRotation1",
+ (float) Math.cos(rotation1), (float) Math.sin(rotation1));
final double rotation2 = turbulencePhase * PI_ROTATE_LEFT + 2 * Math.PI;
- setUniform("in_tRotation2", new float[]{
- (float) Math.cos(rotation2), (float) Math.sin(rotation2)
- });
+ setFloatUniform("in_tRotation2",
+ (float) Math.cos(rotation2), (float) Math.sin(rotation2));
final double rotation3 = turbulencePhase * PI_ROTATE_RIGHT + 2.75 * Math.PI;
- setUniform("in_tRotation3", new float[]{
- (float) Math.cos(rotation3), (float) Math.sin(rotation3)
- });
+ setFloatUniform("in_tRotation3",
+ (float) Math.cos(rotation3), (float) Math.sin(rotation3));
}
/**
* Color of the circle that's under the sparkles. Sparkles will always be white.
*/
public void setColor(@ColorInt int colorInt, @ColorInt int sparkleColorInt) {
- Color color = Color.valueOf(colorInt);
- Color sparkleColor = Color.valueOf(sparkleColorInt);
- setUniform("in_color", new float[] {color.red(),
- color.green(), color.blue(), color.alpha()});
- setUniform("in_sparkleColor", new float[] {sparkleColor.red(),
- sparkleColor.green(), sparkleColor.blue(), sparkleColor.alpha()});
+ setColorUniform("in_color", colorInt);
+ setColorUniform("in_sparkleColor", sparkleColorInt);
}
public void setResolution(float w, float h) {
final float densityScale = 2.1f;
- setUniform("in_resolutionScale", new float[] {1f / w, 1f / h});
- setUniform("in_noiseScale", new float[] {densityScale / w, densityScale / h});
+ setFloatUniform("in_resolutionScale", 1f / w, 1f / h);
+ setFloatUniform("in_noiseScale", densityScale / w, densityScale / h);
}
}
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index a6aa4f2..54bab4a 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -276,7 +276,7 @@
* "HMACSHA256", sharedSecret, salt, info.toByteArray(), 32));
* byte[] associatedData = {};
* return key.decrypt(ciphertext, associatedData);
- * }
+ * }</pre>
*/
public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAuthArgs {
private static final X500Principal DEFAULT_ATTESTATION_CERT_SUBJECT =
diff --git a/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml b/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml
index 4ac972c..44b2f45 100644
--- a/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml
+++ b/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml
@@ -21,7 +21,7 @@
android:orientation="vertical"
android:clipToPadding="false"
android:paddingEnd="@dimen/compat_hint_padding_end"
- android:paddingBottom="5dp"
+ android:paddingBottom="8dp"
android:clickable="true">
<TextView
diff --git a/libs/WindowManager/Shell/res/layout/compat_ui_layout.xml b/libs/WindowManager/Shell/res/layout/compat_ui_layout.xml
index c99f3fe..dfaeeeb 100644
--- a/libs/WindowManager/Shell/res/layout/compat_ui_layout.xml
+++ b/libs/WindowManager/Shell/res/layout/compat_ui_layout.xml
@@ -33,8 +33,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clipToPadding="false"
- android:layout_marginEnd="16dp"
- android:layout_marginBottom="16dp"
+ android:layout_marginEnd="@dimen/compat_button_margin"
+ android:layout_marginBottom="@dimen/compat_button_margin"
android:orientation="vertical">
<ImageButton
@@ -62,8 +62,10 @@
<ImageButton
android:id="@+id/size_compat_restart_button"
android:visibility="gone"
- android:layout_width="@dimen/size_compat_button_width"
- android:layout_height="@dimen/size_compat_button_height"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/compat_button_margin"
+ android:layout_marginBottom="@dimen/compat_button_margin"
android:src="@drawable/size_compat_restart_button_ripple"
android:background="@android:color/transparent"
android:contentDescription="@string/restart_button_description"/>
diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml
index 8b32b38..ec0e9ea 100644
--- a/libs/WindowManager/Shell/res/values-af/strings.xml
+++ b/libs/WindowManager/Shell/res/values-af/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Bestuur"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Borrel is toegemaak."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tik om hierdie program te herbegin en maak volskerm oop."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerakwessies?\nTik om aan te pas"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nie opgelos nie?\nTik om terug te stel"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen kamerakwessies nie? Tik om toe te maak."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml
index 8b898c0..646a0d3 100644
--- a/libs/WindowManager/Shell/res/values-am/strings.xml
+++ b/libs/WindowManager/Shell/res/values-am/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"ያቀናብሩ"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"አረፋ ተሰናብቷል።"</string>
<string name="restart_button_description" msgid="5887656107651190519">"ይህን መተግበሪያ ዳግም ለማስነሳት መታ ያድርጉ እና ወደ ሙሉ ማያ ገጽ ይሂዱ።"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"የካሜራ ችግሮች አሉ?\nዳግም ለማበጀት መታ ያድርጉ"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"አልተስተካከለም?\nለማህደር መታ ያድርጉ"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml
index a9eafdd..a184fe4 100644
--- a/libs/WindowManager/Shell/res/values-ar/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ar/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"إدارة"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"تم إغلاق الفقاعة."</string>
<string name="restart_button_description" msgid="5887656107651190519">"انقر لإعادة تشغيل هذا التطبيق والانتقال إلى وضع ملء الشاشة."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"هل هناك مشاكل في الكاميرا؟\nانقر لإعادة الضبط."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ألم يتم حل المشكلة؟\nانقر للعودة"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"أليس هناك مشاكل في الكاميرا؟ انقر للإغلاق."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml
index a81d4e3..c58c025 100644
--- a/libs/WindowManager/Shell/res/values-as/strings.xml
+++ b/libs/WindowManager/Shell/res/values-as/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"পৰিচালনা কৰক"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"বাবল অগ্ৰাহ্য কৰা হৈছে"</string>
<string name="restart_button_description" msgid="5887656107651190519">"এপ্টো ৰিষ্টাৰ্ট কৰিবলৈ আৰু পূৰ্ণ স্ক্ৰীন ব্যৱহাৰ কৰিবলৈ টিপক।"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"কেমেৰাৰ কোনো সমস্যা হৈছে নেকি?\nপুনৰ খাপ খোৱাবলৈ টিপক"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এইটো সমাধান কৰা নাই নেকি?\nপূৰ্বাৱস্থালৈ নিবলৈ টিপক"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"কেমেৰাৰ কোনো সমস্যা নাই নেকি? অগ্ৰাহ্য কৰিবলৈ টিপক।"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml
index 45e3fdb..945f738 100644
--- a/libs/WindowManager/Shell/res/values-az/strings.xml
+++ b/libs/WindowManager/Shell/res/values-az/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"İdarə edin"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Qabarcıqdan imtina edilib."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Bu tətbiqi sıfırlayaraq tam ekrana keçmək üçün toxunun."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera problemi var?\nBərpa etmək üçün toxunun"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Düzəltməmisiniz?\nGeri qaytarmaq üçün toxunun"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera problemi yoxdur? Qapatmaq üçün toxunun."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
index c17b3c4..cac983b 100644
--- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljajte"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić je odbačen."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da biste restartovali aplikaciju i prešli u režim celog ekrana."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Imate problema sa kamerom?\nDodirnite da biste ponovo uklopili"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije rešen?\nDodirnite da biste vratili"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema sa kamerom? Dodirnite da biste odbacili."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml
index bcf7186..791bcef 100644
--- a/libs/WindowManager/Shell/res/values-be/strings.xml
+++ b/libs/WindowManager/Shell/res/values-be/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Кіраваць"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Усплывальнае апавяшчэнне адхілена."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Націсніце, каб перазапусціць гэту праграму і перайсці ў поўнаэкранны рэжым."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Праблемы з камерай?\nНацісніце, каб пераабсталяваць"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не ўдалося выправіць?\nНацісніце, каб аднавіць"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ніякіх праблем з камерай? Націсніце, каб адхіліць."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml
index 5f48744..2974b85 100644
--- a/libs/WindowManager/Shell/res/values-bg/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bg/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Управление"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Балончето е отхвърлено."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Докоснете, за да рестартирате това приложение в режим на цял екран."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблеми с камерата?\nДокоснете за ремонтиране"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблемът не се отстрани?\nДокоснете за връщане в предишното състояние"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нямате проблеми с камерата? Докоснете, за да отхвърлите."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml
index f96d65f..e359d46 100644
--- a/libs/WindowManager/Shell/res/values-bn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bn/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"ম্যানেজ করুন"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"বাবল বাতিল করা হয়েছে।"</string>
<string name="restart_button_description" msgid="5887656107651190519">"এই অ্যাপ রিস্টার্ট করতে ট্যাপ করুন ও \'ফুল-স্ক্রিন\' মোড ব্যবহার করুন।"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ক্যামেরা সংক্রান্ত সমস্যা?\nরিফিট করতে ট্যাপ করুন"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এখনও সমাধান হয়নি?\nরিভার্ট করার জন্য ট্যাপ করুন"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ক্যামেরা সংক্রান্ত সমস্যা নেই? বাতিল করতে ট্যাপ করুন।"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml
index 1e068c6..e3990e0 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljaj"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić je odbačen."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da ponovo pokrenete ovu aplikaciju i aktivirate prikaz preko cijelog ekrana."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s kamerom?\nDodirnite da ponovo namjestite"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nije popravljeno?\nDodirnite da vratite"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nema problema s kamerom? Dodirnite da odbacite."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-bs/strings_tv.xml b/libs/WindowManager/Shell/res/values-bs/strings_tv.xml
index 8e301b0..9a655bb 100644
--- a/libs/WindowManager/Shell/res/values-bs/strings_tv.xml
+++ b/libs/WindowManager/Shell/res/values-bs/strings_tv.xml
@@ -19,6 +19,6 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika u slici"</string>
<string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez naslova)"</string>
- <string name="pip_close" msgid="9135220303720555525">"Zatvori PIP"</string>
+ <string name="pip_close" msgid="9135220303720555525">"Zatvori sliku u slici"</string>
<string name="pip_fullscreen" msgid="7278047353591302554">"Cijeli ekran"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml
index 97585ef..f3c2470 100644
--- a/libs/WindowManager/Shell/res/values-ca/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ca/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gestiona"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"La bombolla s\'ha ignorat."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Toca per reiniciar aquesta aplicació i passar a pantalla completa."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tens problemes amb la càmera?\nToca per resoldre\'ls"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"El problema no s\'ha resolt?\nToca per desfer els canvis"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No tens cap problema amb la càmera? Toca per ignorar."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml
index 7a3a890..d1c9a46 100644
--- a/libs/WindowManager/Shell/res/values-cs/strings.xml
+++ b/libs/WindowManager/Shell/res/values-cs/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Spravovat"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bublina byla zavřena."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Klepnutím aplikaci restartujete a přejdete na režim celé obrazovky"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s fotoaparátem?\nKlepnutím vyřešíte"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepomohlo to?\nKlepnutím se vrátíte"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Žádné problémy s fotoaparátem? Klepnutím zavřete."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml
index 4a025ba..94f9a7a 100644
--- a/libs/WindowManager/Shell/res/values-da/strings.xml
+++ b/libs/WindowManager/Shell/res/values-da/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Administrer"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Boblen blev lukket."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tryk for at genstarte denne app, og gå til fuld skærm."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du problemer med dit kamera?\nTryk for at gendanne det oprindelige format"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Løste det ikke problemet?\nTryk for at fortryde"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen problemer med dit kamera? Tryk for at afvise."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml
index bacd512..d1851ea 100644
--- a/libs/WindowManager/Shell/res/values-de/strings.xml
+++ b/libs/WindowManager/Shell/res/values-de/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Verwalten"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble verworfen."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tippe, um die App im Vollbildmodus neu zu starten."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Probleme mit der Kamera?\nZum Anpassen tippen."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Das Problem ist nicht behoben?\nZum Rückgängigmachen tippen."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Keine Probleme mit der Kamera? Zum Schließen tippen."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml
index f306ba3..21d7474 100644
--- a/libs/WindowManager/Shell/res/values-el/strings.xml
+++ b/libs/WindowManager/Shell/res/values-el/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Διαχείριση"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Το συννεφάκι παραβλέφθηκε."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Πατήστε για επανεκκίνηση αυτής της εφαρμογής και ενεργοποίηση πλήρους οθόνης."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Προβλήματα με την κάμερα;\nΠατήστε για επιδιόρθωση."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Δεν διορθώθηκε;\nΠατήστε για επαναφορά."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Δεν αντιμετωπίζετε προβλήματα με την κάμερα; Πατήστε για παράβλεψη."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
index 1ffbd039..7ac28ea9 100644
--- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
index 1ffbd039..7ac28ea9 100644
--- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
index 1ffbd039..7ac28ea9 100644
--- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
index 1ffbd039..7ac28ea9 100644
--- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
index 1ca7bfc..d8db8e1 100644
--- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Administrar"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Se descartó el cuadro."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Presiona para reiniciar esta app y acceder al modo de pantalla completa."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Tienes problemas con la cámara?\nPresiona para reajustarla"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se resolvió?\nPresiona para revertir los cambios"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No tienes problemas con la cámara? Presionar para descartar."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml
index 3d46421..9a7d1c0 100644
--- a/libs/WindowManager/Shell/res/values-es/strings.xml
+++ b/libs/WindowManager/Shell/res/values-es/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionar"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbuja cerrada."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Toca para reiniciar esta aplicación e ir a la pantalla completa."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Problemas con la cámara?\nToca para reajustar"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se ha solucionado?\nToca para revertir"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No hay problemas con la cámara? Toca para cerrar."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml
index 4f5d563..9dfd6cf 100644
--- a/libs/WindowManager/Shell/res/values-et/strings.xml
+++ b/libs/WindowManager/Shell/res/values-et/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Halda"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Mullist loobuti."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Puudutage rakenduse taaskäivitamiseks ja täisekraanrežiimi aktiveerimiseks."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kas teil on kaameraprobleeme?\nPuudutage ümberpaigutamiseks."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Kas probleemi ei lahendatud?\nPuudutage ennistamiseks."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kas kaameraprobleeme pole? Puudutage loobumiseks."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml
index b76ccc8..210c441 100644
--- a/libs/WindowManager/Shell/res/values-eu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-eu/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Kudeatu"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Baztertu da globoa."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Saka ezazu aplikazioa berrabiarazteko, eta ezarri pantaila osoko modua."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Arazoak dauzkazu kamerarekin?\nBerriro doitzeko, sakatu hau."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ez al da konpondu?\nLeheneratzeko, sakatu hau."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ez daukazu arazorik kamerarekin? Baztertzeko, sakatu hau."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml
index aef3c62..87c7f8b 100644
--- a/libs/WindowManager/Shell/res/values-fa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fa/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"مدیریت"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"حبابک رد شد."</string>
<string name="restart_button_description" msgid="5887656107651190519">"برای بازراهاندازی این برنامه و تغییر به حالت تمامصفحه، ضربه بزنید."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"دوربین مشکل دارد؟\nبرای تنظیم مجدد اندازه ضربه بزنید"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"مشکل برطرف نشد؟\nبرای برگرداندن ضربه بزنید"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"دوربین مشکلی ندارد؟ برای بستن ضربه بزنید."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml
index 5f76ba4..7b2ea03 100644
--- a/libs/WindowManager/Shell/res/values-fi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fi/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Ylläpidä"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Kupla ohitettu."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Napauta, niin sovellus käynnistyy uudelleen ja siirtyy koko näytön tilaan."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Onko kameran kanssa ongelmia?\nKorjaa napauttamalla"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Eikö ongelma ratkennut?\nKumoa napauttamalla"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ei ongelmia kameran kanssa? Hylkää napauttamalla."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
index e1843e7..338b8bb 100644
--- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gérer"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulle ignorée."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Touchez pour redémarrer cette application et passer en plein écran."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo?\nTouchez pour réajuster"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu?\nTouchez pour rétablir"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo? Touchez pour ignorer."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml
index b3f3349..22d1d19 100644
--- a/libs/WindowManager/Shell/res/values-fr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-fr/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gérer"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulle fermée."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Appuyez pour redémarrer cette application et activer le mode plein écran."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo ?\nAppuyez pour réajuster"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu ?\nAppuyez pour rétablir"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo ? Appuyez pour ignorer."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml
index 3cdddf3..4bd70a1 100644
--- a/libs/WindowManager/Shell/res/values-gl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gl/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Xestionar"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ignorouse a burbulla."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Toca o botón para reiniciar esta aplicación e abrila en pantalla completa."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tes problemas coa cámara?\nToca para reaxustala"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Non se solucionaron os problemas?\nToca para reverter o seu tratamento"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Non hai problemas coa cámara? Tocar para ignorar."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml
index 09d206e..81c5ba9 100644
--- a/libs/WindowManager/Shell/res/values-gu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-gu/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"મેનેજ કરો"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"બબલ છોડી દેવાયો."</string>
<string name="restart_button_description" msgid="5887656107651190519">"આ ઍપ ફરીથી ચાલુ કરવા માટે ટૅપ કરીને પૂર્ણ સ્ક્રીન કરો."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"કૅમેરામાં સમસ્યાઓ છે?\nફરીથી ફિટ કરવા માટે ટૅપ કરો"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"સુધારો નથી થયો?\nપહેલાંના પર પાછું ફેરવવા માટે ટૅપ કરો"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"કૅમેરામાં કોઈ સમસ્યા નથી? છોડી દેવા માટે ટૅપ કરો."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml
index 0ce5114..56c3271 100644
--- a/libs/WindowManager/Shell/res/values-hi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hi/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"मैनेज करें"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल खारिज किया गया."</string>
<string name="restart_button_description" msgid="5887656107651190519">"इस ऐप्लिकेशन को रीस्टार्ट करने और फ़ुल स्क्रीन पर देखने के लिए टैप करें."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्या कैमरे से जुड़ी कोई समस्या है?\nफिर से फ़िट करने के लिए टैप करें"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"क्या समस्या ठीक नहीं हुई?\nपहले जैसा करने के लिए टैप करें"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्या कैमरे से जुड़ी कोई समस्या नहीं है? खारिज करने के लिए टैप करें."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml
index e8c83f1..d71bc1d 100644
--- a/libs/WindowManager/Shell/res/values-hr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hr/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljanje"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić odbačen."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da biste ponovo pokrenuli tu aplikaciju i prikazali je na cijelom zaslonu."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s fotoaparatom?\nDodirnite za popravak"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije riješen?\nDodirnite za vraćanje"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema s fotoaparatom? Dodirnite za odbacivanje."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml
index 6d60513..a69f197 100644
--- a/libs/WindowManager/Shell/res/values-hu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hu/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Kezelés"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Buborék elvetve."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Koppintson az alkalmazás újraindításához és a teljes képernyős mód elindításához."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerával kapcsolatos problémába ütközött?\nKoppintson a megoldáshoz."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nem sikerült a hiba kijavítása?\nKoppintson a visszaállításhoz."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nincsenek problémái kamerával? Koppintson az elvetéshez."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml
index f1ec076..e38285e 100644
--- a/libs/WindowManager/Shell/res/values-hy/strings.xml
+++ b/libs/WindowManager/Shell/res/values-hy/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Կառավարել"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ամպիկը փակվեց։"</string>
<string name="restart_button_description" msgid="5887656107651190519">"Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Տեսախցիկի հետ կապված խնդիրնե՞ր կան։\nՀպեք՝ վերակարգավորելու համար։"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Չհաջողվե՞ց շտկել։\nՀպեք՝ փոփոխությունները չեղարկելու համար։"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Տեսախցիկի հետ կապված խնդիրներ չկա՞ն։ Փակելու համար հպեք։"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml
index 62dfcb7..036acb8 100644
--- a/libs/WindowManager/Shell/res/values-in/strings.xml
+++ b/libs/WindowManager/Shell/res/values-in/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Kelola"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balon ditutup."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Ketuk untuk memulai ulang aplikasi ini dan membuka layar penuh."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Masalah kamera?\nKetuk untuk memperbaiki"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tidak dapat diperbaiki?\nKetuk untuk mengembalikan"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tidak ada masalah kamera? Ketuk untuk menutup."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml
index feab362..2f98487 100644
--- a/libs/WindowManager/Shell/res/values-is/strings.xml
+++ b/libs/WindowManager/Shell/res/values-is/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Stjórna"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Blöðru lokað."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Ýttu til að endurræsa forritið og sýna það á öllum skjánum."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Myndavélavesen?\nÝttu til að breyta stærð"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ennþá vesen?\nÝttu til að afturkalla"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ekkert myndavélavesen? Ýttu til að hunsa."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml
index bfcd385..e4da3939 100644
--- a/libs/WindowManager/Shell/res/values-it/strings.xml
+++ b/libs/WindowManager/Shell/res/values-it/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gestisci"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Fumetto ignorato."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tocca per riavviare l\'app e passare alla modalità a schermo intero."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi con la fotocamera?\nTocca per risolverli"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Il problema non si è risolto?\nTocca per ripristinare"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nessun problema con la fotocamera? Tocca per ignorare."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml
index 7ef5035..99294f9 100644
--- a/libs/WindowManager/Shell/res/values-iw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-iw/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"ניהול"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"הבועה נסגרה."</string>
<string name="restart_button_description" msgid="5887656107651190519">"צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"בעיות במצלמה?\nאפשר להקיש כדי לבצע התאמה מחדש"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"הבעיה לא נפתרה?\nאפשר להקיש כדי לחזור לגרסה הקודמת"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"אין בעיות במצלמה? אפשר להקיש כדי לסגור."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml
index fb58abb..1ee606a 100644
--- a/libs/WindowManager/Shell/res/values-ja/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ja/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ふきだしが非表示になっています。"</string>
<string name="restart_button_description" msgid="5887656107651190519">"タップしてこのアプリを再起動すると、全画面表示になります。"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"カメラに関する問題の場合は、\nタップすると修正できます"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"修正されなかった場合は、\nタップすると元に戻ります"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"カメラに関する問題でない場合は、タップすると閉じます。"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml
index 297d9af..e8efa8d 100644
--- a/libs/WindowManager/Shell/res/values-ka/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ka/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"მართვა"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ბუშტი დაიხურა."</string>
<string name="restart_button_description" msgid="5887656107651190519">"შეეხეთ ამ აპის გადასატვირთად და გადადით სრულ ეკრანზე."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"კამერად პრობლემები აქვს?\nშეეხეთ გამოსასწორებლად"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"არ გამოსწორდა?\nშეეხეთ წინა ვერსიის დასაბრუნებლად"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"კამერას პრობლემები არ აქვს? შეეხეთ უარყოფისთვის."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml
index 7ca2f23..0c3f8f54 100644
--- a/libs/WindowManager/Shell/res/values-kk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kk/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Басқару"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Қалқыма хабар жабылды."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Бұл қолданбаны қайта қосып, толық экранға өту үшін түртіңіз."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада қателер шықты ма?\nЖөндеу үшін түртіңіз."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Жөнделмеді ме?\nҚайтару үшін түртіңіз."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада қателер шықпады ма? Жабу үшін түртіңіз."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml
index dae2293..e5ecf81 100644
--- a/libs/WindowManager/Shell/res/values-km/strings.xml
+++ b/libs/WindowManager/Shell/res/values-km/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"គ្រប់គ្រង"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"បានច្រានចោលសារលេចឡើង។"</string>
<string name="restart_button_description" msgid="5887656107651190519">"ចុចដើម្បីចាប់ផ្ដើមកម្មវិធីនេះឡើងវិញ រួចចូលប្រើពេញអេក្រង់។"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"មានបញ្ហាពាក់ព័ន្ធនឹងកាមេរ៉ាឬ?\nចុចដើម្បីដោះស្រាយ"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"មិនបានដោះស្រាយបញ្ហានេះទេឬ?\nចុចដើម្បីត្រឡប់"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"មិនមានបញ្ហាពាក់ព័ន្ធនឹងកាមេរ៉ាទេឬ? ចុចដើម្បីច្រានចោល។"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml
index 72ba8ea..69a6df8 100644
--- a/libs/WindowManager/Shell/res/values-kn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-kn/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"ನಿರ್ವಹಿಸಿ"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ಬಬಲ್ ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="restart_button_description" msgid="5887656107651190519">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಮತ್ತು ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿವೆಯೇ?\nಮರುಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ಅದನ್ನು ಸರಿಪಡಿಸಲಿಲ್ಲವೇ?\nಹಿಂತಿರುಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿಲ್ಲವೇ? ವಜಾಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml
index d99abc4..804b78c 100644
--- a/libs/WindowManager/Shell/res/values-ko/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ko/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"관리"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"대화창을 닫았습니다."</string>
<string name="restart_button_description" msgid="5887656107651190519">"탭하여 이 앱을 다시 시작하고 전체 화면으로 이동합니다."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"카메라 문제가 있나요?\n해결하려면 탭하세요."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"해결되지 않았나요?\n되돌리려면 탭하세요."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"카메라에 문제가 없나요? 닫으려면 탭하세요."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml
index fe25161..c7e7a05 100644
--- a/libs/WindowManager/Shell/res/values-ky/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ky/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Башкаруу"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Калкып чыкма билдирме жабылды."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Бул колдонмону өчүрүп күйгүзүп, толук экранга өтүү үчүн таптап коюңуз."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада маселелер келип чыктыбы?\nОңдоо үчүн таптаңыз"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Оңдолгон жокпу?\nАртка кайтаруу үчүн таптаңыз"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада маселе жокпу? Этибарга албоо үчүн таптаңыз."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml
index 786d837..a94507f 100644
--- a/libs/WindowManager/Shell/res/values-lo/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lo/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"ຈັດການ"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ປິດ Bubble ໄສ້ແລ້ວ."</string>
<string name="restart_button_description" msgid="5887656107651190519">"ແຕະເພື່ອຣີສະຕາດແອັບນີ້ ແລະ ໃຊ້ແບບເຕັມຈໍ."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ?\nແຕະເພື່ອປັບໃໝ່"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ບໍ່ໄດ້ແກ້ໄຂມັນບໍ?\nແຕະເພື່ອແປງກັບຄືນ"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ບໍ່ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ? ແຕະເພື່ອປິດໄວ້."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml
index 32bdfc4..dae4d71 100644
--- a/libs/WindowManager/Shell/res/values-lt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lt/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Tvarkyti"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Debesėlio atsisakyta."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Palieskite, kad paleistumėte iš naujo šią programą ir įjungtumėte viso ekrano režimą."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Iškilo problemų dėl kameros?\nPalieskite, kad pritaikytumėte iš naujo"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepavyko pataisyti?\nPalieskite, kad grąžintumėte"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nėra jokių problemų dėl kameros? Palieskite, kad atsisakytumėte."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml
index 5d0f318..564002d 100644
--- a/libs/WindowManager/Shell/res/values-lv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-lv/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Pārvaldīt"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbulis ir noraidīts."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Pieskarieties, lai restartētu šo lietotni un pārietu pilnekrāna režīmā."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Vai ir problēmas ar kameru?\nPieskarieties, lai tās novērstu."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Vai problēma netika novērsta?\nPieskarieties, lai atjaunotu."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Vai nav problēmu ar kameru? Pieskarieties, lai nerādītu."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml
index 8c2e44c..a9b0019 100644
--- a/libs/WindowManager/Shell/res/values-mk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mk/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Управувајте"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Балончето е отфрлено."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Допрете за да ја рестартирате апликацијава и да ја отворите на цел екран."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми со камерата?\nДопрете за да се совпадне повторно"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не се поправи?\nДопрете за враќање"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нема проблеми со камерата? Допрете за отфрлање."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml
index 6c8883a..9326134 100644
--- a/libs/WindowManager/Shell/res/values-ml/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ml/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"മാനേജ് ചെയ്യുക"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ബബിൾ ഡിസ്മിസ് ചെയ്തു."</string>
<string name="restart_button_description" msgid="5887656107651190519">"ഈ ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്ത് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറാൻ ടാപ്പ് ചെയ്യുക."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ക്യാമറ പ്രശ്നങ്ങളുണ്ടോ?\nശരിയാക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"അത് പരിഹരിച്ചില്ലേ?\nപുനഃസ്ഥാപിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ക്യാമറാ പ്രശ്നങ്ങളൊന്നുമില്ലേ? നിരസിക്കാൻ ടാപ്പ് ചെയ്യുക."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml
index d297923..8f21592 100644
--- a/libs/WindowManager/Shell/res/values-mn/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mn/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Удирдах"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Бөмбөлгийг үл хэрэгссэн."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Энэ аппыг дахин эхлүүлж, бүтэн дэлгэцэд орохын тулд товшино уу."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерын асуудал гарсан уу?\nДахин тааруулахын тулд товшино уу"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Үүнийг засаагүй юу?\nБуцаахын тулд товшино уу"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерын асуудал байхгүй юу? Хаахын тулд товшино уу."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml
index 3d9b53c..936c252 100644
--- a/libs/WindowManager/Shell/res/values-mr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-mr/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"व्यवस्थापित करा"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल डिसमिस केला."</string>
<string name="restart_button_description" msgid="5887656107651190519">"हे अॅप रीस्टार्ट करण्यासाठी आणि फुल स्क्रीन करण्यासाठी टॅप करा."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"कॅमेराशी संबंधित काही समस्या आहेत का?\nपुन्हा फिट करण्यासाठी टॅप करा"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"निराकरण झाले नाही?\nरिव्हर्ट करण्यासाठी कृपया टॅप करा"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"कॅमेराशी संबंधित कोणत्याही समस्या नाहीत का? डिसमिस करण्यासाठी टॅप करा."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml
index 0aafb59..15c122c 100644
--- a/libs/WindowManager/Shell/res/values-ms/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ms/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Urus"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Gelembung diketepikan."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Ketik untuk memulakan semula apl ini dan menggunakan skrin penuh."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Isu kamera?\nKetik untuk memuatkan semula"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Isu tidak dibetulkan?\nKetik untuk kembali"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tiada isu kamera? Ketik untuk mengetepikan."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml
index 899c607..c54e3b3 100644
--- a/libs/WindowManager/Shell/res/values-my/strings.xml
+++ b/libs/WindowManager/Shell/res/values-my/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"စီမံရန်"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ပူဖောင်းကွက် ဖယ်လိုက်သည်။"</string>
<string name="restart_button_description" msgid="5887656107651190519">"ဤအက်ပ်ကို ပြန်စပြီး ဖန်သားပြင်အပြည့်လုပ်ရန် တို့ပါ။"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ကင်မရာပြဿနာလား။\nပြင်ဆင်ရန် တို့ပါ"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ကောင်းမသွားဘူးလား။\nပြန်ပြောင်းရန် တို့ပါ"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ကင်မရာပြဿနာ မရှိဘူးလား။ ပယ်ရန် တို့ပါ။"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml
index 60891d3..ae33f7a 100644
--- a/libs/WindowManager/Shell/res/values-nb/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nb/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Administrer"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Boblen er avvist."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Trykk for å starte denne appen på nytt og vise den i fullskjerm."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du kameraproblemer?\nTrykk for å tilpasse"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ble ikke problemet løst?\nTrykk for å gå tilbake"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen kameraproblemer? Trykk for å lukke."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml
index 8bd6907..bbf247c 100644
--- a/libs/WindowManager/Shell/res/values-ne/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ne/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"व्यवस्थापन गर्नुहोस्"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल हटाइयो।"</string>
<string name="restart_button_description" msgid="5887656107651190519">"यो एप रिस्टार्ट गर्न ट्याप गर्नुहोस् र फुल स्क्रिन मोडमा जानुहोस्।"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्यामेरासम्बन्धी समस्या देखियो?\nसमस्या हल गर्न ट्याप गर्नुहोस्"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"समस्या हल भएन?\nपहिलेको जस्तै बनाउन ट्याप गर्नुहोस्"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्यामेरासम्बन्धी कुनै पनि समस्या छैन? खारेज गर्न ट्याप गर्नुहोस्।"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml
index 3fddf34..6a4d310 100644
--- a/libs/WindowManager/Shell/res/values-nl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-nl/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Beheren"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubbel gesloten."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tik om deze app opnieuw te starten en te openen op het volledige scherm."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Cameraproblemen?\nTik om opnieuw passend te maken."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Is dit geen oplossing?\nTik om terug te zetten."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen cameraproblemen? Tik om te sluiten."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml
index 217556e..09fe95b 100644
--- a/libs/WindowManager/Shell/res/values-or/strings.xml
+++ b/libs/WindowManager/Shell/res/values-or/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"ପରିଚାଳନା କରନ୍ତୁ"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ବବଲ୍ ଖାରଜ କରାଯାଇଛି।"</string>
<string name="restart_button_description" msgid="5887656107651190519">"ଏହି ଆପକୁ ରିଷ୍ଟାର୍ଟ କରି ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"କ୍ୟାମେରାରେ ସମସ୍ୟା ଅଛି?\nପୁଣି ଫିଟ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ଏହାର ସମାଧାନ ହୋଇନାହିଁ?\nଫେରିଯିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"କ୍ୟାମେରାରେ କିଛି ସମସ୍ୟା ନାହିଁ? ଖାରଜ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml
index dc4dae1..3c7f373 100644
--- a/libs/WindowManager/Shell/res/values-pa/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pa/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ਬਬਲ ਨੂੰ ਖਾਰਜ ਕੀਤਾ ਗਿਆ।"</string>
<string name="restart_button_description" msgid="5887656107651190519">"ਇਸ ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਪੂਰੀ ਸਕ੍ਰੀਨ ਮੋਡ \'ਤੇ ਜਾਓ।"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ?\nਮੁੜ-ਫਿੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ਕੀ ਇਹ ਠੀਕ ਨਹੀਂ ਹੋਈ?\nਵਾਪਸ ਉਹੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ? ਖਾਰਜ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml
index fccd138..cb89c39 100644
--- a/libs/WindowManager/Shell/res/values-pl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pl/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Zarządzaj"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Zamknięto dymek"</string>
<string name="restart_button_description" msgid="5887656107651190519">"Kliknij, by uruchomić tę aplikację ponownie i przejść w tryb pełnoekranowy."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemy z aparatem?\nKliknij, aby dopasować"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Naprawa się nie udała?\nKliknij, aby cofnąć"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Brak problemów z aparatem? Kliknij, aby zamknąć"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
index 5664030..73cf177 100644
--- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gerenciar"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão dispensado."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar o app e usar tela cheia."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
index abe6a01..8ea4c2f 100644
--- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gerir"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão ignorado."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar esta app e ficar em ecrã inteiro."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmara?\nToque aqui para reajustar"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Não foi corrigido?\nToque para reverter"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nenhum problema com a câmara? Toque para ignorar."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml
index 5664030..73cf177 100644
--- a/libs/WindowManager/Shell/res/values-pt/strings.xml
+++ b/libs/WindowManager/Shell/res/values-pt/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gerenciar"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão dispensado."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar o app e usar tela cheia."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml
index 39dec90..eb77c6a 100644
--- a/libs/WindowManager/Shell/res/values-ro/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ro/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionați"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balonul a fost respins."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Atingeți ca să reporniți aplicația și să treceți în modul ecran complet."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Aveți probleme cu camera foto?\nAtingeți pentru a reîncadra"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nu ați remediat problema?\nAtingeți pentru a reveni"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nu aveți probleme cu camera foto? Atingeți pentru a închide."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml
index e3c2215..64de668 100644
--- a/libs/WindowManager/Shell/res/values-ru/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ru/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Настроить"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Всплывающий чат закрыт."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Нажмите, чтобы перезапустить приложение и перейти в полноэкранный режим."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблемы с камерой?\nНажмите, чтобы исправить."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не помогло?\nНажмите, чтобы отменить изменения."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нет проблем с камерой? Нажмите, чтобы закрыть."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml
index efaf1f3..8c3aae9 100644
--- a/libs/WindowManager/Shell/res/values-si/strings.xml
+++ b/libs/WindowManager/Shell/res/values-si/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"කළමනා කරන්න"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"බුබුල ඉවත දමා ඇත."</string>
<string name="restart_button_description" msgid="5887656107651190519">"මෙම යෙදුම යළි ඇරඹීමට සහ පූර්ණ තිරයට යාමට තට්ටු කරන්න."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"කැමරා ගැටලුද?\nයළි සවි කිරීමට තට්ටු කරන්න"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"එය විසඳුවේ නැතිද?\nප්රතිවර්තනය කිරීමට තට්ටු කරන්න"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"කැමරා ගැටලු නොමැතිද? ඉවත දැමීමට තට්ටු කරන්න"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml
index a827153..5dbe5ad 100644
--- a/libs/WindowManager/Shell/res/values-sk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sk/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Spravovať"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bublina bola zavretá."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Klepnutím reštartujete túto aplikáciu a prejdete do režimu celej obrazovky."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s kamerou?\nKlepnutím znova upravte."</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nevyriešilo sa to?\nKlepnutím sa vráťte."</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemáte problémy s kamerou? Klepnutím zatvoríte."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml
index 7437654..61155a9 100644
--- a/libs/WindowManager/Shell/res/values-sl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sl/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljanje"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblaček je bil opuščen."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Dotaknite se za vnovični zagon te aplikacije in preklop v celozaslonski način."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Težave s fotoaparatom?\nDotaknite se za vnovično prilagoditev"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"To ni odpravilo težave?\nDotaknite se za povrnitev"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nimate težav s fotoaparatom? Dotaknite se za opustitev."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml
index bda10c8..8c11ea5 100644
--- a/libs/WindowManager/Shell/res/values-sq/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sq/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Menaxho"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Flluska u hoq."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Trokit për ta rinisur këtë aplikacion dhe për të kaluar në ekranin e plotë."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Ka probleme me kamerën?\nTrokit për ta ripërshtatur"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nuk u rregullua?\nTrokit për ta rikthyer"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nuk ka probleme me kamerën? Trokit për ta shpërfillur."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml
index 98e13be..910108d 100644
--- a/libs/WindowManager/Shell/res/values-sr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sr/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Управљајте"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Облачић је одбачен."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Додирните да бисте рестартовали апликацију и прешли у режим целог екрана."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблема са камером?\nДодирните да бисте поново уклопили"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблем није решен?\nДодирните да бисте вратили"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немате проблема са камером? Додирните да бисте одбацили."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml
index 3080088..b3fa582 100644
--- a/libs/WindowManager/Shell/res/values-sv/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sv/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Hantera"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubblan ignorerades."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Tryck för att starta om appen i helskärmsläge."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problem med kameran?\nTryck för att anpassa på nytt"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Löstes inte problemet?\nTryck för att återställa"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Inga problem med kameran? Tryck för att ignorera."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml
index 9fb7460..286b53c 100644
--- a/libs/WindowManager/Shell/res/values-sw/strings.xml
+++ b/libs/WindowManager/Shell/res/values-sw/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Dhibiti"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Umeondoa kiputo."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Gusa ili uzime na uwashe programu hii, kisha nenda kwenye skrini nzima."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Je, kuna hitilafu za kamera?\nGusa ili urekebishe"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Umeshindwa kurekebisha?\nGusa ili urejeshe nakala ya awali"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Je, hakuna hitilafu za kamera? Gusa ili uondoe."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml
index d7f17aa..b929a1c 100644
--- a/libs/WindowManager/Shell/res/values-ta/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ta/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"நிர்வகி"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"குமிழ் நிராகரிக்கப்பட்டது."</string>
<string name="restart_button_description" msgid="5887656107651190519">"தட்டுவதன் மூலம் இந்த ஆப்ஸை மீண்டும் தொடங்கலாம், முழுத்திரையில் பார்க்கலாம்."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"கேமரா தொடர்பான சிக்கல்களா?\nமீண்டும் பொருத்த தட்டவும்"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"சிக்கல்கள் சரிசெய்யப்படவில்லையா?\nமாற்றியமைக்க தட்டவும்"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"கேமரா தொடர்பான சிக்கல்கள் எதுவும் இல்லையா? நிராகரிக்க தட்டவும்."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml
index 4e421b5..84cf285a 100644
--- a/libs/WindowManager/Shell/res/values-te/strings.xml
+++ b/libs/WindowManager/Shell/res/values-te/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"మేనేజ్ చేయండి"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"బబుల్ విస్మరించబడింది."</string>
<string name="restart_button_description" msgid="5887656107651190519">"ఈ యాప్ను రీస్టార్ట్ చేయడానికి ట్యాప్ చేసి, ఆపై పూర్తి స్క్రీన్లోకి వెళ్లండి."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"కెమెరా సమస్యలు ఉన్నాయా?\nరీఫిట్ చేయడానికి ట్యాప్ చేయండి"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"దాని సమస్యను పరిష్కరించలేదా?\nపూర్వస్థితికి మార్చడానికి ట్యాప్ చేయండి"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"కెమెరా సమస్యలు లేవా? తీసివేయడానికి ట్యాప్ చేయండి."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml
index 52f94e6..f0d9362 100644
--- a/libs/WindowManager/Shell/res/values-th/strings.xml
+++ b/libs/WindowManager/Shell/res/values-th/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"จัดการ"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ปิดบับเบิลแล้ว"</string>
<string name="restart_button_description" msgid="5887656107651190519">"แตะเพื่อรีสตาร์ทแอปนี้และแสดงแบบเต็มหน้าจอ"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"หากพบปัญหากับกล้อง\nแตะเพื่อแก้ไข"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"หากไม่ได้แก้ไข\nแตะเพื่อเปลี่ยนกลับ"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"หากไม่พบปัญหากับกล้อง แตะเพื่อปิด"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml
index d7b671d..1c3b8f1 100644
--- a/libs/WindowManager/Shell/res/values-tl/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tl/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Pamahalaan"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Na-dismiss na ang bubble."</string>
<string name="restart_button_description" msgid="5887656107651190519">"I-tap para i-restart ang app na ito at mag-full screen."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"May mga isyu sa camera?\nI-tap para i-refit"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Hindi ito naayos?\nI-tap para i-revert"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Walang isyu sa camera? I-tap para i-dismiss."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml
index c618f6c..41c6c89 100644
--- a/libs/WindowManager/Shell/res/values-tr/strings.xml
+++ b/libs/WindowManager/Shell/res/values-tr/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Yönet"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balon kapatıldı."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Bu uygulamayı yeniden başlatmak ve tam ekrana geçmek için dokunun."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kameranızda sorun mu var?\nDüzeltmek için dokunun"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bu işlem sorunu düzeltmedi mi?\nİşlemi geri almak için dokunun"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kameranızda sorun yok mu? Kapatmak için dokunun."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml
index ec2e550..8094d5d 100644
--- a/libs/WindowManager/Shell/res/values-uk/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uk/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Налаштувати"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Спливаюче сповіщення закрито."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Натисніть, щоб перезапустити додаток і перейти в повноекранний режим."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми з камерою?\nНатисніть, щоб пристосувати"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблему не вирішено?\nНатисніть, щоб скасувати зміни"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немає проблем із камерою? Торкніться, щоб закрити."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml
index 18e1e51..0f6061e 100644
--- a/libs/WindowManager/Shell/res/values-ur/strings.xml
+++ b/libs/WindowManager/Shell/res/values-ur/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"نظم کریں"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"بلبلہ برخاست کر دیا گیا۔"</string>
<string name="restart_button_description" msgid="5887656107651190519">"یہ ایپ دوبارہ شروع کرنے کے لیے تھپتھپائیں اور پوری اسکرین پر جائیں۔"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"کیمرے کے مسائل؟\nدوبارہ فٹ کرنے کیلئے تھپتھپائیں"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"یہ حل نہیں ہوا؟\nلوٹانے کیلئے تھپتھپائیں"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"کوئی کیمرے کا مسئلہ نہیں ہے؟ برخاست کرنے کیلئے تھپتھپائیں۔"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml
index f6c7ed2..12fbd0f 100644
--- a/libs/WindowManager/Shell/res/values-uz/strings.xml
+++ b/libs/WindowManager/Shell/res/values-uz/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Boshqarish"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulutcha yopildi."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Bu ilovani qaytadan ishga tushirish va butun ekranda ochish uchun bosing."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera nosozmi?\nQayta moslash uchun bosing"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tuzatilmadimi?\nQaytarish uchun bosing"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera muammosizmi? Yopish uchun bosing."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml
index 1cab8e7..4623b6b 100644
--- a/libs/WindowManager/Shell/res/values-vi/strings.xml
+++ b/libs/WindowManager/Shell/res/values-vi/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Quản lý"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Đã đóng bong bóng."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Nhấn để khởi động lại ứng dụng này và xem ở chế độ toàn màn hình."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Có vấn đề với máy ảnh?\nHãy nhấn để sửa lỗi"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bạn chưa khắc phục vấn đề?\nHãy nhấn để hủy bỏ"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Không có vấn đề với máy ảnh? Hãy nhấn để đóng."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
index dc12c4f..5936677 100644
--- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"已关闭对话泡。"</string>
<string name="restart_button_description" msgid="5887656107651190519">"点按即可重启此应用并进入全屏模式。"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相机有问题?\n点按即可整修"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"没有解决此问题?\n点按即可恢复"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相机没有问题?点按即可忽略。"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
index fe114ac..55045371 100644
--- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"對話氣泡已關閉。"</string>
<string name="restart_button_description" msgid="5887656107651190519">"輕按即可重新開啟此應用程式並放大至全螢幕。"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題?\n輕按即可修正"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未能修正問題?\n輕按即可還原"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機冇問題?㩒一下就可以即可閂咗佢。"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
index 0e4fc30..aa0bdd0 100644
--- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"已關閉泡泡。"</string>
<string name="restart_button_description" msgid="5887656107651190519">"輕觸即可重新啟動這個應用程式並進入全螢幕模式。"</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題嗎?\n輕觸即可修正"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未修正問題嗎?\n輕觸即可還原"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機沒問題嗎?輕觸即可關閉。"</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml
index f563f1f..688f36b 100644
--- a/libs/WindowManager/Shell/res/values-zu/strings.xml
+++ b/libs/WindowManager/Shell/res/values-zu/strings.xml
@@ -73,10 +73,7 @@
<string name="manage_bubbles_text" msgid="7730624269650594419">"Phatha"</string>
<string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ibhamuza licashisiwe."</string>
<string name="restart_button_description" msgid="5887656107651190519">"Thepha ukuze uqale kabusha lolu hlelo lokusebenza uphinde uye kusikrini esigcwele."</string>
- <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) -->
- <skip />
- <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) -->
- <skip />
- <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) -->
- <skip />
+ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Izinkinga zekhamera?\nThepha ukuze uyilinganise kabusha"</string>
+ <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Akuyilungisanga?\nThepha ukuze ubuyele"</string>
+ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Azikho izinkinga zekhamera? Thepha ukuze ucashise."</string>
</resources>
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index d338e3b..1c19a10 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -200,11 +200,8 @@
<!-- Size of user education views on large screens (phone is just match parent). -->
<dimen name="bubbles_user_education_width_large_screen">400dp</dimen>
- <!-- The width of the size compat restart button including padding. -->
- <dimen name="size_compat_button_width">80dp</dimen>
-
- <!-- The height of the size compat restart button including padding. -->
- <dimen name="size_compat_button_height">64dp</dimen>
+ <!-- Bottom and end margin for compat buttons. -->
+ <dimen name="compat_button_margin">16dp</dimen>
<!-- The radius of the corners of the compat hint bubble. -->
<dimen name="compat_hint_corner_radius">28dp</dimen>
@@ -212,8 +209,8 @@
<!-- The width of the compat hint point. -->
<dimen name="compat_hint_point_width">10dp</dimen>
- <!-- The end padding for the compat hint. Computed as (size_compat_button_width / 2
- - compat_hint_corner_radius - compat_hint_point_width /2). -->
+ <!-- The end padding for the compat hint. Computed as (compat button width (=48) / 2
+ + compat_button_margin - compat_hint_corner_radius - compat_hint_point_width / 2). -->
<dimen name="compat_hint_padding_end">7dp</dimen>
<!-- The width of the size compat hint. -->
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index eaeade8..cf4647a 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -364,13 +364,15 @@
* @param context the context for the bubble.
* @param controller the bubble controller.
* @param stackView the stackView the bubble is eventually added to.
- * @param iconFactory the iconfactory use to create badged images for the bubble.
+ * @param iconFactory the icon factory use to create images for the bubble.
+ * @param badgeIconFactory the icon factory to create app badges for the bubble.
*/
void inflate(BubbleViewInfoTask.Callback callback,
Context context,
BubbleController controller,
BubbleStackView stackView,
BubbleIconFactory iconFactory,
+ BubbleBadgeIconFactory badgeIconFactory,
boolean skipInflation) {
if (isBubbleLoading()) {
mInflationTask.cancel(true /* mayInterruptIfRunning */);
@@ -380,6 +382,7 @@
controller,
stackView,
iconFactory,
+ badgeIconFactory,
skipInflation,
callback,
mMainExecutor);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java
new file mode 100644
index 0000000..4eeb207
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleBadgeIconFactory.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.bubbles;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.drawable.AdaptiveIconDrawable;
+import android.graphics.drawable.Drawable;
+
+import com.android.launcher3.icons.BaseIconFactory;
+import com.android.launcher3.icons.BitmapInfo;
+import com.android.launcher3.icons.ShadowGenerator;
+import com.android.wm.shell.R;
+
+/**
+ * Factory for creating app badge icons that are shown on bubbles.
+ */
+public class BubbleBadgeIconFactory extends BaseIconFactory {
+
+ public BubbleBadgeIconFactory(Context context) {
+ super(context, context.getResources().getConfiguration().densityDpi,
+ context.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size));
+ }
+
+ /**
+ * Returns a {@link BitmapInfo} for the app-badge that is shown on top of each bubble. This
+ * will include the workprofile indicator on the badge if appropriate.
+ */
+ BitmapInfo getBadgeBitmap(Drawable userBadgedAppIcon, boolean isImportantConversation) {
+ ShadowGenerator shadowGenerator = new ShadowGenerator(mIconBitmapSize);
+ Bitmap userBadgedBitmap = createIconBitmap(userBadgedAppIcon, 1f, mIconBitmapSize);
+
+ if (userBadgedAppIcon instanceof AdaptiveIconDrawable) {
+ userBadgedBitmap = Bitmap.createScaledBitmap(
+ getCircleBitmap((AdaptiveIconDrawable) userBadgedAppIcon, /* size */
+ userBadgedAppIcon.getIntrinsicWidth()),
+ mIconBitmapSize, mIconBitmapSize, /* filter */ true);
+ }
+
+ if (isImportantConversation) {
+ final float ringStrokeWidth = mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.importance_ring_stroke_width);
+ final int importantConversationColor = mContext.getResources().getColor(
+ R.color.important_conversation, null);
+ Bitmap badgeAndRing = Bitmap.createBitmap(userBadgedBitmap.getWidth(),
+ userBadgedBitmap.getHeight(), userBadgedBitmap.getConfig());
+ Canvas c = new Canvas(badgeAndRing);
+
+ Paint ringPaint = new Paint();
+ ringPaint.setStyle(Paint.Style.FILL);
+ ringPaint.setColor(importantConversationColor);
+ ringPaint.setAntiAlias(true);
+ c.drawCircle(c.getWidth() / 2, c.getHeight() / 2, c.getWidth() / 2, ringPaint);
+
+ final int bitmapTop = (int) ringStrokeWidth;
+ final int bitmapLeft = (int) ringStrokeWidth;
+ final int bitmapWidth = c.getWidth() - 2 * (int) ringStrokeWidth;
+ final int bitmapHeight = c.getHeight() - 2 * (int) ringStrokeWidth;
+
+ Bitmap scaledBitmap = Bitmap.createScaledBitmap(userBadgedBitmap, bitmapWidth,
+ bitmapHeight, /* filter */ true);
+ c.drawBitmap(scaledBitmap, bitmapTop, bitmapLeft, /* paint */null);
+
+ shadowGenerator.recreateIcon(Bitmap.createBitmap(badgeAndRing), c);
+ return createIconBitmap(badgeAndRing);
+ } else {
+ Canvas c = new Canvas();
+ c.setBitmap(userBadgedBitmap);
+ shadowGenerator.recreateIcon(Bitmap.createBitmap(userBadgedBitmap), c);
+ return createIconBitmap(userBadgedBitmap);
+ }
+ }
+
+ private Bitmap getCircleBitmap(AdaptiveIconDrawable icon, int size) {
+ Drawable foreground = icon.getForeground();
+ Drawable background = icon.getBackground();
+ Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas();
+ canvas.setBitmap(bitmap);
+
+ // Clip canvas to circle.
+ Path circlePath = new Path();
+ circlePath.addCircle(/* x */ size / 2f,
+ /* y */ size / 2f,
+ /* radius */ size / 2f,
+ Path.Direction.CW);
+ canvas.clipPath(circlePath);
+
+ // Draw background.
+ background.setBounds(0, 0, size, size);
+ background.draw(canvas);
+
+ // Draw foreground. The foreground and background drawables are derived from adaptive icons
+ // Some icon shapes fill more space than others, so adaptive icons are normalized to about
+ // the same size. This size is smaller than the original bounds, so we estimate
+ // the difference in this offset.
+ int offset = size / 5;
+ foreground.setBounds(-offset, -offset, size + offset, size + offset);
+ foreground.draw(canvas);
+
+ canvas.setBitmap(null);
+ return bitmap;
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index 2d1d7cd..22bec3d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -151,6 +151,7 @@
private BubbleData mBubbleData;
@Nullable private BubbleStackView mStackView;
private BubbleIconFactory mBubbleIconFactory;
+ private BubbleBadgeIconFactory mBubbleBadgeIconFactory;
private BubblePositioner mBubblePositioner;
private Bubbles.SysuiProxy mSysuiProxy;
@@ -278,6 +279,7 @@
mBubbleData = data;
mSavedBubbleKeysPerUser = new SparseSetArray<>();
mBubbleIconFactory = new BubbleIconFactory(context);
+ mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(context);
mDisplayController = displayController;
mTaskViewTransitions = taskViewTransitions;
mOneHandedOptional = oneHandedOptional;
@@ -500,6 +502,7 @@
}
mStackView.updateStackPosition();
mBubbleIconFactory = new BubbleIconFactory(mContext);
+ mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
mStackView.onDisplaySizeChanged();
}
if (b.getBoolean(EXTRA_BUBBLE_OVERFLOW_OPENED, false)) {
@@ -778,13 +781,17 @@
mStackView.onThemeChanged();
}
mBubbleIconFactory = new BubbleIconFactory(mContext);
+ mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
+
// Reload each bubble
- for (Bubble b: mBubbleData.getBubbles()) {
+ for (Bubble b : mBubbleData.getBubbles()) {
b.inflate(null /* callback */, mContext, this, mStackView, mBubbleIconFactory,
+ mBubbleBadgeIconFactory,
false /* skipInflation */);
}
- for (Bubble b: mBubbleData.getOverflowBubbles()) {
+ for (Bubble b : mBubbleData.getOverflowBubbles()) {
b.inflate(null /* callback */, mContext, this, mStackView, mBubbleIconFactory,
+ mBubbleBadgeIconFactory,
false /* skipInflation */);
}
}
@@ -800,6 +807,7 @@
mScreenBounds.set(newConfig.windowConfiguration.getBounds());
mBubbleData.onMaxBubblesChanged();
mBubbleIconFactory = new BubbleIconFactory(mContext);
+ mBubbleBadgeIconFactory = new BubbleBadgeIconFactory(mContext);
mStackView.onDisplaySizeChanged();
}
if (newConfig.fontScale != mFontScale) {
@@ -961,7 +969,8 @@
}
bubble.inflate(
(b) -> mBubbleData.overflowBubble(Bubbles.DISMISS_RELOAD_FROM_DISK, bubble),
- mContext, this, mStackView, mBubbleIconFactory, true /* skipInflation */);
+ mContext, this, mStackView, mBubbleIconFactory, mBubbleBadgeIconFactory,
+ true /* skipInflation */);
});
return null;
});
@@ -996,7 +1005,8 @@
ensureStackViewCreated();
bubble.setInflateSynchronously(mInflateSynchronously);
bubble.inflate(b -> mBubbleData.notificationEntryUpdated(b, suppressFlyout, showInShade),
- mContext, this, mStackView, mBubbleIconFactory, false /* skipInflation */);
+ mContext, this, mStackView, mBubbleIconFactory, mBubbleBadgeIconFactory,
+ false /* skipInflation */);
}
/**
@@ -1319,6 +1329,7 @@
* Updates the visibility of the bubbles based on current state.
* Does not un-bubble, just hides or un-hides.
* Updates stack description for TalkBack focus.
+ * Updates bubbles' icon views clickable states
*/
public void updateStack() {
if (mStackView == null) {
@@ -1336,6 +1347,8 @@
}
mStackView.updateContentDescription();
+
+ mStackView.updateBubblesClickableStates();
}
@VisibleForTesting
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
index 9374da4..f878a46 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java
@@ -231,8 +231,9 @@
* Fade animation for consecutive flyouts.
*/
void animateUpdate(Bubble.FlyoutMessage flyoutMessage, PointF stackPos,
- boolean hideDot, Runnable onHide) {
+ boolean hideDot, float[] dotCenter, Runnable onHide) {
mOnHide = onHide;
+ mDotCenter = dotCenter;
final Runnable afterFadeOut = () -> {
updateFlyoutMessage(flyoutMessage);
// Wait for TextViews to layout with updated height.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
index b0e029f..9d3bf34 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleIconFactory.java
@@ -21,19 +21,12 @@
import android.content.Intent;
import android.content.pm.LauncherApps;
import android.content.pm.ShortcutInfo;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.icons.BaseIconFactory;
-import com.android.launcher3.icons.BitmapInfo;
-import com.android.launcher3.icons.ShadowGenerator;
import com.android.wm.shell.R;
/**
@@ -44,12 +37,9 @@
@VisibleForTesting
public class BubbleIconFactory extends BaseIconFactory {
- private int mBadgeSize;
-
public BubbleIconFactory(Context context) {
super(context, context.getResources().getConfiguration().densityDpi,
context.getResources().getDimensionPixelSize(R.dimen.bubble_size));
- mBadgeSize = mContext.getResources().getDimensionPixelSize(R.dimen.bubble_badge_size);
}
/**
@@ -75,84 +65,4 @@
return null;
}
}
-
- /**
- * Returns a {@link BitmapInfo} for the app-badge that is shown on top of each bubble. This
- * will include the workprofile indicator on the badge if appropriate.
- */
- BitmapInfo getBadgeBitmap(Drawable userBadgedAppIcon, boolean isImportantConversation) {
- ShadowGenerator shadowGenerator = new ShadowGenerator(mBadgeSize);
- Bitmap userBadgedBitmap = createIconBitmap(userBadgedAppIcon, 1f, mBadgeSize);
-
- if (userBadgedAppIcon instanceof AdaptiveIconDrawable) {
- userBadgedBitmap = Bitmap.createScaledBitmap(
- getCircleBitmap((AdaptiveIconDrawable) userBadgedAppIcon, /* size */
- userBadgedAppIcon.getIntrinsicWidth()),
- mBadgeSize, mBadgeSize, /* filter */ true);
- }
-
- if (isImportantConversation) {
- final float ringStrokeWidth = mContext.getResources().getDimensionPixelSize(
- com.android.internal.R.dimen.importance_ring_stroke_width);
- final int importantConversationColor = mContext.getResources().getColor(
- R.color.important_conversation, null);
- Bitmap badgeAndRing = Bitmap.createBitmap(userBadgedBitmap.getWidth(),
- userBadgedBitmap.getHeight(), userBadgedBitmap.getConfig());
- Canvas c = new Canvas(badgeAndRing);
-
- Paint ringPaint = new Paint();
- ringPaint.setStyle(Paint.Style.FILL);
- ringPaint.setColor(importantConversationColor);
- ringPaint.setAntiAlias(true);
- c.drawCircle(c.getWidth() / 2, c.getHeight() / 2, c.getWidth() / 2, ringPaint);
-
- final int bitmapTop = (int) ringStrokeWidth;
- final int bitmapLeft = (int) ringStrokeWidth;
- final int bitmapWidth = c.getWidth() - 2 * (int) ringStrokeWidth;
- final int bitmapHeight = c.getHeight() - 2 * (int) ringStrokeWidth;
-
- Bitmap scaledBitmap = Bitmap.createScaledBitmap(userBadgedBitmap, bitmapWidth,
- bitmapHeight, /* filter */ true);
- c.drawBitmap(scaledBitmap, bitmapTop, bitmapLeft, /* paint */null);
-
- shadowGenerator.recreateIcon(Bitmap.createBitmap(badgeAndRing), c);
- return createIconBitmap(badgeAndRing);
- } else {
- Canvas c = new Canvas();
- c.setBitmap(userBadgedBitmap);
- shadowGenerator.recreateIcon(Bitmap.createBitmap(userBadgedBitmap), c);
- return createIconBitmap(userBadgedBitmap);
- }
- }
-
- public Bitmap getCircleBitmap(AdaptiveIconDrawable icon, int size) {
- Drawable foreground = icon.getForeground();
- Drawable background = icon.getBackground();
- Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas();
- canvas.setBitmap(bitmap);
-
- // Clip canvas to circle.
- Path circlePath = new Path();
- circlePath.addCircle(/* x */ size / 2f,
- /* y */ size / 2f,
- /* radius */ size / 2f,
- Path.Direction.CW);
- canvas.clipPath(circlePath);
-
- // Draw background.
- background.setBounds(0, 0, size, size);
- background.draw(canvas);
-
- // Draw foreground. The foreground and background drawables are derived from adaptive icons
- // Some icon shapes fill more space than others, so adaptive icons are normalized to about
- // the same size. This size is smaller than the original bounds, so we estimate
- // the difference in this offset.
- int offset = size / 5;
- foreground.setBounds(-offset, -offset, size + offset, size + offset);
- foreground.draw(canvas);
-
- canvas.setBitmap(null);
- return bitmap;
- }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index f8d82c2..d5d8b71 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -1485,6 +1485,25 @@
}
}
+ /**
+ * Update bubbles' icon views clickable states.
+ */
+ public void updateBubblesClickableStates() {
+ for (int i = 0; i < mBubbleData.getBubbles().size(); i++) {
+ final Bubble bubble = mBubbleData.getBubbles().get(i);
+ if (bubble.getIconView() != null) {
+ if (mIsExpanded) {
+ // when stack is expanded all bubbles are clickable
+ bubble.getIconView().setClickable(true);
+ } else {
+ // when stack is collapsed, only the top bubble needs to be clickable,
+ // so that a11y ignores all the inaccessible bubbles in the stack
+ bubble.getIconView().setClickable(i == 0);
+ }
+ }
+ }
+ }
+
private void updateSystemGestureExcludeRects() {
// Exclude the region occupied by the first BubbleView in the stack
Rect excludeZone = mSystemGestureExclusionRects.get(0);
@@ -2497,6 +2516,7 @@
if (mFlyout.getVisibility() == View.VISIBLE) {
mFlyout.animateUpdate(bubble.getFlyoutMessage(),
mStackAnimationController.getStackPosition(), !bubble.showDot(),
+ bubble.getIconView().getDotCenter(),
mAfterFlyoutHidden /* onHide */);
} else {
mFlyout.setVisibility(INVISIBLE);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
index b01c756..69762c9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java
@@ -71,6 +71,7 @@
private WeakReference<BubbleController> mController;
private WeakReference<BubbleStackView> mStackView;
private BubbleIconFactory mIconFactory;
+ private BubbleBadgeIconFactory mBadgeIconFactory;
private boolean mSkipInflation;
private Callback mCallback;
private Executor mMainExecutor;
@@ -84,6 +85,7 @@
BubbleController controller,
BubbleStackView stackView,
BubbleIconFactory factory,
+ BubbleBadgeIconFactory badgeFactory,
boolean skipInflation,
Callback c,
Executor mainExecutor) {
@@ -92,6 +94,7 @@
mController = new WeakReference<>(controller);
mStackView = new WeakReference<>(stackView);
mIconFactory = factory;
+ mBadgeIconFactory = badgeFactory;
mSkipInflation = skipInflation;
mCallback = c;
mMainExecutor = mainExecutor;
@@ -100,7 +103,7 @@
@Override
protected BubbleViewInfo doInBackground(Void... voids) {
return BubbleViewInfo.populate(mContext.get(), mController.get(), mStackView.get(),
- mIconFactory, mBubble, mSkipInflation);
+ mIconFactory, mBadgeIconFactory, mBubble, mSkipInflation);
}
@Override
@@ -135,7 +138,8 @@
@VisibleForTesting
@Nullable
public static BubbleViewInfo populate(Context c, BubbleController controller,
- BubbleStackView stackView, BubbleIconFactory iconFactory, Bubble b,
+ BubbleStackView stackView, BubbleIconFactory iconFactory,
+ BubbleBadgeIconFactory badgeIconFactory, Bubble b,
boolean skipInflation) {
BubbleViewInfo info = new BubbleViewInfo();
@@ -187,11 +191,11 @@
bubbleDrawable = appIcon;
}
- BitmapInfo badgeBitmapInfo = iconFactory.getBadgeBitmap(badgedIcon,
+ BitmapInfo badgeBitmapInfo = badgeIconFactory.getBadgeBitmap(badgedIcon,
b.isImportantConversation());
info.badgeBitmap = badgeBitmapInfo.icon;
// Raw badge bitmap never includes the important conversation ring
- info.mRawBadgeBitmap = iconFactory.getBadgeBitmap(badgedIcon, false).icon;
+ info.mRawBadgeBitmap = badgeIconFactory.getBadgeBitmap(badgedIcon, false).icon;
info.bubbleBitmap = iconFactory.createBadgedIconBitmap(bubbleDrawable).icon;
// Dot color & placement
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java
index ad9ebb2..36e55ba 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java
@@ -137,14 +137,16 @@
return;
}
- if (mIcon == null) {
- // TODO: add fade-in animation.
+ if (mBackgroundLeash == null) {
mBackgroundLeash = SurfaceUtils.makeColorLayer(mHostLeash,
RESIZING_BACKGROUND_SURFACE_NAME, mSurfaceSession);
t.setColor(mBackgroundLeash, getResizingBackgroundColor(resizingTask))
.setLayer(mBackgroundLeash, SPLIT_DIVIDER_LAYER - 1)
.show(mBackgroundLeash);
+ }
+ if (mIcon == null && resizingTask.topActivityInfo != null) {
+ // TODO: add fade-in animation.
mIcon = mIconProvider.getIcon(resizingTask.topActivityInfo);
mResizingIconView.setImageDrawable(mIcon);
mResizingIconView.setVisibility(View.VISIBLE);
@@ -168,12 +170,16 @@
return;
}
+ if (mBackgroundLeash != null) {
+ t.remove(mBackgroundLeash);
+ mBackgroundLeash = null;
+ }
+
if (mIcon != null) {
mResizingIconView.setVisibility(View.GONE);
mResizingIconView.setImageDrawable(null);
- t.remove(mBackgroundLeash).hide(mIconLeash);
+ t.hide(mIconLeash);
mIcon = null;
- mBackgroundLeash = null;
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
index d08e14e..1716380 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java
@@ -173,14 +173,25 @@
return true;
}
+ // The previous PIP Task is no longer in PIP, but this is not an exit transition (This can
+ // happen when a new activity requests enter PIP). In this case, we just show this Task in
+ // its end state, and play other animation as normal.
+ final TransitionInfo.Change currentPipChange = findCurrentPipChange(info);
+ if (currentPipChange != null
+ && currentPipChange.getTaskInfo().getWindowingMode() != WINDOWING_MODE_PINNED) {
+ resetPrevPip(currentPipChange, startTransaction);
+ }
+
// Entering PIP.
if (isEnteringPip(info, mCurrentPipTaskToken)) {
return startEnterAnimation(info, startTransaction, finishTransaction, finishCallback);
}
- // For transition that we don't animate, we may need to update the PIP surface, otherwise it
- // will be reset after the transition.
- updatePipForUnhandledTransition(info, startTransaction, finishTransaction);
+ // For transition that we don't animate, but contains the PIP leash, we need to update the
+ // PIP surface, otherwise it will be reset after the transition.
+ if (currentPipChange != null) {
+ updatePipForUnhandledTransition(currentPipChange, startTransaction, finishTransaction);
+ }
return false;
}
@@ -571,30 +582,36 @@
finishCallback.onTransitionFinished(null, null);
}
- private void updatePipForUnhandledTransition(@NonNull TransitionInfo info,
+ private void resetPrevPip(@NonNull TransitionInfo.Change prevPipChange,
+ @NonNull SurfaceControl.Transaction startTransaction) {
+ final SurfaceControl leash = prevPipChange.getLeash();
+ final Rect bounds = prevPipChange.getEndAbsBounds();
+ final Point offset = prevPipChange.getEndRelOffset();
+ bounds.offset(-offset.x, -offset.y);
+
+ startTransaction.setWindowCrop(leash, null);
+ startTransaction.setMatrix(leash, 1, 0, 0, 1);
+ startTransaction.setCornerRadius(leash, 0);
+ startTransaction.setPosition(leash, bounds.left, bounds.top);
+
+ mCurrentPipTaskToken = null;
+ mPipOrganizer.onExitPipFinished(prevPipChange.getTaskInfo());
+ }
+
+ private void updatePipForUnhandledTransition(@NonNull TransitionInfo.Change pipChange,
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction) {
- if (mCurrentPipTaskToken == null) {
- return;
- }
- for (int i = info.getChanges().size() - 1; i >= 0; --i) {
- final TransitionInfo.Change change = info.getChanges().get(i);
- if (!mCurrentPipTaskToken.equals(change.getContainer())) {
- continue;
- }
- // When the PIP window is visible and being a part of the transition, such as display
- // rotation, we need to update its bounds and rounded corner.
- final SurfaceControl leash = change.getLeash();
- final Rect destBounds = mPipBoundsState.getBounds();
- final boolean isInPip = mPipTransitionState.isInPip();
- mSurfaceTransactionHelper
- .crop(startTransaction, leash, destBounds)
- .round(startTransaction, leash, isInPip);
- mSurfaceTransactionHelper
- .crop(finishTransaction, leash, destBounds)
- .round(finishTransaction, leash, isInPip);
- break;
- }
+ // When the PIP window is visible and being a part of the transition, such as display
+ // rotation, we need to update its bounds and rounded corner.
+ final SurfaceControl leash = pipChange.getLeash();
+ final Rect destBounds = mPipBoundsState.getBounds();
+ final boolean isInPip = mPipTransitionState.isInPip();
+ mSurfaceTransactionHelper
+ .crop(startTransaction, leash, destBounds)
+ .round(startTransaction, leash, isInPip);
+ mSurfaceTransactionHelper
+ .crop(finishTransaction, leash, destBounds)
+ .round(finishTransaction, leash, isInPip);
}
private void finishResizeForMenu(Rect destinationBounds) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java
index 92a3598..915c593 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java
@@ -140,6 +140,7 @@
});
mMagnetizedPip = mMotionHelper.getMagnetizedPip();
+ mMagnetizedPip.clearAllTargets();
mMagneticTarget = mMagnetizedPip.addTarget(mTargetView, 0);
updateMagneticTargetSize();
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
index 6c9fed9..9a22007 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipTransition.kt
@@ -22,6 +22,7 @@
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.LAUNCHER_COMPONENT
import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.helpers.setRotation
import org.junit.Test
@@ -51,11 +52,28 @@
@Presubmit
@Test
open fun pipWindowBecomesInvisible() {
- testSpec.assertWm {
- this.invoke("hasPipWindow") {
- it.isPinned(pipApp.component).isAppWindowVisible(pipApp.component)
- }.then().invoke("!hasPipWindow") {
- it.isNotPinned(pipApp.component).isAppWindowInvisible(pipApp.component)
+ if (isShellTransitionsEnabled) {
+ // When Shell transition is enabled, we change the windowing mode at start, but
+ // update the visibility after the transition is finished, so we can't check isNotPinned
+ // and isAppWindowInvisible in the same assertion block.
+ testSpec.assertWm {
+ this.invoke("hasPipWindow") {
+ it.isPinned(pipApp.component)
+ .isAppWindowVisible(pipApp.component)
+ .isAppWindowOnTop(pipApp.component)
+ }.then().invoke("!hasPipWindow") {
+ it.isNotPinned(pipApp.component)
+ .isAppWindowNotOnTop(pipApp.component)
+ }
+ }
+ testSpec.assertWmEnd { isAppWindowInvisible(pipApp.component) }
+ } else {
+ testSpec.assertWm {
+ this.invoke("hasPipWindow") {
+ it.isPinned(pipApp.component).isAppWindowVisible(pipApp.component)
+ }.then().invoke("!hasPipWindow") {
+ it.isNotPinned(pipApp.component).isAppWindowInvisible(pipApp.component)
+ }
}
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
index c75076d..8adebb8 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipWithDismissButtonTest.kt
@@ -24,10 +24,7 @@
import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.annotation.Group3
import com.android.server.wm.flicker.dsl.FlickerBuilder
-import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
import com.android.server.wm.flicker.rules.WMFlickerServiceRuleForTestSpec
-import org.junit.Assume.assumeFalse
-import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Rule
import org.junit.Test
@@ -88,20 +85,10 @@
flickerRule.checkFlakyAssertions()
}
- @Before
- fun onBefore() {
- // This CUJ don't work in shell transitions because of b/204570898 b/204562589
- assumeFalse(isShellTransitionsEnabled)
- }
-
/** {@inheritDoc} */
@FlakyTest(bugId = 206753786)
@Test
- override fun statusBarLayerRotatesScales() {
- // This test doesn't work in shell transitions because of b/206753786
- assumeFalse(isShellTransitionsEnabled)
- super.statusBarLayerRotatesScales()
- }
+ override fun statusBarLayerRotatesScales() = super.statusBarLayerRotatesScales()
companion object {
/**
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
index 52177c2..ef9ff4f 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExpandPipOnDoubleClickTest.kt
@@ -26,9 +26,6 @@
import com.android.server.wm.flicker.LAUNCHER_COMPONENT
import com.android.server.wm.flicker.annotation.Group3
import com.android.server.wm.flicker.dsl.FlickerBuilder
-import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled
-import org.junit.Assume.assumeFalse
-import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -65,12 +62,6 @@
}
}
- @Before
- fun onBefore() {
- // This CUJ don't work in shell transitions because of b/204570898 b/204562589
- assumeFalse(isShellTransitionsEnabled)
- }
-
/**
* Checks that the pip app window remains inside the display bounds throughout the whole
* animation
diff --git a/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/AndroidManifest.xml b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/AndroidManifest.xml
index 2cdbffa..f40aa66 100644
--- a/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/AndroidManifest.xml
+++ b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/AndroidManifest.xml
@@ -25,6 +25,7 @@
android:resizeableActivity="true"
android:supportsPictureInPicture="true"
android:launchMode="singleTop"
+ android:theme="@style/CutoutShortEdges"
android:label="FixedApp"
android:exported="true">
<intent-filter>
@@ -37,6 +38,7 @@
android:supportsPictureInPicture="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:taskAffinity="com.android.wm.shell.flicker.testapp.PipActivity"
+ android:theme="@style/CutoutShortEdges"
android:launchMode="singleTop"
android:label="PipApp"
android:exported="true">
@@ -52,6 +54,7 @@
<activity android:name=".ImeActivity"
android:taskAffinity="com.android.wm.shell.flicker.testapp.ImeActivity"
+ android:theme="@style/CutoutShortEdges"
android:label="ImeApp"
android:launchMode="singleTop"
android:exported="true">
@@ -68,6 +71,7 @@
<activity android:name=".SplitScreenActivity"
android:resizeableActivity="true"
android:taskAffinity="com.android.wm.shell.flicker.testapp.SplitScreenActivity"
+ android:theme="@style/CutoutShortEdges"
android:label="SplitScreenPrimaryApp"
android:exported="true">
<intent-filter>
@@ -79,6 +83,7 @@
<activity android:name=".SplitScreenSecondaryActivity"
android:resizeableActivity="true"
android:taskAffinity="com.android.wm.shell.flicker.testapp.SplitScreenSecondaryActivity"
+ android:theme="@style/CutoutShortEdges"
android:label="SplitScreenSecondaryApp"
android:exported="true">
<intent-filter>
@@ -90,6 +95,7 @@
<activity android:name=".NonResizeableActivity"
android:resizeableActivity="false"
android:taskAffinity="com.android.wm.shell.flicker.testapp.NonResizeableActivity"
+ android:theme="@style/CutoutShortEdges"
android:label="NonResizeableApp"
android:exported="true">
<intent-filter>
@@ -100,6 +106,7 @@
<activity android:name=".SimpleActivity"
android:taskAffinity="com.android.wm.shell.flicker.testapp.SimpleActivity"
+ android:theme="@style/CutoutShortEdges"
android:label="SimpleApp"
android:exported="true">
<intent-filter>
@@ -111,6 +118,7 @@
android:name=".LaunchBubbleActivity"
android:label="LaunchBubbleApp"
android:exported="true"
+ android:theme="@style/CutoutShortEdges"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -121,6 +129,7 @@
android:name=".BubbleActivity"
android:label="BubbleApp"
android:exported="false"
+ android:theme="@style/CutoutShortEdges"
android:resizeableActivity="true" />
</application>
</manifest>
diff --git a/packages/SystemUI/res-keyguard/values-sw720dp/bools.xml b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/values/styles.xml
similarity index 60%
rename from packages/SystemUI/res-keyguard/values-sw720dp/bools.xml
rename to libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/values/styles.xml
index 54bb1fc..87a61a8 100644
--- a/packages/SystemUI/res-keyguard/values-sw720dp/bools.xml
+++ b/libs/WindowManager/Shell/tests/flicker/test-apps/flickerapp/res/values/styles.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2021 The Android Open Source Project
+ ~ Copyright (C) 2022 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.
@@ -16,11 +16,15 @@
-->
<resources>
- <!-- Allows PIN/Pattern to be drawn on one side of a display, and for the user to
- switch sides -->
- <bool name="can_use_one_handed_bouncer">false</bool>
+ <style name="CutoutDefault">
+ <item name="android:windowLayoutInDisplayCutoutMode">default</item>
+ </style>
- <!-- Will display the bouncer on one side of the display, and the current user icon and
- user switcher on the other side -->
- <bool name="bouncer_display_user_switcher">true</bool>
-</resources>
+ <style name="CutoutShortEdges">
+ <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
+ </style>
+
+ <style name="CutoutNever">
+ <item name="android:windowLayoutInDisplayCutoutMode">never</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index a2d0103..dc31bdd 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -35,7 +35,6 @@
"skia_deps",
//"hwui_bugreport_font_cache_usage",
//"hwui_compile_for_perf",
- "hwui_pgo",
"hwui_lto",
],
@@ -159,22 +158,6 @@
],
}
-// Build libhwui with PGO by default.
-// Location of PGO profile data is defined in build/soong/cc/pgo.go
-// and is separate from hwui.
-// To turn it off, set ANDROID_PGO_NO_PROFILE_USE environment variable
-// or set enable_profile_use property to false.
-cc_defaults {
- name: "hwui_pgo",
-
- pgo: {
- instrumentation: true,
- profile_file: "hwui/hwui.profdata",
- benchmarks: ["hwui"],
- enable_profile_use: true,
- },
-}
-
// Build hwui library with ThinLTO by default.
cc_defaults {
name: "hwui_lto",
@@ -631,6 +614,7 @@
version_script: "libhwui.map.txt",
},
},
+ afdo: true,
}
cc_library_static {
@@ -764,15 +748,3 @@
"tests/microbench/RenderNodeBench.cpp",
],
}
-
-// ----------------------------------------
-// Phony target to build benchmarks for PGO
-// ----------------------------------------
-
-phony {
- name: "pgo-targets-hwui",
- required: [
- "hwuimicro",
- "hwuimacro",
- ],
-}
diff --git a/location/java/android/location/provider/LocationProviderBase.java b/location/java/android/location/provider/LocationProviderBase.java
index 88a2479..529eddd 100644
--- a/location/java/android/location/provider/LocationProviderBase.java
+++ b/location/java/android/location/provider/LocationProviderBase.java
@@ -26,7 +26,9 @@
import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
@@ -308,9 +310,7 @@
synchronized (mBinder) {
try {
manager.onInitialize(mAllowed, mProperties, mAttributionTag);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (RuntimeException e) {
+ } catch (RemoteException | RuntimeException e) {
Log.w(mTag, e);
}
@@ -320,12 +320,28 @@
@Override
public void setRequest(ProviderRequest request) {
- onSetRequest(request);
+ try {
+ onSetRequest(request);
+ } catch (RuntimeException e) {
+ // exceptions on one-way binder threads are dropped - move to a different thread
+ Log.w(mTag, e);
+ new Handler(Looper.getMainLooper()).post(() -> {
+ throw new AssertionError(e);
+ });
+ }
}
@Override
public void flush() {
- onFlush(this::onFlushComplete);
+ try {
+ onFlush(this::onFlushComplete);
+ } catch (RuntimeException e) {
+ // exceptions on one-way binder threads are dropped - move to a different thread
+ Log.w(mTag, e);
+ new Handler(Looper.getMainLooper()).post(() -> {
+ throw new AssertionError(e);
+ });
+ }
}
private void onFlushComplete() {
@@ -333,9 +349,7 @@
if (manager != null) {
try {
manager.onFlushComplete();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (RuntimeException e) {
+ } catch (RemoteException | RuntimeException e) {
Log.w(mTag, e);
}
}
@@ -343,7 +357,15 @@
@Override
public void sendExtraCommand(String command, Bundle extras) {
- onSendExtraCommand(command, extras);
+ try {
+ onSendExtraCommand(command, extras);
+ } catch (RuntimeException e) {
+ // exceptions on one-way binder threads are dropped - move to a different thread
+ Log.w(mTag, e);
+ new Handler(Looper.getMainLooper()).post(() -> {
+ throw new AssertionError(e);
+ });
+ }
}
}
}
diff --git a/media/OWNERS b/media/OWNERS
index 0aff43e..5f50137 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -3,7 +3,6 @@
essick@google.com
etalvala@google.com
hdmoon@google.com
-hkuang@google.com
hunga@google.com
insun@google.com
jaewan@google.com
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index d2c49e0..af5a3da 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -1357,7 +1357,7 @@
return DEVICE_OUT_BLE_SPEAKER_NAME;
case DEVICE_OUT_DEFAULT:
default:
- return Integer.toString(device);
+ return "0x" + Integer.toHexString(device);
}
}
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index bd5a343..3a40d6f 100755
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -592,6 +592,24 @@
});
}
+ /** @hide */
+ public void notifyTuned(@NonNull Uri channelUri) {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
+ @Override
+ public void run() {
+ try {
+ if (DEBUG) Log.d(TAG, "notifyTuned");
+ if (mSessionCallback != null) {
+ mSessionCallback.onTuned(channelUri);
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "error in notifyTuned", e);
+ }
+ }
+ });
+ }
+
/**
* Sends the list of all audio/video/subtitle tracks. The is used by the framework to
* maintain the track information for a given session, which in turn is used by
diff --git a/media/java/android/media/tv/interactive/TvIAppInfo.java b/media/java/android/media/tv/interactive/TvIAppInfo.java
index 79d94cc..b5245fc 100644
--- a/media/java/android/media/tv/interactive/TvIAppInfo.java
+++ b/media/java/android/media/tv/interactive/TvIAppInfo.java
@@ -127,6 +127,7 @@
/**
* Gets supported interactive app types
*/
+ @NonNull
public List<String> getSupportedTypes() {
return new ArrayList<>(mTypes);
}
diff --git a/media/java/android/media/tv/interactive/TvIAppService.java b/media/java/android/media/tv/interactive/TvIAppService.java
index 1480ff64..0456041 100644
--- a/media/java/android/media/tv/interactive/TvIAppService.java
+++ b/media/java/android/media/tv/interactive/TvIAppService.java
@@ -113,6 +113,19 @@
public static final String IAPP_SERVICE_COMMAND_TYPE_SET_STREAM_VOLUME = "set_stream_volume";
/** @hide */
public static final String IAPP_SERVICE_COMMAND_TYPE_SELECT_TRACK = "select_track";
+ /** @hide */
+ public static final String COMMAND_PARAMETER_KEY_CHANNEL_URI = "command_channel_uri";
+ /** @hide */
+ public static final String COMMAND_PARAMETER_KEY_INPUT_ID = "command_input_id";
+ /** @hide */
+ public static final String COMMAND_PARAMETER_KEY_VOLUME = "command_volume";
+ /** @hide */
+ public static final String COMMAND_PARAMETER_KEY_TRACK_TYPE = "command_track_type";
+ /** @hide */
+ public static final String COMMAND_PARAMETER_KEY_TRACK_ID = "command_track_id";
+ /** @hide */
+ public static final String COMMAND_PARAMETER_KEY_TRACK_SELECT_MODE =
+ "command_track_select_mode";
private final Handler mServiceHandler = new ServiceHandler();
private final RemoteCallbackList<ITvIAppServiceCallback> mCallbacks =
diff --git a/media/java/android/media/tv/interactive/TvIAppView.java b/media/java/android/media/tv/interactive/TvIAppView.java
index 1ce14ae..b295055 100644
--- a/media/java/android/media/tv/interactive/TvIAppView.java
+++ b/media/java/android/media/tv/interactive/TvIAppView.java
@@ -27,6 +27,7 @@
import android.media.tv.TvTrackInfo;
import android.media.tv.TvView;
import android.media.tv.interactive.TvIAppManager.Session;
+import android.media.tv.interactive.TvIAppManager.Session.FinishedInputEventCallback;
import android.media.tv.interactive.TvIAppManager.SessionCallback;
import android.net.Uri;
import android.os.Bundle;
@@ -34,11 +35,14 @@
import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
+import android.view.InputEvent;
+import android.view.KeyEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewRootImpl;
import java.util.List;
@@ -80,6 +84,7 @@
private final AttributeSet mAttrs;
private final int mDefStyleAttr;
private final XmlResourceParser mParser;
+ private OnUnhandledInputEventListener mOnUnhandledInputEventListener;
private final SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {
@Override
@@ -272,6 +277,77 @@
mSession.dispatchSurfaceChanged(format, width, height);
}
+ private final FinishedInputEventCallback mFinishedInputEventCallback =
+ new FinishedInputEventCallback() {
+ @Override
+ public void onFinishedInputEvent(Object token, boolean handled) {
+ if (DEBUG) {
+ Log.d(TAG, "onFinishedInputEvent(token=" + token + ", handled="
+ + handled + ")");
+ }
+ if (handled) {
+ return;
+ }
+ // TODO: Re-order unhandled events.
+ InputEvent event = (InputEvent) token;
+ if (dispatchUnhandledInputEvent(event)) {
+ return;
+ }
+ ViewRootImpl viewRootImpl = getViewRootImpl();
+ if (viewRootImpl != null) {
+ viewRootImpl.dispatchUnhandledInputEvent(event);
+ }
+ }
+ };
+
+ /**
+ * Dispatches an unhandled input event to the next receiver.
+ */
+ public boolean dispatchUnhandledInputEvent(@NonNull InputEvent event) {
+ if (mOnUnhandledInputEventListener != null) {
+ if (mOnUnhandledInputEventListener.onUnhandledInputEvent(event)) {
+ return true;
+ }
+ }
+ return onUnhandledInputEvent(event);
+ }
+
+ /**
+ * Called when an unhandled input event also has not been handled by the user provided
+ * callback. This is the last chance to handle the unhandled input event in the TvIAppView.
+ *
+ * @param event The input event.
+ * @return If you handled the event, return {@code true}. If you want to allow the event to be
+ * handled by the next receiver, return {@code false}.
+ */
+ public boolean onUnhandledInputEvent(@NonNull InputEvent event) {
+ return false;
+ }
+
+ /**
+ * Registers a callback to be invoked when an input event is not handled
+ * by the TV Interactive App.
+ *
+ * @param listener The callback to be invoked when the unhandled input event is received.
+ */
+ public void setOnUnhandledInputEventListener(@NonNull OnUnhandledInputEventListener listener) {
+ mOnUnhandledInputEventListener = listener;
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
+ if (super.dispatchKeyEvent(event)) {
+ return true;
+ }
+ if (mSession == null) {
+ return false;
+ }
+ InputEvent copiedEvent = event.copy();
+ int ret = mSession.dispatchInputEvent(copiedEvent, copiedEvent, mFinishedInputEventCallback,
+ mHandler);
+ return ret != Session.DISPATCH_NOT_HANDLED;
+ }
+
/**
* Prepares the interactive application.
*/
@@ -514,6 +590,24 @@
*/
public void onRequestTrackInfoList(@NonNull String iAppServiceId) {
}
+
+ }
+
+ /**
+ * Interface definition for a callback to be invoked when the unhandled input event is received.
+ */
+ public interface OnUnhandledInputEventListener {
+ /**
+ * Called when an input event was not handled by the TV Interactive App.
+ *
+ * <p>This is called asynchronously from where the event is dispatched. It gives the host
+ * application a chance to handle the unhandled input events.
+ *
+ * @param event The input event.
+ * @return If you handled the event, return {@code true}. If you want to allow the event to
+ * be handled by the next receiver, return {@code false}.
+ */
+ boolean onUnhandledInputEvent(@NonNull InputEvent event);
}
private class MySessionCallback extends SessionCallback {
diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java
index f9fc17f..9f44236 100644
--- a/media/java/android/media/tv/tuner/filter/Filter.java
+++ b/media/java/android/media/tv/tuner/filter/Filter.java
@@ -283,9 +283,21 @@
synchronized (mCallbackLock) {
if (mCallback != null) {
mCallback.onFilterEvent(this, events);
+ } else {
+ for (FilterEvent event : events) {
+ if (event instanceof MediaEvent) {
+ ((MediaEvent)event).release();
+ }
+ }
}
}
});
+ } else {
+ for (FilterEvent event : events) {
+ if (event instanceof MediaEvent) {
+ ((MediaEvent)event).release();
+ }
+ }
}
}
}
@@ -558,6 +570,8 @@
if (res != Tuner.RESULT_SUCCESS) {
TunerUtils.throwExceptionForResult(res, "Failed to close filter.");
} else {
+ mCallback = null;
+ mExecutor = null;
mIsStarted = false;
mIsClosed = true;
}
@@ -612,8 +626,12 @@
* be a no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*
* @param delayInMs specifies the duration of the delay in milliseconds.
+ * @return one of the following results: {@link Tuner#RESULT_SUCCESS},
+ * {@link Tuner#RESULT_UNAVAILABLE}, {@link Tuner#RESULT_NOT_INITIALIZED},
+ * {@link Tuner#RESULT_INVALID_STATE}, {@link Tuner#RESULT_INVALID_ARGUMENT},
+ * {@link Tuner#RESULT_OUT_OF_MEMORY}, or {@link Tuner#RESULT_UNKNOWN_ERROR}.
*/
- public int delayCallbackUntilTimeMillis(long delayInMs) {
+ public int delayCallbackUntilMillisElapsed(long delayInMs) {
if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setTimeDelayHint")) {
return Tuner.RESULT_UNAVAILABLE;
@@ -638,8 +656,12 @@
* be a no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*
* @param delayInBytes specifies the duration of the delay in bytes.
+ * @return one of the following results: {@link Tuner#RESULT_SUCCESS},
+ * {@link Tuner#RESULT_UNAVAILABLE}, {@link Tuner#RESULT_NOT_INITIALIZED},
+ * {@link Tuner#RESULT_INVALID_STATE}, {@link Tuner#RESULT_INVALID_ARGUMENT},
+ * {@link Tuner#RESULT_OUT_OF_MEMORY}, or {@link Tuner#RESULT_UNKNOWN_ERROR}.
*/
- public int delayCallbackUntilBufferFilled(int delayInBytes) {
+ public int delayCallbackUntilBytesAccumulated(int delayInBytes) {
if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setTimeDelayHint")) {
return Tuner.RESULT_UNAVAILABLE;
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettings.java b/media/java/android/media/tv/tuner/filter/SectionSettings.java
index 94fda30..f123675 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettings.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettings.java
@@ -16,12 +16,13 @@
package android.media.tv.tuner.filter;
+import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.media.tv.tuner.TunerUtils;
/**
- * Filter Settings for Section data according to ISO/IEC 13818-1.
+ * Filter Settings for Section data according to ISO/IEC 13818-1 and ISO/IEC 23008-1.
*
* @hide
*/
@@ -30,12 +31,15 @@
final boolean mCrcEnabled;
final boolean mIsRepeat;
final boolean mIsRaw;
+ final int mBitWidthOfLengthField;
- SectionSettings(int mainType, boolean crcEnabled, boolean isRepeat, boolean isRaw) {
+ SectionSettings(int mainType, boolean crcEnabled, boolean isRepeat, boolean isRaw,
+ int bitWidthOfLengthField) {
super(TunerUtils.getFilterSubtype(mainType, Filter.SUBTYPE_SECTION));
mCrcEnabled = crcEnabled;
mIsRepeat = isRepeat;
mIsRaw = isRaw;
+ mBitWidthOfLengthField = bitWidthOfLengthField;
}
/**
@@ -62,6 +66,7 @@
public boolean isRepeat() {
return mIsRepeat;
}
+
/**
* Returns whether the filter sends {@link FilterCallback#onFilterStatusChanged} instead of
* {@link FilterCallback#onFilterEvent}.
@@ -71,6 +76,17 @@
}
/**
+ * Returns the bit width of the MMTP (MPEG Media Transport Protocol) section message's length
+ * field according to ISO/IEC 23008-1.
+ *
+ * The section filter uses this for CRC (Cyclic redundancy check) checking when
+ * {@link #isCrcEnabled()} is {@code true}.
+ */
+ public int getBitWidthOfLengthField() {
+ return mBitWidthOfLengthField;
+ }
+
+ /**
* Builder for {@link SectionSettings}.
*
* @param <T> The subclass to be built.
@@ -80,6 +96,7 @@
boolean mCrcEnabled;
boolean mIsRepeat;
boolean mIsRaw;
+ int mBitWidthOfLengthField;
Builder(int mainType) {
mMainType = mainType;
@@ -114,6 +131,7 @@
mIsRepeat = isRepeat;
return self();
}
+
/**
* Sets whether the filter send onFilterStatus instead of
* {@link FilterCallback#onFilterEvent}.
@@ -124,6 +142,23 @@
return self();
}
+ /**
+ * Sets the bit width for the MMTP(MPEG Media Transport Protocol) section message's length
+ * field according to ISO/IEC 23008-1.
+ *
+ * The section filter uses this for CRC (Cyclic redundancy check) checking when
+ * {@link #isCrcEnabled()} is {@code true}.
+ *
+ * <p>This field is only supported in Tuner 2.0 or higher version. Unsupported version will
+ * cause no-op. Use {@link android.media.tv.tuner.TunerVersionChecker#getTunerVersion()}
+ * to get the version information.
+ */
+ @NonNull
+ public T setBitWidthOfLengthField(@IntRange(from = 0) int bitWidthOfLengthField) {
+ mBitWidthOfLengthField = bitWidthOfLengthField;
+ return self();
+ }
+
/* package */ abstract T self();
}
}
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java b/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
index edfe85e..766a5c9 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettingsWithSectionBits.java
@@ -30,10 +30,9 @@
private final byte[] mMask;
private final byte[] mMode;
-
private SectionSettingsWithSectionBits(int mainType, boolean isCheckCrc, boolean isRepeat,
- boolean isRaw, byte[] filter, byte[] mask, byte[] mode) {
- super(mainType, isCheckCrc, isRepeat, isRaw);
+ boolean isRaw, int bitWidthOfLengthField, byte[] filter, byte[] mask, byte[] mode) {
+ super(mainType, isCheckCrc, isRepeat, isRaw, bitWidthOfLengthField);
mFilter = filter;
mMask = mask;
mMode = mode;
@@ -126,8 +125,8 @@
*/
@NonNull
public SectionSettingsWithSectionBits build() {
- return new SectionSettingsWithSectionBits(
- mMainType, mCrcEnabled, mIsRepeat, mIsRaw, mFilter, mMask, mMode);
+ return new SectionSettingsWithSectionBits(mMainType, mCrcEnabled, mIsRepeat, mIsRaw,
+ mBitWidthOfLengthField, mFilter, mMask, mMode);
}
@Override
diff --git a/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java b/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
index ff8f796..eddef40 100644
--- a/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
+++ b/media/java/android/media/tv/tuner/filter/SectionSettingsWithTableInfo.java
@@ -37,8 +37,8 @@
private final int mVersion;
private SectionSettingsWithTableInfo(int mainType, boolean isCheckCrc, boolean isRepeat,
- boolean isRaw, int tableId, int version) {
- super(mainType, isCheckCrc, isRepeat, isRaw);
+ boolean isRaw, int bitWidthOfLengthField, int tableId, int version) {
+ super(mainType, isCheckCrc, isRepeat, isRaw, bitWidthOfLengthField);
mTableId = tableId;
mVersion = version;
}
@@ -99,8 +99,8 @@
*/
@NonNull
public SectionSettingsWithTableInfo build() {
- return new SectionSettingsWithTableInfo(
- mMainType, mCrcEnabled, mIsRepeat, mIsRaw, mTableId, mVersion);
+ return new SectionSettingsWithTableInfo(mMainType, mCrcEnabled, mIsRepeat, mIsRaw,
+ mBitWidthOfLengthField, mTableId, mVersion);
}
@Override
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index c601649..d9feaf40 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -461,6 +461,7 @@
}
MediaEvent::~MediaEvent() {
+ android::Mutex::Autolock autoLock(mLock);
JNIEnv *env = AndroidRuntime::getJNIEnv();
env->DeleteWeakGlobalRef(mMediaEventObj);
mMediaEventObj = nullptr;
@@ -3515,11 +3516,14 @@
bool isCheckCrc = env->GetBooleanField(settings, env->GetFieldID(clazz, "mCrcEnabled", "Z"));
bool isRepeat = env->GetBooleanField(settings, env->GetFieldID(clazz, "mIsRepeat", "Z"));
bool isRaw = env->GetBooleanField(settings, env->GetFieldID(clazz, "mIsRaw", "Z"));
+ int32_t bitWidthOfLengthField =
+ env->GetIntField(settings, env->GetFieldID(clazz, "mBitWidthOfLengthField", "I"));
DemuxFilterSectionSettings filterSectionSettings {
.isCheckCrc = isCheckCrc,
.isRepeat = isRepeat,
.isRaw = isRaw,
+ .bitWidthOfLengthField = bitWidthOfLengthField,
};
if (env->IsInstanceOf(
settings,
diff --git a/media/jni/soundpool/Stream.cpp b/media/jni/soundpool/Stream.cpp
index 773cdc9..50bb79c 100644
--- a/media/jni/soundpool/Stream.cpp
+++ b/media/jni/soundpool/Stream.cpp
@@ -275,118 +275,104 @@
float leftVolume, float rightVolume, int32_t priority, int32_t loop, float rate,
std::vector<std::any>& garbage)
{
- // oldTrack and newTrack are placeholders to be released by garbage without the lock.
- sp<AudioTrack> oldTrack;
- sp<AudioTrack> newTrack;
- status_t status = NO_ERROR;
+ ALOGV("%s(%p)(soundID=%d, streamID=%d, leftVolume=%f, rightVolume=%f,"
+ " priority=%d, loop=%d, rate=%f)",
+ __func__, this, sound->getSoundID(), nextStreamID, leftVolume, rightVolume,
+ priority, loop, rate);
- {
- ALOGV("%s(%p)(soundID=%d, streamID=%d, leftVolume=%f, rightVolume=%f,"
- " priority=%d, loop=%d, rate=%f)",
- __func__, this, sound->getSoundID(), nextStreamID, leftVolume, rightVolume,
- priority, loop, rate);
+ // initialize track
+ const audio_stream_type_t streamType =
+ AudioSystem::attributesToStreamType(*mStreamManager->getAttributes());
+ const int32_t channelCount = sound->getChannelCount();
+ const auto sampleRate = (uint32_t)lround(double(sound->getSampleRate()) * rate);
+ size_t frameCount = 0;
- // initialize track
- const audio_stream_type_t streamType =
- AudioSystem::attributesToStreamType(*mStreamManager->getAttributes());
- const int32_t channelCount = sound->getChannelCount();
- const auto sampleRate = (uint32_t)lround(double(sound->getSampleRate()) * rate);
- size_t frameCount = 0;
+ if (loop) {
+ const audio_format_t format = sound->getFormat();
+ const size_t frameSize = audio_is_linear_pcm(format)
+ ? channelCount * audio_bytes_per_sample(format) : 1;
+ frameCount = sound->getSizeInBytes() / frameSize;
+ }
- if (loop) {
- const audio_format_t format = sound->getFormat();
- const size_t frameSize = audio_is_linear_pcm(format)
- ? channelCount * audio_bytes_per_sample(format) : 1;
- frameCount = sound->getSizeInBytes() / frameSize;
- }
-
- // check if the existing track has the same sound id.
- if (mAudioTrack != nullptr && mSoundID == sound->getSoundID()) {
+ if (mAudioTrack != nullptr) {
+ if (mSoundID == sound->getSoundID()
+ && mAudioTrack->setSampleRate(sampleRate) == NO_ERROR) {
+ // Reuse the old track if the soundID matches.
// the sample rate may fail to change if the audio track is a fast track.
- if (mAudioTrack->setSampleRate(sampleRate) == NO_ERROR) {
- newTrack = mAudioTrack;
- ALOGV("%s: reusing track %p for sound %d",
- __func__, mAudioTrack.get(), sound->getSoundID());
- }
- }
- if (newTrack == nullptr) {
- // mToggle toggles each time a track is started on a given stream.
- // The toggle is concatenated with the Stream address and passed to AudioTrack
- // as callback user data. This enables the detection of callbacks received from the old
- // audio track while the new one is being started and avoids processing them with
- // wrong audio audio buffer size (mAudioBufferSize)
- auto toggle = mToggle ^ 1;
- // NOLINTNEXTLINE(performance-no-int-to-ptr)
- void* userData = reinterpret_cast<void*>((uintptr_t)this | toggle);
- audio_channel_mask_t soundChannelMask = sound->getChannelMask();
- // When sound contains a valid channel mask, use it as is.
- // Otherwise, use stream count to calculate channel mask.
- audio_channel_mask_t channelMask = soundChannelMask != AUDIO_CHANNEL_NONE
- ? soundChannelMask : audio_channel_out_mask_from_count(channelCount);
-
- // do not create a new audio track if current track is compatible with sound parameters
-
- android::content::AttributionSourceState attributionSource;
- attributionSource.packageName = mStreamManager->getOpPackageName();
- attributionSource.token = sp<BBinder>::make();
- // TODO b/182469354 make consistent with AudioRecord, add util for native source
- newTrack = new AudioTrack(streamType, sampleRate, sound->getFormat(),
- channelMask, sound->getIMemory(), AUDIO_OUTPUT_FLAG_FAST,
- staticCallback, userData,
- 0 /*default notification frames*/, AUDIO_SESSION_ALLOCATE,
- AudioTrack::TRANSFER_DEFAULT,
- nullptr /*offloadInfo*/, attributionSource,
- mStreamManager->getAttributes(),
- false /*doNotReconnect*/, 1.0f /*maxRequiredSpeed*/);
- // Set caller name so it can be logged in destructor.
- // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_SOUNDPOOL
- newTrack->setCallerName("soundpool");
- oldTrack = mAudioTrack;
- status = newTrack->initCheck();
- if (status != NO_ERROR) {
- ALOGE("%s: error creating AudioTrack", __func__);
- // newTrack goes out of scope, so reference count drops to zero
- goto exit;
- }
- // From now on, AudioTrack callbacks received with previous toggle value will be ignored.
- mToggle = toggle;
- mAudioTrack = newTrack;
- ALOGV("%s: using new track %p for sound %d",
- __func__, newTrack.get(), sound->getSoundID());
- }
- if (mMuted) {
- newTrack->setVolume(0.0f, 0.0f);
+ ALOGV("%s: reusing track %p for sound %d",
+ __func__, mAudioTrack.get(), sound->getSoundID());
} else {
- newTrack->setVolume(leftVolume, rightVolume);
+ // If reuse not possible, move mAudioTrack to garbage, set to nullptr.
+ garbage.emplace_back(std::move(mAudioTrack));
+ mAudioTrack.clear(); // move should have cleared the sp<>, but we clear just in case.
}
- newTrack->setLoop(0, frameCount, loop);
- mAudioTrack->start();
- mSound = sound;
- mSoundID = sound->getSoundID();
- mPriority = priority;
- mLoop = loop;
- mLeftVolume = leftVolume;
- mRightVolume = rightVolume;
- mRate = rate;
- mState = PLAYING;
- mStopTimeNs = 0;
- mStreamID = nextStreamID; // prefer this to be the last, as it is an atomic sync point
}
+ if (mAudioTrack == nullptr) {
+ // mToggle toggles each time a track is started on a given stream.
+ // The toggle is concatenated with the Stream address and passed to AudioTrack
+ // as callback user data. This enables the detection of callbacks received from the old
+ // audio track while the new one is being started and avoids processing them with
+ // wrong audio audio buffer size (mAudioBufferSize)
+ auto toggle = mToggle ^ 1;
+ // NOLINTNEXTLINE(performance-no-int-to-ptr)
+ void* userData = reinterpret_cast<void*>((uintptr_t)this | toggle);
+ audio_channel_mask_t soundChannelMask = sound->getChannelMask();
+ // When sound contains a valid channel mask, use it as is.
+ // Otherwise, use stream count to calculate channel mask.
+ audio_channel_mask_t channelMask = soundChannelMask != AUDIO_CHANNEL_NONE
+ ? soundChannelMask : audio_channel_out_mask_from_count(channelCount);
-exit:
- ALOGV("%s: delete oldTrack %p", __func__, oldTrack.get());
- if (status != NO_ERROR) {
- // TODO: should we consider keeping the soundID if the old track is OK?
- // Do not attempt to restart this track (should we remove the stream id?)
- mState = IDLE;
- mSoundID = 0;
- mSound.reset();
- mAudioTrack.clear(); // actual release from garbage
+ // do not create a new audio track if current track is compatible with sound parameters
+
+ android::content::AttributionSourceState attributionSource;
+ attributionSource.packageName = mStreamManager->getOpPackageName();
+ attributionSource.token = sp<BBinder>::make();
+ // TODO b/182469354 make consistent with AudioRecord, add util for native source
+ mAudioTrack = new AudioTrack(streamType, sampleRate, sound->getFormat(),
+ channelMask, sound->getIMemory(), AUDIO_OUTPUT_FLAG_FAST,
+ staticCallback, userData,
+ 0 /*default notification frames*/, AUDIO_SESSION_ALLOCATE,
+ AudioTrack::TRANSFER_DEFAULT,
+ nullptr /*offloadInfo*/, attributionSource,
+ mStreamManager->getAttributes(),
+ false /*doNotReconnect*/, 1.0f /*maxRequiredSpeed*/);
+ // Set caller name so it can be logged in destructor.
+ // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_SOUNDPOOL
+ mAudioTrack->setCallerName("soundpool");
+
+ if (status_t status = mAudioTrack->initCheck();
+ status != NO_ERROR) {
+ ALOGE("%s: error %d creating AudioTrack", __func__, status);
+ // TODO: should we consider keeping the soundID and reusing the old track?
+ mState = IDLE;
+ mSoundID = 0;
+ mSound.reset();
+ garbage.emplace_back(std::move(mAudioTrack)); // remove mAudioTrack.
+ mAudioTrack.clear(); // move should have cleared the sp<>, but we clear just in case.
+ return;
+ }
+ // From now on, AudioTrack callbacks received with previous toggle value will be ignored.
+ mToggle = toggle;
+ ALOGV("%s: using new track %p for sound %d",
+ __func__, mAudioTrack.get(), sound->getSoundID());
}
-
- // move tracks to garbage to be released later outside of lock.
- if (newTrack) garbage.emplace_back(std::move(newTrack));
- if (oldTrack) garbage.emplace_back(std::move(oldTrack));
+ if (mMuted) {
+ mAudioTrack->setVolume(0.f, 0.f);
+ } else {
+ mAudioTrack->setVolume(leftVolume, rightVolume);
+ }
+ mAudioTrack->setLoop(0, frameCount, loop);
+ mAudioTrack->start();
+ mSound = sound;
+ mSoundID = sound->getSoundID();
+ mPriority = priority;
+ mLoop = loop;
+ mLeftVolume = leftVolume;
+ mRightVolume = rightVolume;
+ mRate = rate;
+ mState = PLAYING;
+ mStopTimeNs = 0;
+ mStreamID = nextStreamID; // prefer this to be the last, as it is an atomic sync point
}
/* static */
diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp
index 8568383..959e756 100644
--- a/media/jni/tuner/FilterClient.cpp
+++ b/media/jni/tuner/FilterClient.cpp
@@ -43,6 +43,7 @@
}
FilterClient::~FilterClient() {
+ Mutex::Autolock _l(mLock);
mTunerFilter = nullptr;
mAvSharedHandle = nullptr;
mAvSharedMemSize = 0;
@@ -74,6 +75,7 @@
Result res;
checkIsPassthroughFilter(configure);
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->configure(configure);
res = ClientHelper::getServiceSpecificErrorCode(s);
@@ -87,6 +89,7 @@
}
Result FilterClient::configureMonitorEvent(int32_t monitorEventType) {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->configureMonitorEvent(monitorEventType);
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -96,6 +99,7 @@
}
Result FilterClient::configureIpFilterContextId(int32_t cid) {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->configureIpFilterContextId(cid);
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -105,6 +109,7 @@
}
Result FilterClient::configureAvStreamType(AvStreamType avStreamType) {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->configureAvStreamType(avStreamType);
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -114,6 +119,7 @@
}
Result FilterClient::start() {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->start();
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -123,6 +129,7 @@
}
Result FilterClient::stop() {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->stop();
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -132,6 +139,7 @@
}
Result FilterClient::flush() {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->flush();
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -141,6 +149,7 @@
}
Result FilterClient::getId(int32_t& id) {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->getId(&id);
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -150,6 +159,7 @@
}
Result FilterClient::getId64Bit(int64_t& id) {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->getId64Bit(&id);
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -159,6 +169,7 @@
}
Result FilterClient::releaseAvHandle(native_handle_t* handle, uint64_t avDataId) {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->releaseAvHandle(dupToAidl(handle), avDataId);
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -168,6 +179,7 @@
}
Result FilterClient::setDataSource(sp<FilterClient> filterClient){
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->setDataSource(filterClient->getAidlFilter());
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -177,6 +189,7 @@
}
Result FilterClient::close() {
+ Mutex::Autolock _l(mLock);
if (mFilterMQEventFlag != nullptr) {
EventFlag::deleteEventFlag(&mFilterMQEventFlag);
mFilterMQEventFlag = nullptr;
@@ -197,6 +210,7 @@
}
string FilterClient::acquireSharedFilterToken() {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
string filterToken;
if (mTunerFilter->acquireSharedFilterToken(&filterToken).isOk()) {
@@ -208,6 +222,7 @@
}
Result FilterClient::freeSharedFilterToken(const string& filterToken) {
+ Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->freeSharedFilterToken(filterToken);
return ClientHelper::getServiceSpecificErrorCode(s);
@@ -237,6 +252,7 @@
}
Result FilterClient::getFilterMq() {
+ Mutex::Autolock _l(mLock);
if (mFilterMQ != nullptr) {
return Result::SUCCESS;
}
diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h
index 20e5610..9e9b233 100644
--- a/media/jni/tuner/FilterClient.h
+++ b/media/jni/tuner/FilterClient.h
@@ -21,6 +21,7 @@
#include <aidl/android/media/tv/tuner/BnTunerFilterCallback.h>
#include <aidl/android/media/tv/tuner/ITunerFilter.h>
#include <fmq/AidlMessageQueue.h>
+#include <utils/Mutex.h>
#include "ClientHelper.h"
#include "FilterClientCallback.h"
@@ -37,6 +38,7 @@
using ::aidl::android::media::tv::tuner::BnTunerFilterCallback;
using ::aidl::android::media::tv::tuner::ITunerFilter;
using ::android::hardware::EventFlag;
+using ::android::Mutex;
using namespace std;
@@ -179,6 +181,7 @@
uint64_t mAvSharedMemSize;
bool mIsMediaFilter;
bool mIsPassthroughFilter;
+ Mutex mLock;
};
} // namespace android
diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml
index 377e0c3..d424359 100644
--- a/packages/CompanionDeviceManager/res/values-eu/strings.xml
+++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml
@@ -20,8 +20,8 @@
<string name="confirmation_title" msgid="8455544820286920304">"Eman <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> kudeatzeko baimena <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aplikazioari"</string>
<string name="profile_name_watch" msgid="576290739483672360">"erlojua"</string>
<string name="chooser_title" msgid="2262294130493605839">"Aukeratu <strong><xliff:g id="APP_NAME">%2$s</xliff:g></strong> aplikazioak kudeatu beharreko <xliff:g id="PROFILE_NAME">%1$s</xliff:g>"</string>
- <string name="summary_watch" product="default" msgid="7113724443198337683">"Jakinarazpenekin interakzioan aritzeko eta telefonoa, SMSak, kontaktuak eta egutegia erabiltzeko baimena izango du <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak."</string>
- <string name="summary_watch" product="tablet" msgid="7113724443198337683">"Jakinarazpenekin interakzioan aritzeko eta telefonoa, SMSak, kontaktuak eta egutegia erabiltzeko baimena izango du <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak."</string>
+ <string name="summary_watch" product="default" msgid="7113724443198337683">"Jakinarazpenekin interakzioan aritzeko eta telefonoa, SMSak, kontaktuak eta egutegia erabiltzeko baimenak izango ditu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak."</string>
+ <string name="summary_watch" product="tablet" msgid="7113724443198337683">"Jakinarazpenekin interakzioan aritzeko eta telefonoa, SMSak, kontaktuak eta egutegia erabiltzeko baimenak izango ditu <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak."</string>
<string name="title_app_streaming" msgid="4459136600249308574">"Aplikazioak igortzeko baimena eman nahi diozu <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aplikazioari?"</string>
<string name="summary_app_streaming" product="default" msgid="6105916810614498138">"Utzi <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aplikazioari <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> urrunetik atzitzen, telefonoa konektatuta dagoenean bertan instalatuta dauden aplikazioetarako sarbidea izateko."</string>
<string name="summary_app_streaming" product="tablet" msgid="2996373715966272792">"Utzi <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aplikazioari <strong><xliff:g id="DEVICE_NAME">%2$s</xliff:g></strong> urrunetik atzitzen, tableta konektatuta dagoenean bertan instalatuta dauden aplikazioetarako sarbidea izateko."</string>
diff --git a/packages/ConnectivityT/framework-t/Android.bp b/packages/ConnectivityT/framework-t/Android.bp
index 38bac1c..d3d8bba 100644
--- a/packages/ConnectivityT/framework-t/Android.bp
+++ b/packages/ConnectivityT/framework-t/Android.bp
@@ -25,15 +25,21 @@
name: "framework-connectivity-netstats-internal-sources",
srcs: [
"src/android/app/usage/*.java",
- "src/android/net/DataUsage*.*",
- "src/android/net/INetworkStats*.*",
- "src/android/net/NetworkIdentity*.java",
+ "src/android/net/DataUsageRequest.*",
+ "src/android/net/INetworkStatsService.aidl",
+ "src/android/net/INetworkStatsSession.aidl",
+ "src/android/net/NetworkIdentity.java",
+ "src/android/net/NetworkIdentitySet.java",
"src/android/net/NetworkStateSnapshot.*",
- "src/android/net/NetworkStats*.*",
+ "src/android/net/NetworkStats.*",
+ "src/android/net/NetworkStatsAccess.*",
+ "src/android/net/NetworkStatsCollection.*",
+ "src/android/net/NetworkStatsHistory.*",
"src/android/net/NetworkTemplate.*",
"src/android/net/TrafficStats.java",
"src/android/net/UnderlyingNetworkInfo.*",
"src/android/net/netstats/**/*.*",
+ "src/com/android/server/NetworkManagementSocketTagger.java",
],
path: "src",
visibility: [
diff --git a/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java b/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
index a316b8a..583f7ba 100644
--- a/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
+++ b/packages/ConnectivityT/framework-t/src/android/app/usage/NetworkStatsManager.java
@@ -54,6 +54,7 @@
import java.util.List;
import java.util.Objects;
+import java.util.Set;
/**
* Provides access to network usage history and statistics. Usage data is collected in
@@ -535,6 +536,31 @@
return result;
}
+ /**
+ * Query realtime network usage statistics details with interfaces constrains.
+ * Return snapshot of current UID statistics, including any {@link TrafficStats#UID_TETHERING},
+ * video calling data usage and count of network operations that set by
+ * {@link TrafficStats#incrementOperationCount}. The returned data doesn't include any
+ * statistics that is reported by {@link NetworkStatsProvider}.
+ *
+ * @param requiredIfaces A list of interfaces the stats should be restricted to, or
+ * {@link NetworkStats#INTERFACES_ALL}.
+ *
+ * @hide
+ */
+ //@SystemApi
+ @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
+ @NonNull public android.net.NetworkStats getDetailedUidStats(
+ @NonNull Set<String> requiredIfaces) {
+ Objects.requireNonNull(requiredIfaces, "requiredIfaces cannot be null");
+ try {
+ return mService.getDetailedUidStats(requiredIfaces.toArray(new String[0]));
+ } catch (RemoteException e) {
+ if (DBG) Log.d(TAG, "Remote exception when get detailed uid stats");
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
/** @hide */
public void registerUsageCallback(NetworkTemplate template, int networkType,
long thresholdBytes, UsageCallback callback, @Nullable Handler handler) {
diff --git a/packages/ConnectivityT/framework-t/src/android/net/IpSecAlgorithm.java b/packages/ConnectivityT/framework-t/src/android/net/IpSecAlgorithm.java
index a84e7a9..10a22ac 100644
--- a/packages/ConnectivityT/framework-t/src/android/net/IpSecAlgorithm.java
+++ b/packages/ConnectivityT/framework-t/src/android/net/IpSecAlgorithm.java
@@ -343,7 +343,7 @@
// Load and validate the optional algorithm resource. Undefined or duplicate algorithms in
// the resource are not allowed.
final String[] resourceAlgos = systemResources.getStringArray(
- com.android.internal.R.array.config_optionalIpSecAlgorithms);
+ android.R.array.config_optionalIpSecAlgorithms);
for (String str : resourceAlgos) {
if (!ALGO_TO_REQUIRED_FIRST_SDK.containsKey(str) || !enabledAlgos.add(str)) {
// This error should be caught by CTS and never be thrown to API callers
diff --git a/core/java/com/android/server/NetworkManagementSocketTagger.java b/packages/ConnectivityT/framework-t/src/com/android/server/NetworkManagementSocketTagger.java
similarity index 97%
rename from core/java/com/android/server/NetworkManagementSocketTagger.java
rename to packages/ConnectivityT/framework-t/src/com/android/server/NetworkManagementSocketTagger.java
index d89566c9..e35f6a6 100644
--- a/core/java/com/android/server/NetworkManagementSocketTagger.java
+++ b/packages/ConnectivityT/framework-t/src/com/android/server/NetworkManagementSocketTagger.java
@@ -18,7 +18,6 @@
import android.os.StrictMode;
import android.util.Log;
-import android.util.Slog;
import dalvik.system.SocketTagger;
@@ -122,7 +121,7 @@
public static void resetKernelUidStats(int uid) {
int errno = native_deleteTagData(0, uid);
if (errno < 0) {
- Slog.w(TAG, "problem clearing counters for uid " + uid + " : errno " + errno);
+ Log.w(TAG, "problem clearing counters for uid " + uid + " : errno " + errno);
}
}
diff --git a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
index ced2e22..4db90c1 100644
--- a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
+++ b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java
@@ -448,7 +448,7 @@
handlerThread.start();
mHandler = new NetworkStatsHandler(handlerThread.getLooper());
mNetworkStatsSubscriptionsMonitor = deps.makeSubscriptionsMonitor(mContext,
- mHandler.getLooper(), new HandlerExecutor(mHandler), this);
+ new HandlerExecutor(mHandler), this);
mContentResolver = mContext.getContentResolver();
mContentObserver = mDeps.makeContentObserver(mHandler, mSettings,
mNetworkStatsSubscriptionsMonitor);
@@ -474,11 +474,10 @@
*/
@NonNull
public NetworkStatsSubscriptionsMonitor makeSubscriptionsMonitor(@NonNull Context context,
- @NonNull Looper looper, @NonNull Executor executor,
- @NonNull NetworkStatsService service) {
+ @NonNull Executor executor, @NonNull NetworkStatsService service) {
// TODO: Update RatType passively in NSS, instead of querying into the monitor
// when notifyNetworkStatus.
- return new NetworkStatsSubscriptionsMonitor(context, looper, executor,
+ return new NetworkStatsSubscriptionsMonitor(context, executor,
(subscriberId, type) -> service.handleOnCollapsedRatTypeChanged());
}
@@ -923,6 +922,7 @@
@Override
public NetworkStats getDetailedUidStats(String[] requiredIfaces) {
+ enforceAnyPermissionOf(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
try {
final String[] ifacesToQuery =
mStatsFactory.augmentWithStackedInterfaces(requiredIfaces);
diff --git a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsSubscriptionsMonitor.java b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsSubscriptionsMonitor.java
index 9bb7bb8..4875f1c 100644
--- a/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsSubscriptionsMonitor.java
+++ b/packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsSubscriptionsMonitor.java
@@ -18,15 +18,16 @@
import static android.net.NetworkTemplate.NETWORK_TYPE_5G_NSA;
import static android.net.NetworkTemplate.getCollapsedRatType;
+import static android.telephony.TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED;
+import static android.telephony.TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA;
+import static android.telephony.TelephonyManager.NETWORK_TYPE_LTE;
import android.annotation.NonNull;
import android.content.Context;
-import android.os.Looper;
import android.telephony.Annotation;
-import android.telephony.NetworkRegistrationInfo;
-import android.telephony.PhoneStateListener;
-import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
@@ -64,7 +65,7 @@
private final Delegate mDelegate;
/**
- * Receivers that watches for {@link ServiceState} changes for each subscription, to
+ * Receivers that watches for {@link TelephonyDisplayInfo} changes for each subscription, to
* monitor the transitioning between Radio Access Technology(RAT) types for each sub.
*/
@NonNull
@@ -79,9 +80,9 @@
@NonNull
private final Executor mExecutor;
- NetworkStatsSubscriptionsMonitor(@NonNull Context context, @NonNull Looper looper,
+ NetworkStatsSubscriptionsMonitor(@NonNull Context context,
@NonNull Executor executor, @NonNull Delegate delegate) {
- super(looper);
+ super();
mSubscriptionManager = (SubscriptionManager) context.getSystemService(
Context.TELEPHONY_SUBSCRIPTION_SERVICE);
mTeleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
@@ -116,13 +117,12 @@
continue;
}
- final RatTypeListener listener =
- new RatTypeListener(mExecutor, this, sub.first, sub.second);
+ final RatTypeListener listener = new RatTypeListener(this, sub.first, sub.second);
mRatListeners.add(listener);
// Register listener to the telephony manager that associated with specific sub.
mTeleManager.createForSubscriptionId(sub.first)
- .listen(listener, PhoneStateListener.LISTEN_SERVICE_STATE);
+ .registerTelephonyCallback(mExecutor, listener);
Log.d(NetworkStatsService.TAG, "RAT type listener registered for sub " + sub.first);
}
@@ -176,7 +176,7 @@
private void handleRemoveRatTypeListener(@NonNull RatTypeListener listener) {
mTeleManager.createForSubscriptionId(listener.mSubId)
- .listen(listener, PhoneStateListener.LISTEN_NONE);
+ .unregisterTelephonyCallback(listener);
Log.d(NetworkStatsService.TAG, "RAT type listener unregistered for sub " + listener.mSubId);
mRatListeners.remove(listener);
@@ -186,7 +186,8 @@
listener.mSubscriberId, TelephonyManager.NETWORK_TYPE_UNKNOWN);
}
- static class RatTypeListener extends PhoneStateListener {
+ static class RatTypeListener extends TelephonyCallback
+ implements TelephonyCallback.DisplayInfoListener {
// Unique id for the subscription. See {@link SubscriptionInfo#getSubscriptionId}.
@NonNull
private final int mSubId;
@@ -200,29 +201,27 @@
@NonNull
private final NetworkStatsSubscriptionsMonitor mMonitor;
- RatTypeListener(@NonNull Executor executor,
- @NonNull NetworkStatsSubscriptionsMonitor monitor, int subId,
+ RatTypeListener(@NonNull NetworkStatsSubscriptionsMonitor monitor, int subId,
@NonNull String subscriberId) {
- super(executor);
mSubId = subId;
mSubscriberId = subscriberId;
mMonitor = monitor;
}
@Override
- public void onServiceStateChanged(@NonNull ServiceState ss) {
+ public void onDisplayInfoChanged(TelephonyDisplayInfo displayInfo) {
// In 5G SA (Stand Alone) mode, the primary cell itself will be 5G hence telephony
// would report RAT = 5G_NR.
// However, in 5G NSA (Non Stand Alone) mode, the primary cell is still LTE and
// network allocates a secondary 5G cell so telephony reports RAT = LTE along with
// NR state as connected. In such case, attributes the data usage to NR.
// See b/160727498.
- final boolean is5GNsa = (ss.getDataNetworkType() == TelephonyManager.NETWORK_TYPE_LTE
- || ss.getDataNetworkType() == TelephonyManager.NETWORK_TYPE_LTE_CA)
- && ss.getNrState() == NetworkRegistrationInfo.NR_STATE_CONNECTED;
+ final boolean is5GNsa = displayInfo.getNetworkType() == NETWORK_TYPE_LTE
+ && (displayInfo.getOverrideNetworkType() == OVERRIDE_NETWORK_TYPE_NR_NSA
+ || displayInfo.getOverrideNetworkType() == OVERRIDE_NETWORK_TYPE_NR_ADVANCED);
final int networkType =
- (is5GNsa ? NETWORK_TYPE_5G_NSA : ss.getDataNetworkType());
+ (is5GNsa ? NETWORK_TYPE_5G_NSA : displayInfo.getNetworkType());
final int collapsedRatType = getCollapsedRatType(networkType);
if (collapsedRatType == mLastCollapsedRatType) return;
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
index c206903..3f2b8ac 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-night-v31/colors.xml
@@ -43,4 +43,8 @@
<color name="settingslib_accent_primary_variant">@android:color/system_accent1_300</color>
<color name="settingslib_text_color_primary_device_default">@android:color/system_neutral1_50</color>
+
+ <color name="settingslib_text_color_secondary_device_default">@android:color/system_neutral2_200</color>
+
+ <color name="settingslib_text_color_preference_category_title">@android:color/system_accent1_100</color>
</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
index 0401098..ec3c336 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/colors.xml
@@ -65,4 +65,8 @@
<color name="settingslib_background_device_default_light">@android:color/system_neutral1_50</color>
<color name="settingslib_text_color_primary_device_default">@android:color/system_neutral1_900</color>
+
+ <color name="settingslib_text_color_secondary_device_default">@android:color/system_neutral2_700</color>
+
+ <color name="settingslib_text_color_preference_category_title">@android:color/system_accent1_600</color>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
index 1c33f1a..11546c8 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/dimens.xml
@@ -20,4 +20,9 @@
<dimen name="app_icon_min_width">52dp</dimen>
<dimen name="settingslib_preferred_minimum_touch_target">48dp</dimen>
<dimen name="settingslib_dialogCornerRadius">28dp</dimen>
+
+ <!-- Left padding of the preference -->
+ <dimen name="settingslib_listPreferredItemPaddingStart">24dp</dimen>
+ <!-- Right padding of the preference -->
+ <dimen name="settingslib_listPreferredItemPaddingEnd">24dp</dimen>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml
index 5800636..8e7226b 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/styles.xml
@@ -17,13 +17,19 @@
<resources>
<style name="TextAppearance.PreferenceTitle.SettingsLib"
parent="@android:style/TextAppearance.Material.Subhead">
+ <item name="android:textColor">@color/settingslib_text_color_primary_device_default</item>
<item name="android:fontFamily">@string/settingslib_config_headlineFontFamily</item>
<item name="android:textSize">20sp</item>
</style>
+ <style name="TextAppearance.PreferenceSummary.SettingsLib"
+ parent="@android:style/TextAppearance.DeviceDefault.Small">
+ <item name="android:textColor">@color/settingslib_text_color_secondary_device_default</item>
+ </style>
+
<style name="TextAppearance.CategoryTitle.SettingsLib"
parent="@android:style/TextAppearance.DeviceDefault.Medium">
- <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:textColor">@color/settingslib_text_color_preference_category_title</item>
<item name="android:textSize">14sp</item>
</style>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
index 6bf288b..7bf75bc 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/themes.xml
@@ -19,8 +19,8 @@
<!-- Only using in Settings application -->
<style name="Theme.SettingsBase" parent="@android:style/Theme.DeviceDefault.Settings" >
<item name="android:textAppearanceListItem">@style/TextAppearance.PreferenceTitle.SettingsLib</item>
- <item name="android:listPreferredItemPaddingStart">24dp</item>
- <item name="android:listPreferredItemPaddingLeft">24dp</item>
+ <item name="android:listPreferredItemPaddingStart">@dimen/settingslib_listPreferredItemPaddingStart</item>
+ <item name="android:listPreferredItemPaddingLeft">@dimen/settingslib_listPreferredItemPaddingStart</item>
<item name="android:listPreferredItemPaddingEnd">16dp</item>
<item name="android:listPreferredItemPaddingRight">16dp</item>
<item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item>
diff --git a/packages/SettingsLib/SettingsTheme/res/values/config.xml b/packages/SettingsLib/SettingsTheme/res/values/config.xml
new file mode 100644
index 0000000..e73dcc0
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values/config.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <bool name="settingslib_config_icon_space_reserved">true</bool>
+</resources>
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values/dimens.xml b/packages/SettingsLib/SettingsTheme/res/values/dimens.xml
index 18af1f9..f7e0144 100644
--- a/packages/SettingsLib/SettingsTheme/res/values/dimens.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/dimens.xml
@@ -21,4 +21,11 @@
<dimen name="app_icon_min_width">56dp</dimen>
<dimen name="two_target_min_width">72dp</dimen>
<dimen name="settingslib_dialogCornerRadius">8dp</dimen>
+
+ <!-- Left padding of the preference -->
+ <dimen name="settingslib_listPreferredItemPaddingStart">16dp</dimen>
+ <!-- Right padding of the preference -->
+ <dimen name="settingslib_listPreferredItemPaddingEnd">16dp</dimen>
+ <!-- Icon size of the preference -->
+ <dimen name="settingslib_preferenceIconSize">24dp</dimen>
</resources>
diff --git a/packages/SettingsLib/SettingsTheme/res/values/styles.xml b/packages/SettingsLib/SettingsTheme/res/values/styles.xml
new file mode 100644
index 0000000..aaab0f0
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/res/values/styles.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2022 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<resources>
+ <style name="TextAppearance.PreferenceTitle.SettingsLib"
+ parent="@android:style/TextAppearance.Material.Subhead">
+ </style>
+
+ <style name="TextAppearance.PreferenceSummary.SettingsLib"
+ parent="@style/PreferenceSummaryTextStyle">
+ </style>
+
+ <style name="TextAppearance.CategoryTitle.SettingsLib"
+ parent="@android:style/TextAppearance.DeviceDefault.Medium">
+ </style>
+</resources>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index f3fb48f..13a5caf 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vra elke keer"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Totdat jy dit afskakel"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sopas"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Foonluidspreker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Hierdie foon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Hierdie foon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kan nie koppel nie. Skakel toestel af en weer aan"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedrade oudiotoestel"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 647d052..7ad455a 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ሁልጊዜ ጠይቅ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"እስኪያጠፉት ድረስ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ልክ አሁን"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"የስልክ ድምጽ ማጉያ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ይህ ስልክ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ይህ ስልክ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"መገናኘት ላይ ችግር። መሳሪያውን ያጥፉት እና እንደገና ያብሩት"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ባለገመድ የኦዲዮ መሣሪያ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 6357f3c..a4646f1 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -556,7 +556,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"السؤال في كل مرة"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"إلى أن يتم إيقاف الوضع"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"للتو"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"مكبر صوت الهاتف"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"هذا الهاتف"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"هذا الهاتف"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"حدثت مشكلة أثناء الاتصال. يُرجى إيقاف الجهاز ثم إعادة تشغيله."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"جهاز سماعي سلكي"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index cb74e1f..c304921 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"প্ৰতিবাৰতে সোধক"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"আপুনি অফ নকৰা পর্যন্ত"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"এই মাত্ৰ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ফ’নৰ স্পীকাৰ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"এই ফ’নটো"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"এই ফ’নটো"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"সংযোগ হোৱাত সমস্যা হৈছে। ডিভাইচটো অফ কৰি পুনৰ অন কৰক"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"তাঁৰযুক্ত অডিঅ’ ডিভাইচ"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 979c957..6e3947e 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Həmişə soruşulsun"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Deaktiv edilənə qədər"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"İndicə"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon dinamiki"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Bu telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Bu telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Qoşulmaqla bağlı problem. Cihazı deaktiv edin, sonra yenidən aktiv edin"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio cihaz"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 5af3006..a05dae9 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem pri povezivanju. Isključite uređaj, pa ga ponovo uključite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index d1b6226..e3b0567 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Заўсёды пытацца"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Пакуль не выключыце"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Толькі што"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Дынамік тэлефона"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Гэты тэлефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Гэты тэлефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Праблема з падключэннем. Выключыце і зноў уключыце прыладу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Правадная аўдыяпрылада"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 375879a..a8eaaf0 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Да се пита винаги"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"До изключване"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Току-що"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Високоговорител"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Този телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Този телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"При свързването възникна проблем. Изключете устройството и го включете отново"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Аудиоустройство с кабел"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 89fcbd3..c28e927 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"প্রতিবার জিজ্ঞেস করা হবে"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"যতক্ষণ না আপনি বন্ধ করছেন"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"এখনই"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ফোনের স্পিকার"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"এই ফোন"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"এই ফোনটি"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"কানেক্ট করতে সমস্যা হচ্ছে। ডিভাইস বন্ধ করে আবার চালু করুন"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ওয়্যার অডিও ডিভাইস"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index e33978f..232c22f 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Došlo je do problema prilikom povezivanja. Isključite, pa ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 2b10a30..bc393c3 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pregunta sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Fins que no el desactivis"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ara mateix"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altaveu del telèfon"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Aquest telèfon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Aquest telèfon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Hi ha hagut un problema amb la connexió. Apaga el dispositiu i torna\'l a encendre."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositiu d\'àudio amb cable"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 7a94bb4..f758365 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pokaždé se zeptat"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokud funkci nevypnete"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Právě teď"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Reproduktor telefonu"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tento telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Tento telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problém s připojením. Vypněte zařízení a znovu jej zapněte"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kabelové audiozařízení"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index ff5c6ae..0fd2569 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spørg hver gang"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Indtil du deaktiverer"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Lige nu"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonens højttaler"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Denne telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Denne telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Der kunne ikke oprettes forbindelse. Sluk og tænd enheden"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhed med ledning"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index defc223..f75685b 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Jedes Mal fragen"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Bis zur Deaktivierung"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Gerade eben"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Smartphone-Lautsprecher"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Dieses Smartphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Dieses Smartphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Verbindung kann nicht hergestellt werden. Schalte das Gerät aus & und wieder ein."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Netzbetriebenes Audiogerät"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 402e489..5115728 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Να ερωτώμαι κάθε φορά"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Μέχρι την απενεργοποίηση"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Μόλις τώρα"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Ηχείο τηλεφώνου"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Αυτό το τηλέφωνο"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Αυτό το τηλέφωνο"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Πρόβλημα κατά τη σύνδεση. Απενεργοποιήστε τη συσκευή και ενεργοποιήστε την ξανά"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ενσύρματη συσκευή ήχου"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index fb3bc7a..1481cee 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index e33af37..b3dd58a 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index fb3bc7a..1481cee 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index fb3bc7a..1481cee 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 2c58236..2a6c82c 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ask every time"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Until you turn off"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Just now"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Phone speaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"This phone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off & back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 471e715..ee0e0bc 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -219,7 +219,7 @@
<item msgid="3075292553049300105">"Normal"</item>
<item msgid="1158955023692670059">"Ligera"</item>
<item msgid="5664310435707146591">"Muy ligera"</item>
- <item msgid="5491266922147715962">"A velocidad muy alta"</item>
+ <item msgid="5491266922147715962">"Muy rápida"</item>
<item msgid="7659240015901486196">"Rápida"</item>
<item msgid="7147051179282410945">"Muy rápida"</item>
<item msgid="581904787661470707">"A velocidad máxima"</item>
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar siempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hasta que lo desactives"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Recién"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altavoz del teléfono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Error al establecer la conexión. Apaga el dispositivo y vuelve a encenderlo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index bd687e4..1f64bad 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar siempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hasta que lo desactives"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"justo ahora"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altavoz del teléfono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"No se ha podido conectar; reinicia el dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index aaf3201..ed7b9dc 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Küsi iga kord"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kuni välja lülitate"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Äsja"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefoni kõlar"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"See telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"See telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem ühendamisel. Lülitage seade välja ja uuesti sisse"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Juhtmega heliseade"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 0f929de..4cdcca7 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -552,9 +552,9 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Galdetu beti"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Zuk desaktibatu arte"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Oraintxe"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonoaren bozgorailua"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Telefono hau"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Telefono hau"</string>
- <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazoren bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string>
+ <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazo bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio-gailu kableduna"</string>
<string name="help_label" msgid="3528360748637781274">"Laguntza eta iritziak"</string>
<string name="storage_category" msgid="2287342585424631813">"Biltegiratzea"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 3dce25d..1b5f979 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"هربار پرسیده شود"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"تا زمانیکه آن را خاموش کنید"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"هماکنون"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"بلندگوی تلفن"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"این تلفن"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"این تلفن"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"مشکل در اتصال. دستگاه را خاموش و دوباره روشن کنید"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"دستگاه صوتی سیمی"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 373f6a4..9490ede 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Kysy aina"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kunnes laitat pois päältä"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Äsken"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Puhelimen kaiutin"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tämä puhelin"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Tämä puhelin"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Yhteysvirhe. Sammuta laite ja käynnistä se uudelleen."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Langallinen äänilaite"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index ebaf4b1..ab36e11 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Toujours demander"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Haut-parleur du téléphone"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ce téléphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ce téléphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteingez et rallumez l\'appareil"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio à câble"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 5f635b0..35f2fce 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Toujours demander"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Jusqu\'à la désactivation"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"À l\'instant"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Haut-parleur du téléphone"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ce téléphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ce téléphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteignez l\'appareil, puis rallumez-le"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio filaire"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index cb33a51..8d23864 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Preguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Ata a desactivación"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altofalante do teléfono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este teléfono"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Produciuse un problema coa conexión. Apaga e acende o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 79ca4ab..ac38a64 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"દર વખતે પૂછો"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"તમે બંધ ન કરો ત્યાં સુધી"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"હમણાં જ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ફોન સ્પીકર"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"આ ફોન"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"આ ફોન"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"કનેક્ટ કરવામાં સમસ્યા આવી રહી છે. ડિવાઇસને બંધ કરીને ફરી ચાલુ કરો"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"વાયરવાળો ઑડિયો ડિવાઇસ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index fcf04bc..5c008f0 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"हर बार पूछें"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"जब तक आप इसे बंद नहीं करते"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"अभी-अभी"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"फ़ोन का स्पीकर"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"यह फ़ोन"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"यह फ़ोन"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर वाला ऑडियो डिवाइस"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 1ef94fb..d681a1e 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pitaj svaki put"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dok ne isključite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Upravo sad"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvučnik telefona"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ovaj telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem s povezivanjem. Isključite i ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audiouređaj"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index deb0f81..57894a0 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Mindig kérdezzen rá"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kikapcsolásig"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Az imént"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon hangszórója"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ez a telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ez a telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sikertelen csatlakozás. Kapcsolja ki az eszközt, majd kapcsolja be újra."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vezetékes audioeszköz"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 485af54..e6ed2b0 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ամեն անգամ հարցնել"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Մինչև անջատեք"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Հենց նոր"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Հեռախոսի բարձրախոս"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Այս հեռախոսը"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Այս հեռախոսը"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Կապի խնդիր կա: Սարքն անջատեք և նորից միացրեք:"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Լարով աուդիո սարք"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index f82798a4..6fbab2b 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Selalu tanya"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Sampai Anda menonaktifkannya"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Baru saja"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Speaker ponsel"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ponsel ini"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ponsel ini"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ada masalah saat menghubungkan. Nonaktifkan perangkat & aktifkan kembali"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Perangkat audio berkabel"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index a43eb14..fa11dfb 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spyrja í hvert skipti"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Þar til þú slekkur"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Rétt í þessu"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Símahátalari"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Þessi sími"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Þessi sími"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Vandamál í tengingu. Slökktu og kveiktu á tækinu"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Snúrutengt hljómtæki"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 0a96f59..0db0448 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Chiedi ogni volta"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Fino alla disattivazione"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Adesso"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altoparlante telefono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Questo telefono"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Questo telefono"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema di connessione. Spegni e riaccendi il dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo audio cablato"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 6f3cfb9..7ac5919 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"יש לשאול בכל פעם"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"עד הכיבוי"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"הרגע"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"הרמקול של הטלפון"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"הטלפון הזה"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"הטלפון הזה"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"יש בעיה בחיבור. עליך לכבות את המכשיר ולהפעיל אותו מחדש"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"התקן אודיו חוטי"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 620aca6..d82ca5d 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"毎回確認"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"OFF にするまで"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"たった今"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"スマートフォンのスピーカー"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"このスマートフォン"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"このスマートフォン"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"接続エラーです。デバイスを OFF にしてから ON に戻してください"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線オーディオ デバイス"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index daa0fae..02c1084 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ყოველთვის მკითხეთ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"გამორთვამდე"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ახლახან"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ტელეფონის დინამიკი"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ეს ტელეფონი"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ეს ტელეფონი"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"დაკავშირებისას წარმოიქმნა პრობლემა. გამორთეთ და კვლავ ჩართეთ მოწყობილობა"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"სადენიანი აუდიო მოწყობილობა"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index 6305891..6c55b62 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Әрдайым сұрау"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Өшірілгенге дейін"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Дәл қазір"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефон динамигі"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Осы телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Осы телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Байланыс орнату қатесі шығуып жатыр. Құрылғыны өшіріп, қайта қосыңыз."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Сымды аудио құрылғысы"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index fb00aa0..58a2c7c 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"សួរគ្រប់ពេល"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"រហូតទាល់តែអ្នកបិទ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"អម្បាញ់មិញ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ឧបករណ៍បំពងសំឡេងទូរសព្ទ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ទូរសព្ទនេះ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ទូរសព្ទនេះ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"មានបញ្ហាក្នុងការភ្ជាប់។ បិទ រួចបើកឧបករណ៍វិញ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ឧបករណ៍សំឡេងប្រើខ្សែ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index a1f0825..91e76e2 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ಪ್ರತಿ ಬಾರಿ ಕೇಳಿ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ನೀವು ಆಫ್ ಮಾಡುವವರೆಗೆ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ಇದೀಗ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ಫೋನ್ ಸ್ಪೀಕರ್"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ಈ ಫೋನ್"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ಈ ಫೋನ್"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ಕನೆಕ್ಟ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ ಸಾಧನವನ್ನು ಆಫ್ ಮಾಡಿ ಹಾಗೂ ನಂತರ ಪುನಃ ಆನ್ ಮಾಡಿ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ವೈರ್ ಹೊಂದಿರುವ ಆಡಿಯೋ ಸಾಧನ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 1ff18c6..d470560 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"항상 확인"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"사용 중지할 때까지"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"조금 전"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"휴대전화 스피커"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"이 휴대전화"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"이 휴대전화"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"연결 중에 문제가 발생했습니다. 기기를 껐다가 다시 켜 보세요."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"유선 오디오 기기"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 58e3107..e38bb51a 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Ар дайым суралсын"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Бул функция өчүрүлгөнгө чейин"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Жаңы эле"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефондун динамиги"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ушул телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ушул телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Туташууда маселе келип чыкты. Түзмөктү өчүрүп, кайра күйгүзүп көрүңүз"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Зымдуу аудио түзмөк"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index a2b8c6b..cc02292 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ຖາມທຸກເທື່ອ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ຈົນກວ່າທ່ານຈະປິດ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ຕອນນີ້"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ລຳໂພງໂທລະສັບ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ໂທລະສັບນີ້"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ໂທລະສັບນີ້"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ເກີດບັນຫາໃນການເຊື່ອມຕໍ່. ປິດອຸປະກອນແລ້ວເປີດກັບຄືນມາໃໝ່"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ອຸປະກອນສຽງແບບມີສາຍ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index d8c1a45..fb645a0 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Klausti kaskart"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Kol išjungsite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ką tik"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefono garsiakalbis"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Šis telefonas"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Šis telefonas"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Prisijungiant kilo problema. Išjunkite įrenginį ir vėl jį įjunkite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Laidinis garso įrenginys"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 9ac8c65..694ff0a 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vaicāt katru reizi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Līdz brīdim, kad izslēgsiet"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Tikko"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Tālruņa skaļrunis"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Šis tālrunis"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Šis tālrunis"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Radās problēma ar savienojuma izveidi. Izslēdziet un atkal ieslēdziet ierīci."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vadu audioierīce"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index c08fd24..9d412fc 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Прашувај секогаш"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Додека не го исклучите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Пред малку"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Телефонски звучник"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Овој телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Овој телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем со поврзување. Исклучете го уредот и повторно вклучете го"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичен аудиоуред"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 27693e6..82df16c0 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"എപ്പോഴും ചോദിക്കുക"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"നിങ്ങൾ ഓഫാക്കുന്നത് വരെ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ഇപ്പോൾ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ഫോൺ സ്പീക്കർ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ഈ ഫോൺ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ഈ ഫോൺ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"കണക്റ്റ് ചെയ്യുന്നതിൽ പ്രശ്നമുണ്ടായി. ഉപകരണം ഓഫാക്കി വീണ്ടും ഓണാക്കുക"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"വയർ മുഖേന ബന്ധിപ്പിച്ച ഓഡിയോ ഉപകരണം"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index b62d103..027b722 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Тухай бүрд асуух"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Таныг унтраах хүртэл"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Дөнгөж сая"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Утасны чанга яригч"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Энэ утас"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Энэ утас"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Холбогдоход асуудал гарлаа. Төхөөрөмжийг унтраагаад дахин асаана уу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Утастай аудио төхөөрөмж"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index d90c08a..176d764 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"प्रत्येक वेळी विचारा"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"तुम्ही बंद करेपर्यंत"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"आत्ताच"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"फोनचा स्पीकर"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"हा फोन"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"हा फोन"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करण्यात समस्या आली. डिव्हाइस बंद करा आणि नंतर सुरू करा"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर असलेले ऑडिओ डिव्हाइस"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 7011aec..6bf15fe 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Tanya setiap kali"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Sehingga anda matikan"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sebentar tadi"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Pembesar suara telefon"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Telefon ini"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Telefon ini"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Masalah penyambungan. Matikan & hidupkan kembali peranti"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Peranti audio berwayar"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 3de8cf9..13fc6ad 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"အမြဲမေးရန်"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"သင်ပိတ်လိုက်သည် အထိ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ယခုလေးတင်"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ဖုန်းစပီကာ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ဤဖုန်း"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ဤဖုန်း"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ချိတ်ဆက်ရာတွင် ပြဿနာရှိပါသည်။ စက်ကိုပိတ်ပြီး ပြန်ဖွင့်ပါ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ကြိုးတပ် အသံစက်ပစ္စည်း"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index e7f70d1..c2e449b 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Spør hver gang"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Til du slår av"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Nå nettopp"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonhøyttaler"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Denne telefonen"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Denne telefonen"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Tilkoblingsproblemer. Slå enheten av og på igjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhet med kabel"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 8fc329f8..85860f0 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"प्रत्येक पटक सोधियोस्"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"तपाईंले अफ नगरेसम्म"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"अहिले भर्खरै"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"फोनको स्पिकर"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"यो फोन"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"यो फोन"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"जोड्ने क्रममा समस्या भयो। यन्त्रलाई निष्क्रिय पारेर फेरि सक्रिय गर्नुहोस्"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"तारयुक्त अडियो यन्त्र"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 35e651b..2ffa559 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -222,7 +222,7 @@
<item msgid="5491266922147715962">"Nog sneller"</item>
<item msgid="7659240015901486196">"Heel erg snel"</item>
<item msgid="7147051179282410945">"Snelst"</item>
- <item msgid="581904787661470707">"Allerallersnelst"</item>
+ <item msgid="581904787661470707">"Allersnelst"</item>
</string-array>
<string name="choose_profile" msgid="343803890897657450">"Profiel kiezen"</string>
<string name="category_personal" msgid="6236798763159385225">"Persoonlijk"</string>
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vraag altijd"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Totdat je uitzet"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Zojuist"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefoonspeaker"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Deze telefoon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Deze telefoon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Zet het apparaat uit en weer aan."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedraad audioapparaat"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 49018be..e2fee13 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ପ୍ରତ୍ୟେକ ଥର ପଚାରନ୍ତୁ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ଆପଣ ବନ୍ଦ ନକରିବା ପର୍ଯ୍ୟନ୍ତ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ଏହିକ୍ଷଣି"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ଫୋନ୍ ସ୍ପିକର୍"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ଏହି ଫୋନ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ଏହି ଫୋନ୍"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଡିଭାଇସ୍ ବନ୍ଦ କରି ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ତାରଯୁକ୍ତ ଅଡିଓ ଡିଭାଇସ୍"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 9efc4c4..11cd481 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ਹਰ ਵਾਰ ਪੁੱਛੋ"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਬੰਦ ਨਹੀਂ ਕਰਦੇ"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ਹੁਣੇ ਹੀ"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ਫ਼ੋਨ ਦਾ ਸਪੀਕਰ"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ਇਹ ਫ਼ੋਨ"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ਇਹ ਫ਼ੋਨ"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ। ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰਕੇ ਵਾਪਸ ਚਾਲੂ ਕਰੋ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ਤਾਰ ਵਾਲਾ ਆਡੀਓ ਡੀਵਾਈਸ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 1eb2dd9..0c670bc 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Zawsze pytaj"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dopóki nie wyłączysz"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Przed chwilą"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Głośnik telefonu"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ten telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ten telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem z połączeniem. Wyłącz i ponownie włącz urządzenie"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Przewodowe urządzenie audio"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 38d637f..10568a1 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Alto-falante do smartphone"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este smartphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este smartphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 5a0ec2e..5458279 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até desativar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora mesmo"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altifalante do telemóvel"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este telemóvel"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este telemóvel"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema ao ligar. Desligue e volte a ligar o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fios"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 38d637f..10568a1 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Perguntar sempre"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Até você desativar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Agora"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Alto-falante do smartphone"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Este smartphone"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Este smartphone"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index ce58f1c..00fc8ff 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Întreabă de fiecare dată"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Până când dezactivați"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Chiar acum"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Difuzorul telefonului"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Acest telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Acest telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problemă la conectare. Opriți și reporniți dispozitivul."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispozitiv audio cu fir"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 14db225..15e3456 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Всегда спрашивать"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Пока вы не отключите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Только что"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Встроен. динамик"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Этот смартфон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Этот смартфон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ошибка подключения. Выключите и снова включите устройство."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Проводное аудиоустройство"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 41f10c9..d56dd34 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"සෑම විටම ඉල්ලන්න"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ඔබ ක්රියාවිරහිත කරන තුරු"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"මේ දැන්"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"දුරකථන ස්පීකරය"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"මෙම දුරකථනය"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"මෙම දුරකථනය"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"සම්බන්ධ කිරීමේ ගැටලුවකි උපාංගය ක්රියාවිරහිත කර & ආපසු ක්රියාත්මක කරන්න"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"රැහැන්ගත කළ ඕඩියෝ උපාංගය"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 801c213..e7ea915 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vždy sa opýtať"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokým funkciu nevypnete"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Teraz"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Reproduktor telefónu"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Tento telefón"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Tento telefón"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Pri pripájaní sa vyskytol problém. Zariadenie vypnite a znova zapnite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio zariadenie s káblom"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index a331018..95a6fb9 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Vedno vprašaj"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Dokler ne izklopite"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Pravkar"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Zvočnik telefona"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ta telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ta telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Težava pri povezovanju. Napravo izklopite in znova vklopite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žična zvočna naprava"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index cb9bea8..8524164 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Pyet çdo herë"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Derisa ta çaktivizosh"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Pikërisht tani"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Altoparlanti i telefonit"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ky telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ky telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem me lidhjen. Fike dhe ndize përsëri pajisjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Pajisja audio me tel"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 9e90333..b19198a 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -553,7 +553,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Питај сваки пут"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Док не искључите"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Управо"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Звучник телефона"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Овај телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Овај телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем при повезивању. Искључите уређај, па га поново укључите"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичани аудио уређај"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 215d9ad..59cde86 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Fråga varje gång"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Tills du inaktiverar funktionen"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Nyss"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonhögtalare"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Den här telefonen"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Den här telefonen"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Det gick inte att ansluta. Stäng av enheten och slå på den igen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ljudenhet med kabelanslutning"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index f51825b..64c2e07 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Uliza kila wakati"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hadi utakapoizima"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Sasa hivi"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Spika ya simu"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Simu hii"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Simu hii"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kuna tatizo la kuunganisha kwenye Intaneti. Zima kisha uwashe kifaa"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kifaa cha sauti kinachotumia waya"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 8128683..ccef6b9 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ஒவ்வொரு முறையும் கேள்"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"ஆஃப் செய்யும் வரை"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"சற்றுமுன்"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"மொபைல் ஸ்பீக்கர்"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"இந்த மொபைல்"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"இந்த மொபைல்"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"இணைப்பதில் சிக்கல். சாதனத்தை ஆஃப் செய்து மீண்டும் ஆன் செய்யவும்"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"வயருடன்கூடிய ஆடியோ சாதனம்"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 298f850..4013620 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ప్రతిసారి అడుగు"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"మీరు ఆఫ్ చేసే వరకు"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ఇప్పుడే"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ఫోన్ స్పీకర్"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"ఈ ఫోన్"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"ఈ ఫోన్"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"కనెక్ట్ చేయడంలో సమస్య ఉంది. పరికరాన్ని ఆఫ్ చేసి, ఆపై తిరిగి ఆన్ చేయండి"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"వైర్ గల ఆడియో పరికరం"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index e18c649..c42295f 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ถามทุกครั้ง"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"จนกว่าคุณจะปิด"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"เมื่อสักครู่"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"ลำโพงโทรศัพท์"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"โทรศัพท์เครื่องนี้"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"โทรศัพท์เครื่องนี้"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"เกิดปัญหาในการเชื่อมต่อ ปิดอุปกรณ์แล้วเปิดใหม่อีกครั้ง"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"อุปกรณ์เสียงแบบมีสาย"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 628bacc..ab36a55 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Magtanong palagi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Hanggang sa i-off mo"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Ngayon lang"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Speaker ng telepono"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Ang teleponong ito"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Ang teleponong ito"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Nagkaproblema sa pagkonekta. I-off at pagkatapos ay i-on ang device"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired na audio device"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 3e30d43..ce71496 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Her zaman sor"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Siz kapatana kadar"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Az önce"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon hoparlörü"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Bu telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Bu telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Bağlanırken sorun oluştu. Cihazı kapatıp tekrar açın"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kablolu ses cihazı"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 8683953..b7d370d2 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -554,7 +554,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Запитувати щоразу"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Доки не вимкнути"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Щойно"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Динамік"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Цей телефон"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Цей телефон"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Не вдається підключитися. Перезавантажте пристрій."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Дротовий аудіопристрій"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 09e50f6..c3f4d56 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"ہر بار پوچھیں"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"یہاں تک کہ آپ آف کر دیں"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"ابھی ابھی"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"فون اسپیکر"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"یہ فون"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"یہ فون"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"منسلک کرنے میں مسئلہ پیش آ گیا۔ آلہ کو آف اور بیک آن کریں"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"وائرڈ آڈیو آلہ"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index d0b9506..aa3d8826 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Har safar so‘ralsin"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Rejimdan chiqilgunicha"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Hozir"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefon karnayi"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Shu telefon"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Shu telefon"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ulanishda muammo yuz berdi. Qurilmani oʻchiring va yoqing"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio qurilma"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index bd97cc5..7291d06 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Luôn hỏi"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Cho đến khi bạn tắt"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Vừa xong"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Loa điện thoại"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Điện thoại này"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Điện thoại này"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sự cố kết nối. Hãy tắt thiết bị rồi bật lại"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Thiết bị âm thanh có dây"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 3ed1860..3f1b9ae 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都询问"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直到您将其关闭"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"刚刚"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手机扬声器"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"这部手机"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"这部手机"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"连接时遇到问题。请关闭并重新开启设备"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有线音频设备"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 965e78f..c91a13f 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都詢問"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直至您關閉為止"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手機喇叭"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"此手機"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"這部手機"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連接,請關閉裝置然後重新開機"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音響裝置"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index e3ca344..8b469ea 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"每次都詢問"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"直到你關閉為止"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"剛剛"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"手機喇叭"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"這支手機"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"這支手機"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連線,請關閉裝置後再重新開啟"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音訊裝置"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 1af1fa1..9eac12c 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -552,7 +552,7 @@
<string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Buza njalo"</string>
<string name="zen_mode_forever" msgid="3339224497605461291">"Uze uvale isikrini"</string>
<string name="time_unit_just_now" msgid="3006134267292728099">"Khona manje"</string>
- <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Isipikha sefoni"</string>
+ <string name="media_transfer_this_device_name" msgid="2357329267148436433">"Le foni"</string>
<string name="media_transfer_this_phone" msgid="7194341457812151531">"Le foni"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Inkinga yokuxhumeka. Vala idivayisi futhi uphinde uyivule"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Idivayisi yomsindo enentambo"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java
index c6552f7..d3934bf 100644
--- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/AbstractConnectivityPreferenceController.java
@@ -73,7 +73,8 @@
}
mContext.registerReceiver(mConnectivityReceiver, connectivityIntentFilter,
- android.Manifest.permission.CHANGE_NETWORK_STATE, null);
+ android.Manifest.permission.CHANGE_NETWORK_STATE, null,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
protected abstract String[] getConnectivityIntents();
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
index 011ca0b..cff45c6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java
@@ -16,8 +16,6 @@
package com.android.settingslib.net;
-import static android.net.NetworkStatsHistory.FIELD_RX_BYTES;
-import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.telephony.TelephonyManager.SIM_STATE_READY;
import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
@@ -27,12 +25,9 @@
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.net.ConnectivityManager;
-import android.net.INetworkStatsService;
-import android.net.INetworkStatsSession;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
-import android.os.ServiceManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.format.DateUtils;
@@ -51,25 +46,20 @@
private static final String TAG = "DataUsageController";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final int FIELDS = FIELD_RX_BYTES | FIELD_TX_BYTES;
private static final StringBuilder PERIOD_BUILDER = new StringBuilder(50);
private static final java.util.Formatter PERIOD_FORMATTER = new java.util.Formatter(
PERIOD_BUILDER, Locale.getDefault());
private final Context mContext;
- private final INetworkStatsService mStatsService;
private final NetworkPolicyManager mPolicyManager;
private final NetworkStatsManager mNetworkStatsManager;
- private INetworkStatsSession mSession;
private Callback mCallback;
private NetworkNameProvider mNetworkController;
private int mSubscriptionId;
public DataUsageController(Context context) {
mContext = context;
- mStatsService = INetworkStatsService.Stub.asInterface(
- ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
mPolicyManager = NetworkPolicyManager.from(mContext);
mNetworkStatsManager = context.getSystemService(NetworkStatsManager.class);
mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -112,8 +102,7 @@
}
public DataUsageInfo getWifiDataUsageInfo() {
- NetworkTemplate template = NetworkTemplate.buildTemplateWifi(
- NetworkTemplate.WIFI_NETWORKID_ALL, null);
+ NetworkTemplate template = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
return getDataUsageInfo(template);
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
index 3f95a07..afd44d5 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java
@@ -17,6 +17,7 @@
package com.android.settingslib.net;
import android.content.Context;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -26,6 +27,7 @@
import com.android.internal.util.ArrayUtils;
import java.util.List;
+import java.util.Set;
/**
* Utils class for data usage
@@ -73,10 +75,15 @@
private static NetworkTemplate getMobileTemplateForSubId(
TelephonyManager telephonyManager, int subId) {
- // The null subscriberId means that no any mobile/carrier network will be matched.
- // Using old API: buildTemplateMobileAll for the null subscriberId to avoid NPE.
+ // Create template that matches any mobile network when the subscriberId is null.
String subscriberId = telephonyManager.getSubscriberId(subId);
- return subscriberId != null ? NetworkTemplate.buildTemplateCarrierMetered(subscriberId)
- : NetworkTemplate.buildTemplateMobileAll(subscriberId);
+ return subscriberId != null
+ ? new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setSubscriberIds(Set.of(subscriberId))
+ .setMeteredness(NetworkStats.METERED_YES)
+ .build()
+ : new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
+ .setMeteredness(NetworkStats.METERED_YES)
+ .build();
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEnterpriseRestrictionUtils.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEnterpriseRestrictionUtils.java
index 21a4ac6..fa4ae67 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEnterpriseRestrictionUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiEnterpriseRestrictionUtils.java
@@ -60,6 +60,22 @@
return true;
}
+ /**
+ * Confirm Wi-Fi Config is allowed to add according to whether user restriction is set
+ *
+ * @param context A context
+ * @return whether the device is permitted to add new Wi-Fi config
+ */
+ public static boolean isAddWifiConfigAllowed(Context context) {
+ final UserManager userManager = context.getSystemService(UserManager.class);
+ final Bundle restrictions = userManager.getUserRestrictions();
+ if (isAtLeastT() && restrictions.getBoolean(UserManager.DISALLOW_ADD_WIFI_CONFIG)) {
+ Log.i(TAG, "Wi-Fi Add network isn't available due to user restriction.");
+ return false;
+ }
+ return true;
+ }
+
@ChecksSdkIntAtLeast(api=Build.VERSION_CODES.TIRAMISU)
private static boolean isAtLeastT() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU;
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/NetworkPolicyEditorTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/NetworkPolicyEditorTest.java
index 7e389a1..919f602 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/NetworkPolicyEditorTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/utils/NetworkPolicyEditorTest.java
@@ -20,6 +20,7 @@
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import androidx.test.InstrumentationRegistry;
@@ -32,6 +33,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Set;
+
@RunWith(AndroidJUnit4.class)
@SmallTest
public class NetworkPolicyEditorTest {
@@ -44,7 +47,9 @@
@Before
public void setUp() {
- mNetworkTemplate = NetworkTemplate.buildTemplateCarrierMetered("123456789123456");
+ mNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setMeteredness(NetworkStats.METERED_YES)
+ .setSubscriberIds(Set.of("123456789123456")).build();
NetworkPolicyManager policyManager = NetworkPolicyManager.from(InstrumentationRegistry
.getContext());
mNetworkPolicyEditor = new NetworkPolicyEditor(policyManager);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
index 9be783d..f0456b3 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java
@@ -18,26 +18,21 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.usage.NetworkStats;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
-import android.net.INetworkStatsSession;
-import android.net.NetworkStatsHistory;
import android.net.NetworkTemplate;
import android.os.RemoteException;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
-import android.text.format.DateUtils;
import org.junit.Before;
import org.junit.Test;
@@ -47,6 +42,8 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowSubscriptionManager;
+import java.util.Set;
+
@RunWith(RobolectricTestRunner.class)
public class DataUsageControllerTest {
@@ -54,8 +51,6 @@
private static final String SUB_ID_2 = "Test Subscriber 2";
@Mock
- private INetworkStatsSession mSession;
- @Mock
private TelephonyManager mTelephonyManager;
@Mock
private SubscriptionManager mSubscriptionManager;
@@ -68,7 +63,6 @@
private NetworkTemplate mWifiNetworkTemplate;
private DataUsageController mController;
- private NetworkStatsHistory mNetworkStatsHistory;
private final int mDefaultSubscriptionId = 1234;
@Before
@@ -80,17 +74,16 @@
.thenReturn(mSubscriptionManager);
when(mContext.getSystemService(NetworkStatsManager.class)).thenReturn(mNetworkStatsManager);
mController = new DataUsageController(mContext);
- mNetworkStatsHistory = spy(
- new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */));
- doReturn(mNetworkStatsHistory)
- .when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt());
ShadowSubscriptionManager.setDefaultDataSubscriptionId(mDefaultSubscriptionId);
doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId();
- mNetworkTemplate = NetworkTemplate.buildTemplateCarrierMetered(SUB_ID);
- mNetworkTemplate2 = NetworkTemplate.buildTemplateCarrierMetered(SUB_ID_2);
- mWifiNetworkTemplate = NetworkTemplate.buildTemplateWifi(
- NetworkTemplate.WIFI_NETWORKID_ALL, null);
+ mNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setMeteredness(android.net.NetworkStats.METERED_YES)
+ .setSubscriberIds(Set.of(SUB_ID)).build();
+ mNetworkTemplate2 = new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setMeteredness(android.net.NetworkStats.METERED_YES)
+ .setSubscriberIds(Set.of(SUB_ID_2)).build();
+ mWifiNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build();
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
index e8d5844..5b0f659 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
@@ -30,6 +30,7 @@
import android.content.Context;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import android.text.format.DateUtils;
@@ -40,6 +41,8 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
+import java.util.Set;
+
@RunWith(RobolectricTestRunner.class)
public class NetworkCycleDataForUidLoaderTest {
private static final String SUB_ID = "Test Subscriber";
@@ -62,7 +65,9 @@
when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE))
.thenReturn(mNetworkPolicyManager);
when(mNetworkPolicyManager.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]);
- mNetworkTemplate = NetworkTemplate.buildTemplateCarrierMetered(SUB_ID);
+ mNetworkTemplate = new NetworkTemplate.Builder(NetworkTemplate.MATCH_CARRIER)
+ .setMeteredness(NetworkStats.METERED_YES)
+ .setSubscriberIds(Set.of(SUB_ID)).build();
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEnterpriseRestrictionUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEnterpriseRestrictionUtilsTest.java
index 3c339de..f6af09a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEnterpriseRestrictionUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiEnterpriseRestrictionUtilsTest.java
@@ -103,4 +103,30 @@
assertThat(WifiEnterpriseRestrictionUtils.isWifiDirectAllowed(mContext)).isTrue();
}
+
+ @Test
+ public void isAddWifiConfigAllowed_setSDKForS_shouldReturnTrue() {
+ ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.S);
+ when(mBundle.getBoolean(UserManager.DISALLOW_ADD_WIFI_CONFIG)).thenReturn(true);
+
+ assertThat(WifiEnterpriseRestrictionUtils.isAddWifiConfigAllowed(mContext)).isTrue();
+ }
+
+ @Test
+ public void isAddWifiConfigAllowed_setSDKForTAndDisallowForRestriction_shouldReturnFalse() {
+ ReflectionHelpers.setStaticField(
+ Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.TIRAMISU);
+ when(mBundle.getBoolean(UserManager.DISALLOW_ADD_WIFI_CONFIG)).thenReturn(true);
+
+ assertThat(WifiEnterpriseRestrictionUtils.isAddWifiConfigAllowed(mContext)).isFalse();
+ }
+
+ @Test
+ public void isAddWifiConfigAllowed_setSDKForTAndAllowForRestriction_shouldReturnTrue() {
+ ReflectionHelpers.setStaticField(
+ Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.TIRAMISU);
+ when(mBundle.getBoolean(UserManager.DISALLOW_ADD_WIFI_CONFIG)).thenReturn(false);
+
+ assertThat(WifiEnterpriseRestrictionUtils.isAddWifiConfigAllowed(mContext)).isTrue();
+ }
}
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
index 16cece9..8e35ee96 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java
@@ -173,6 +173,7 @@
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE,
Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY,
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED,
Settings.Secure.ONE_HANDED_MODE_ACTIVATED,
Settings.Secure.ONE_HANDED_MODE_ENABLED,
Settings.Secure.ONE_HANDED_MODE_TIMEOUT,
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
index 71accc4..00b5f50 100644
--- a/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
+++ b/packages/SettingsProvider/src/android/provider/settings/backup/SystemSettings.java
@@ -78,6 +78,8 @@
Settings.System.NOTIFICATION_SOUND,
Settings.System.ACCELEROMETER_ROTATION,
Settings.System.SHOW_BATTERY_PERCENT,
+ Settings.System.ALARM_VIBRATION_INTENSITY,
+ Settings.System.MEDIA_VIBRATION_INTENSITY,
Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
Settings.System.RING_VIBRATION_INTENSITY,
Settings.System.HAPTIC_FEEDBACK_INTENSITY,
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
index 13c1e51..2312525 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java
@@ -267,6 +267,7 @@
new InclusiveIntegerRangeValidator(
Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN,
Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL));
+ VALIDATORS.put(Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED, BOOLEAN_VALIDATOR);
VALIDATORS.put(
Secure.ACCESSIBILITY_BUTTON_TARGETS,
ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR);
diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
index 84e9d28..6bcb769 100644
--- a/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
+++ b/packages/SettingsProvider/src/android/provider/settings/validators/SystemSettingsValidators.java
@@ -118,6 +118,8 @@
VALIDATORS.put(System.MUTE_STREAMS_AFFECTED, NON_NEGATIVE_INTEGER_VALIDATOR);
VALIDATORS.put(System.VIBRATE_ON, BOOLEAN_VALIDATOR);
VALIDATORS.put(System.APPLY_RAMPING_RINGER, BOOLEAN_VALIDATOR);
+ VALIDATORS.put(System.ALARM_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
+ VALIDATORS.put(System.MEDIA_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index cd6447f..c5f027b 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -1813,6 +1813,10 @@
dumpSetting(s, p,
Settings.Secure.ODI_CAPTIONS_VOLUME_UI_ENABLED,
SecureSettingsProto.Accessibility.ODI_CAPTIONS_VOLUME_UI_ENABLED);
+ dumpSetting(s, p,
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED,
+ SecureSettingsProto.Accessibility
+ .ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED);
p.end(accessibilityToken);
final long adaptiveSleepToken = p.start(SecureSettingsProto.ADAPTIVE_SLEEP);
@@ -2912,6 +2916,18 @@
dumpSetting(s, p,
Settings.System.VIBRATE_WHEN_RINGING,
SystemSettingsProto.Vibrate.WHEN_RINGING);
+
+ // NOTIFICATION_VIBRATION_INTENSITY is already logged at Notification.vibration_intensity
+ // HAPTIC_FEEDBACK_INTENSITY is already logged at HapticFeedback.intensity
+ dumpSetting(s, p,
+ Settings.System.ALARM_VIBRATION_INTENSITY,
+ SystemSettingsProto.Vibrate.ALARM_INTENSITY);
+ dumpSetting(s, p,
+ Settings.System.MEDIA_VIBRATION_INTENSITY,
+ SystemSettingsProto.Vibrate.MEDIA_INTENSITY);
+ dumpSetting(s, p,
+ Settings.System.RING_VIBRATION_INTENSITY,
+ SystemSettingsProto.Vibrate.RING_INTENSITY);
p.end(vibrateToken);
final long volumeToken = p.start(SystemSettingsProto.VOLUME);
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 10252ee..0c70821 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -23,6 +23,7 @@
>
<!-- Standard permissions granted to the shell. -->
+ <uses-permission android:name="android.permission.LAUNCH_DEVICE_MANAGER_SETUP" />
<uses-permission android:name="android.permission.GET_RUNTIME_PERMISSIONS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
@@ -607,15 +608,14 @@
<!-- Permission required for ATS test - CarDevicePolicyManagerTest -->
<uses-permission android:name="android.permission.LOCK_DEVICE" />
- <!-- Permission required for CTS test - CtsSafetyCenterTestCases -->
+ <!-- Permissions required for CTS test - CtsSafetyCenterTestCases -->
<uses-permission android:name="android.permission.SEND_SAFETY_CENTER_UPDATE" />
-
- <!-- Permission required for CTS test - CtsSafetyCenterTestCases -->
<uses-permission android:name="android.permission.READ_SAFETY_CENTER_STATUS" />
+ <uses-permission android:name="android.permission.MANAGE_SAFETY_CENTER" />
- <!-- Permission required for CTS test - CommunalManagerTest -->
- <uses-permission android:name="android.permission.WRITE_COMMUNAL_STATE" />
- <uses-permission android:name="android.permission.READ_COMMUNAL_STATE" />
+
+ <!-- Permission required for CTS test - Notification test suite -->
+ <uses-permission android:name="android.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL" />
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
diff --git a/packages/Shell/res/values-watch/strings.xml b/packages/Shell/res/values-watch/strings.xml
new file mode 100644
index 0000000..5f7bfcb
--- /dev/null
+++ b/packages/Shell/res/values-watch/strings.xml
@@ -0,0 +1,20 @@
+<?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.
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Title for Bug report notification indicating the number of the bug report and the
+ percentage complete. Example: "Bug report #3 is 20% complete" [CHAR LIMIT=50] -->
+ <string name="bugreport_in_progress_title">Bug report <xliff:g id="id" example="#3">#%1$d</xliff:g> is <xliff:g id="percentage" example="20%">%2$s</xliff:g> complete</string>
+</resources>
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index ee9d430..c5a01a1 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -199,6 +199,15 @@
*/
private static final String BUGREPORT_DIR = "bugreports";
+ /**
+ * The directory in which System Trace files from the native System Tracing app are stored for
+ * Wear devices.
+ */
+ private static final String WEAR_SYSTEM_TRACES_DIRECTORY_ON_DEVICE = "data/local/traces/";
+
+ /** The directory that contains System Traces in bugreports that include System Traces. */
+ private static final String WEAR_SYSTEM_TRACES_DIRECTORY_IN_BUGREPORT = "systraces/";
+
private static final String NOTIFICATION_CHANNEL_ID = "bugreports";
/**
@@ -724,14 +733,16 @@
nf.setMaximumFractionDigits(2);
final String percentageText = nf.format((double) info.progress.intValue() / 100);
- String title = mContext.getString(R.string.bugreport_in_progress_title, info.id);
-
- // TODO: Remove this workaround when notification progress is implemented on Wear.
+ final String title;
if (mIsWatch) {
+ // TODO: Remove this workaround when notification progress is implemented on Wear.
nf.setMinimumFractionDigits(0);
nf.setMaximumFractionDigits(0);
final String watchPercentageText = nf.format((double) info.progress.intValue() / 100);
- title = title + "\n" + watchPercentageText;
+ title = mContext.getString(
+ R.string.bugreport_in_progress_title, info.id, watchPercentageText);
+ } else {
+ title = mContext.getString(R.string.bugreport_in_progress_title, info.id);
}
final String name =
@@ -1456,6 +1467,16 @@
}
}
+ /** Returns an array of the system trace files collected by the System Tracing native app. */
+ private static File[] getSystemTraceFiles() {
+ try {
+ return new File(WEAR_SYSTEM_TRACES_DIRECTORY_ON_DEVICE).listFiles();
+ } catch (SecurityException e) {
+ Log.e(TAG, "Error getting system trace files.", e);
+ return new File[]{};
+ }
+ }
+
/**
* Adds the user-provided info into the bugreport zip file.
* <p>
@@ -1475,8 +1496,17 @@
Log.wtf(TAG, "addDetailsToZipFile(): no bugreportFile on " + info);
return;
}
- if (TextUtils.isEmpty(info.getTitle()) && TextUtils.isEmpty(info.getDescription())) {
- Log.d(TAG, "Not touching zip file since neither title nor description are set");
+
+ File[] systemTracesToIncludeInBugreport = new File[] {};
+ if (mIsWatch) {
+ systemTracesToIncludeInBugreport = getSystemTraceFiles();
+ Log.d(TAG, "Found " + systemTracesToIncludeInBugreport.length + " system traces.");
+ }
+
+ if (TextUtils.isEmpty(info.getTitle())
+ && TextUtils.isEmpty(info.getDescription())
+ && systemTracesToIncludeInBugreport.length == 0) {
+ Log.d(TAG, "Not touching zip file: no detail to add.");
return;
}
if (info.addedDetailsToZip || info.addingDetailsToZip) {
@@ -1487,7 +1517,10 @@
// It's not possible to add a new entry into an existing file, so we need to create a new
// zip, copy all entries, then rename it.
- sendBugreportBeingUpdatedNotification(mContext, info.id); // ...and that takes time
+ if (!mIsWatch) {
+ // TODO(b/184854609): re-introduce this notification for Wear.
+ sendBugreportBeingUpdatedNotification(mContext, info.id); // ...and that takes time
+ }
final File dir = info.bugreportFile.getParentFile();
final File tmpZip = new File(dir, "tmp-" + info.bugreportFile.getName());
@@ -1508,6 +1541,13 @@
}
// Then add the user-provided info.
+ if (systemTracesToIncludeInBugreport.length != 0) {
+ for (File trace : systemTracesToIncludeInBugreport) {
+ addEntry(zos,
+ WEAR_SYSTEM_TRACES_DIRECTORY_IN_BUGREPORT + trace.getName(),
+ new FileInputStream(trace));
+ }
+ }
addEntry(zos, "title.txt", info.getTitle());
addEntry(zos, "description.txt", info.getDescription());
} catch (IOException e) {
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index b19ef3a..137a1fd 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -129,8 +129,15 @@
}
filegroup {
+ name: "AAA-src",
+ srcs: ["tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java"],
+ path: "tests/src",
+}
+
+filegroup {
name: "SystemUI-tests-utils",
srcs: [
+ "tests/src/com/android/systemui/SysuiBaseFragmentTest.java",
"tests/src/com/android/systemui/SysuiTestCase.java",
"tests/src/com/android/systemui/TestableDependency.java",
"tests/src/com/android/systemui/classifier/FalsingManagerFake.java",
@@ -138,6 +145,7 @@
"tests/src/com/android/systemui/statusbar/RankingBuilder.java",
"tests/src/com/android/systemui/statusbar/SbnBuilder.java",
"tests/src/com/android/systemui/SysuiTestableContext.java",
+ "tests/src/com/android/systemui/util/**/*Fake.java",
"tests/src/com/android/systemui/utils/leaks/BaseLeakChecker.java",
"tests/src/com/android/systemui/utils/leaks/LeakCheckedTest.java",
"tests/src/com/android/systemui/**/Fake*.java",
diff --git a/packages/SystemUI/TEST_MAPPING b/packages/SystemUI/TEST_MAPPING
index 092758e..dee4ff5 100644
--- a/packages/SystemUI/TEST_MAPPING
+++ b/packages/SystemUI/TEST_MAPPING
@@ -15,12 +15,6 @@
"exclude-annotation": "org.junit.Ignore"
},
{
- "exclude-annotation": "androidx.test.filters.FlakyTest"
- },
- {
- "exclude-annotation": "android.platform.helpers.Staging"
- },
- {
"exclude-annotation": "android.platform.test.annotations.Postsubmit"
},
{
@@ -99,9 +93,6 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
},
{
- "exclude-annotation": "android.platform.helpers.Staging"
- },
- {
"exclude-annotation": "android.platform.test.scenario.annotation.LargeScreenOnly"
},
{
diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp
index 1b15d20..46adfeb 100644
--- a/packages/SystemUI/animation/Android.bp
+++ b/packages/SystemUI/animation/Android.bp
@@ -39,5 +39,5 @@
],
manifest: "AndroidManifest.xml",
-
+ kotlincflags: ["-Xjvm-default=enable"],
}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
index a0d335d..08d217d 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt
@@ -95,6 +95,9 @@
*/
var callback: Callback? = null
+ /** The set of [Listener] that should be notified of any animation started by this animator. */
+ private val listeners = LinkedHashSet<Listener>()
+
/**
* Start an intent and animate the opening window. The intent will be started by running
* [intentStarter], which should use the provided [RemoteAnimationAdapter] and return the launch
@@ -214,6 +217,16 @@
}
}
+ /** Add a [Listener] that can listen to launch animations. */
+ fun addListener(listener: Listener) {
+ listeners.add(listener)
+ }
+
+ /** Remove a [Listener]. */
+ fun removeListener(listener: Listener) {
+ listeners.remove(listener)
+ }
+
/** Create a new animation [Runner] controlled by [controller]. */
@VisibleForTesting
fun createRunner(controller: Controller): Runner = Runner(controller)
@@ -234,13 +247,27 @@
/** Hide the keyguard and animate using [runner]. */
fun hideKeyguardWithAnimation(runner: IRemoteAnimationRunner)
- /** Enable/disable window blur so they don't overlap with the window launch animation **/
- fun setBlursDisabledForAppLaunch(disabled: Boolean)
-
/* Get the background color of [task]. */
fun getBackgroundColor(task: TaskInfo): Int
}
+ interface Listener {
+ /** Called when an activity launch animation started. */
+ @JvmDefault
+ fun onLaunchAnimationStart() {}
+
+ /**
+ * Called when an activity launch animation is finished. This will be called if and only if
+ * [onLaunchAnimationStart] was called earlier.
+ */
+ @JvmDefault
+ fun onLaunchAnimationEnd() {}
+
+ /** Called when an activity launch animation made progress. */
+ @JvmDefault
+ fun onLaunchAnimationProgress(linearProgress: Float) {}
+ }
+
/**
* A controller that takes care of applying the animation to an expanding view.
*
@@ -396,12 +423,12 @@
val delegate = this.controller
val controller = object : LaunchAnimator.Controller by delegate {
override fun onLaunchAnimationStart(isExpandingFullyAbove: Boolean) {
- callback.setBlursDisabledForAppLaunch(true)
+ listeners.forEach { it.onLaunchAnimationStart() }
delegate.onLaunchAnimationStart(isExpandingFullyAbove)
}
override fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) {
- callback.setBlursDisabledForAppLaunch(false)
+ listeners.forEach { it.onLaunchAnimationEnd() }
iCallback?.invoke()
delegate.onLaunchAnimationEnd(isExpandingFullyAbove)
}
@@ -413,6 +440,7 @@
) {
applyStateToWindow(window, state)
navigationBar?.let { applyStateToNavigationBar(it, state, linearProgress) }
+ listeners.forEach { it.onLaunchAnimationProgress(linearProgress) }
delegate.onLaunchAnimationProgress(state, progress, linearProgress)
}
}
diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
index 37df597..29221aa 100644
--- a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
+++ b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt
@@ -31,15 +31,15 @@
const val GOOGLE_BLUE = 0xFF1b6ef3.toInt()
const val MIN_CHROMA = 5
-enum class ChromaStrategy {
+internal enum class ChromaStrategy {
EQ, GTE
}
-enum class HueStrategy {
+internal enum class HueStrategy {
SOURCE, ADD, SUBTRACT
}
-class Chroma(val strategy: ChromaStrategy, val value: Double) {
+internal class Chroma(val strategy: ChromaStrategy, val value: Double) {
fun get(sourceChroma: Double): Double {
return when (strategy) {
ChromaStrategy.EQ -> value
@@ -48,7 +48,7 @@
}
}
-class Hue(val strategy: HueStrategy = HueStrategy.SOURCE, val value: Double = 0.0) {
+internal class Hue(val strategy: HueStrategy = HueStrategy.SOURCE, val value: Double = 0.0) {
fun get(sourceHue: Double): Double {
return when (strategy) {
HueStrategy.SOURCE -> sourceHue
@@ -58,7 +58,7 @@
}
}
-class TonalSpec(val hue: Hue = Hue(), val chroma: Chroma) {
+internal class TonalSpec(val hue: Hue = Hue(), val chroma: Chroma) {
fun shades(sourceColor: Cam): List<Int> {
val hue = hue.get(sourceColor.hue.toDouble())
val chroma = chroma.get(sourceColor.chroma.toDouble())
@@ -66,7 +66,7 @@
}
}
-class CoreSpec(
+internal class CoreSpec(
val a1: TonalSpec,
val a2: TonalSpec,
val a3: TonalSpec,
@@ -74,7 +74,7 @@
val n2: TonalSpec
)
-enum class Style(val coreSpec: CoreSpec) {
+enum class Style(internal val coreSpec: CoreSpec) {
SPRITZ(CoreSpec(
a1 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 4.0)),
a2 = TonalSpec(chroma = Chroma(ChromaStrategy.EQ, 4.0)),
@@ -105,7 +105,7 @@
)),
}
-public class ColorScheme(
+class ColorScheme(
@ColorInt seed: Int,
val darkTheme: Boolean,
val style: Style = Style.TONAL_SPOT
@@ -170,6 +170,7 @@
" accent1: ${humanReadable(accent1)}\n" +
" accent2: ${humanReadable(accent2)}\n" +
" accent3: ${humanReadable(accent3)}\n" +
+ " style: $style\n" +
"}"
}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
index ffac26b..1ef5324 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
@@ -159,9 +159,9 @@
public Supplier<Icon> iconSupplier;
public int state = DEFAULT_STATE;
public CharSequence label;
- public CharSequence secondaryLabel;
+ @Nullable public CharSequence secondaryLabel;
public CharSequence contentDescription;
- public CharSequence stateDescription;
+ @Nullable public CharSequence stateDescription;
public CharSequence dualLabelContentDescription;
public boolean disabledByPolicy;
public boolean dualTarget = false;
@@ -170,6 +170,7 @@
public SlashState slash;
public boolean handlesLongClick = true;
public boolean showRippleEffect = true;
+ @Nullable
public Drawable sideViewCustomDrawable;
public String spec;
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
index 1e142ea..e64b586 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml
@@ -46,8 +46,6 @@
android:clipChildren="false"
android:clipToPadding="false"
android:paddingTop="@dimen/keyguard_security_view_top_margin"
- android:paddingStart="@dimen/keyguard_security_view_lateral_margin"
- android:paddingEnd="@dimen/keyguard_security_view_lateral_margin"
android:layout_gravity="center"
android:gravity="center">
</com.android.keyguard.KeyguardSecurityViewFlipper>
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml
index e1550aa..e77e084 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_password_view.xml
@@ -25,6 +25,7 @@
android:layout_height="match_parent"
androidprv:layout_maxWidth="@dimen/keyguard_security_width"
androidprv:layout_maxHeight="@dimen/keyguard_security_height"
+ android:layout_gravity="center_horizontal|bottom"
android:gravity="bottom"
>
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml
index f613a19..231ead8 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_pattern_view.xml
@@ -28,6 +28,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
androidprv:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_gravity="center_horizontal|bottom"
android:clipChildren="false"
android:clipToPadding="false">
@@ -65,6 +66,7 @@
android:orientation="vertical"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginTop="@dimen/keyguard_eca_top_margin"
+ android:layout_marginBottom="@dimen/keyguard_eca_bottom_margin"
android:gravity="center_horizontal" />
</com.android.keyguard.KeyguardPatternView>
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
index 94566c7..7ce6f0e 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_pin_view.xml
@@ -25,6 +25,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
androidprv:layout_maxWidth="@dimen/keyguard_security_width"
+ android:layout_gravity="center_horizontal|bottom"
android:orientation="vertical"
>
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml
index 3e34e4b..b765f49 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_sim_pin_view.xml
@@ -25,7 +25,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
androidprv:layout_maxWidth="@dimen/keyguard_security_width"
- android:gravity="center_horizontal">
+ android:layout_gravity="center_horizontal|bottom">
<Space
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml
index d5510e9..917ea6b 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_sim_puk_view.xml
@@ -26,7 +26,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
androidprv:layout_maxWidth="@dimen/keyguard_security_width"
- android:gravity="center_horizontal">
+ android:layout_gravity="center_horizontal|bottom">
<Space
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml
index 74a7123..9cf1793 100644
--- a/packages/SystemUI/res-keyguard/values-af/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-af/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Toestel is handmatig gesluit"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nie herken nie"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie herken nie"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Skakel "<b>"kameratoegang"</b>" in Instellings > Privaatheid aan om Gesigslot te gebruik"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Voer SIM-PIN in. Jy het <xliff:g id="NUMBER_1">%d</xliff:g> pogings oor.</item>
<item quantity="one">Voer SIM-PIN in. Jy het <xliff:g id="NUMBER_0">%d</xliff:g> poging oor voordat jy jou diensverskaffer moet kontak om jou toestel te ontsluit.</item>
diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml
index ef97693..2d436c8 100644
--- a/packages/SystemUI/res-keyguard/values-am/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-am/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"መሣሪያ በተጠቃሚው ራሱ ተቆልፏል"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"አልታወቀም"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"አልታወቀም"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"በመልክ መክፈትን ለመጠቀም "<b>"የካሜራ መዳረሻ"</b>"ን በቅንብሮች እና ግላዊነት ውስጥ ያብሩ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">የሲም ፒን ያስገቡ። <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>
<item quantity="other">የሲም ፒን ያስገቡ። <xliff:g id="NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል።</item>
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index d44a861..9c73b9d 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -105,6 +105,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"تم حظر الجهاز يدويًا"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"لم يتم التعرف عليها."</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"لم يتم التعرّف عليه."</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"لاستخدام ميزة \"فتح الجهاز بالتعرف على الوجه\"، عليك منح إذن "<b>"الوصول إلى الكاميرا"</b>" في الإعدادات > الخصوصية."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="zero">أدخل رقم التعريف الشخصي لشريحة SIM. تتبقى لديك <xliff:g id="NUMBER_1">%d</xliff:g> محاولة.</item>
<item quantity="two">أدخل رقم التعريف الشخصي لشريحة SIM. تتبقى لديك محاولتان (<xliff:g id="NUMBER_1">%d</xliff:g>).</item>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
index ab50326..e9c20b5 100644
--- a/packages/SystemUI/res-keyguard/values-as/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইচটো মেনুৱেলভাৱে লক কৰা হৈছিল"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"চিনাক্ত কৰিব পৰা নাই"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"চিনাক্ত কৰিব পৰা নাই"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ফেচ আনলক সুবিধাটো ব্যৱহাৰ কৰিবলৈ ছেটিং > গোপনীয়তাত "<b>"কেমেৰাৰ এক্সেছ"</b>" অন কৰক"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">ছিমৰ পিন দিয়ক। আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g>বাৰ প্ৰয়াস কৰিব পাৰে।</item>
<item quantity="other">ছিমৰ পিন দিয়ক। আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g>বাৰ প্ৰয়াস কৰিব পাৰে।</item>
diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml
index 6153591..f9c67cb 100644
--- a/packages/SystemUI/res-keyguard/values-az/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-az/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihaz əl ilə kilidləndi"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Tanınmır"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmır"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Üz ilə Kiliddən Açma funksiyasını istifadə etmək üçün Ayarlar > Məxfilik bölməsində "<b>"Kameraya girişi"</b>" aktiv edin"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM PIN-ni daxil edin. <xliff:g id="NUMBER_1">%d</xliff:g> cəhdiniz qalır.</item>
<item quantity="one">SIM PIN-ni daxil edin. Cihazınızı kiliddən çıxarmaq üçün operatorunuzla əlaqə saxlamadan öncə <xliff:g id="NUMBER_0">%d</xliff:g> cəhdiniz qalır.</item>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index 52bbd4b..647e786 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -96,6 +96,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nije prepoznat"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznat"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da biste koristili otključavanje licem, uključite "<b>"pristup kameri"</b>" u odeljku Podešavanja > Privatnost"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
<item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index d18fefa3..adcedff 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Прылада была заблакіравана ўручную"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Не распазнана"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распазнана"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Каб выкарыстоўваць распазнаванне твару, уключыце "<b>"доступ да камеры"</b>" праз раздзел \"Налады > Прыватнасць\""</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Увядзіце PIN-код SIM-карты. У вас засталася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item>
<item quantity="few">Увядзіце PIN-код SIM-карты. У вас засталося <xliff:g id="NUMBER_1">%d</xliff:g> спробы.</item>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 256672b..348b46c 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройството бе заключено ръчно"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Не е разпознато"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Не е разпознато"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"За да използвате функцията „Отключване с лице“, включете "<b>"достъпа до камерата"</b>" от „Настройки > Поверителност“"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Въведете ПИН кода за SIM картата – остават ви <xliff:g id="NUMBER_1">%d</xliff:g> опита.</item>
<item quantity="one">Въведете ПИН кода за SIM картата – остава ви <xliff:g id="NUMBER_0">%d</xliff:g> опит, преди да се наложи да се свържете с оператора си, за да отключите устройството.</item>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 74fed29..0dc7052 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইসটিকে ম্যানুয়ালি লক করা হয়েছে"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"শনাক্ত করা যায়নি"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"শনাক্ত করা যায়নি"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"\'ফেস আনলক\' ফিচার ব্যবহার করতে \'সেটিংস ও গোপনীয়তা\' বিকল্পে গিয়ে "<b>"ক্যামেরায় অ্যাক্সেস দিন"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">সিমের পিন লিখুন। আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন।</item>
<item quantity="other">সিমের পিন লিখুন। আপনি আর <xliff:g id="NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন।</item>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index ef15ce3..86238b1 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -96,6 +96,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nije prepoznato"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da koristite otključavanje licem, uključite "<b>"Pristup kameri"</b>" u meniju Postavke > Privatnost"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
<item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 5a71f37..5c315db 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositiu s\'ha bloquejat manualment"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"No s\'ha reconegut"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"No s\'ha reconegut"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Per utilitzar Desbloqueig facial, activa "<b>"Accés a la càmera"</b>" a Configuració > Privadesa"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Introdueix el PIN de la SIM. Et queden <xliff:g id="NUMBER_1">%d</xliff:g> intents.</item>
<item quantity="one">Introdueix el PIN de la SIM. Et queda <xliff:g id="NUMBER_0">%d</xliff:g> intent; si no l\'encertes, contacta amb l\'operador de telefonia mòbil per desbloquejar el dispositiu.</item>
diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml
index 41300fc..f5ef1bb 100644
--- a/packages/SystemUI/res-keyguard/values-cs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zařízení bylo ručně uzamčeno"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nerozpoznáno"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznáno"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pokud chcete používat odemknutí obličejem, v Nastavení > Soukromí zapnetě "<b>"přístup k fotoaparátu"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="few">Zadejte PIN SIM karty. Zbývají <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item>
<item quantity="many">Zadejte PIN SIM karty. Zbývá <xliff:g id="NUMBER_1">%d</xliff:g> pokusu.</item>
diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml
index 01ea136..c008f74 100644
--- a/packages/SystemUI/res-keyguard/values-da/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-da/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheden blev låst manuelt"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ikke genkendt"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke genkendt"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Hvis du vil bruge ansigtslåsen, skal du aktivere "<b>"Kameraadgang"</b>" under Indstillinger > Privatliv"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Angiv pinkoden til SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item>
<item quantity="other">Angiv pinkoden til SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøg tilbage.</item>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 0d6728a..87c1bf4 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Gerät manuell gesperrt"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nicht erkannt"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nicht erkannt"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Wenn du die Entsperrung per Gesichtserkennung verwenden möchtest, aktiviere in den Einstellungen unter „Datenschutz“ die Option "<b>"Kamerazugriff"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Gib die PIN für die SIM-Karte ein. Du hast noch <xliff:g id="NUMBER_1">%d</xliff:g> Versuche.</item>
<item quantity="one">Gib die PIN für die SIM-Karte ein. Du hast noch <xliff:g id="NUMBER_0">%d</xliff:g> Versuch, bevor das Gerät nur noch vom Mobilfunkanbieter entsperrt werden kann.</item>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 518f2e2..f04747f 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Η συσκευή κλειδώθηκε με μη αυτόματο τρόπο"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Δεν αναγνωρίστηκε"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Δεν αναγνωρίστηκε"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Για να χρησιμοποιήσετε τη λειτουργία Ξεκλείδωμα με το πρόσωπο, ενεργοποιήστε την επιλογή "<b>"Πρόσβαση στην κάμερα"</b>" από το μενού Ρυθμίσεις > Απόρρητο"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Εισαγάγετε τον αριθμό PIN της κάρτας SIM. Απομένουν άλλες <xliff:g id="NUMBER_1">%d</xliff:g> προσπάθειες.</item>
<item quantity="one">Εισαγάγετε τον αριθμό PIN της κάρτας SIM. Απομένει άλλη <xliff:g id="NUMBER_0">%d</xliff:g> προσπάθεια. Στη συνέχεια, θα πρέπει να επικοινωνήσετε με τον πάροχο κινητής τηλεφωνίας, για να ξεκλειδώσετε τη συσκευή.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
index e2db3b1..eb3a5be 100644
--- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognised"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
index 6c9ddb8..9cb8227 100644
--- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognised"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
index e2db3b1..eb3a5be 100644
--- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognised"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
index e2db3b1..eb3a5be 100644
--- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognised"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your operator to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
index 9c32604..cc61057 100644
--- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Not recognized"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognized"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"To use Face Unlock, turn on "<b>"Camera access"</b>" in Settings > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_0">%d</xliff:g> remaining attempt before you must contact your carrier to unlock your device.</item>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index 7be89b6..74db06d 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se bloqueó de forma manual"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"No se reconoció"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoció"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar Desbloqueo facial, activa el "<b>"Acceso a la cámara"</b>" en Configuración y privacidad"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Ingresa el PIN de la SIM. Quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos más.</item>
<item quantity="one">Ingresa el PIN de la SIM. Queda <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que debas comunicarte con tu proveedor para desbloquear el dispositivo.</item>
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index b0f9f33..d833b06 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se ha bloqueado manualmente"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"No se reconoce"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoce"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar Desbloqueo Facial, habilita el "<b>"acceso a la cámara"</b>" en Ajustes y privacidad"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Introduce el PIN de la tarjeta SIM. Te quedan <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item>
<item quantity="one">Introduce el PIN de la tarjeta SIM. Te queda <xliff:g id="NUMBER_0">%d</xliff:g> intento para tener que ponerte en contacto con tu operador para desbloquear el dispositivo.</item>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index 58b870f..0cd86dd 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Seade lukustati käsitsi"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ei tuvastatud"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tuvastatud"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Näoga avamise kasutamiseks lülitage menüüs Seaded > Privaatsus sisse "<b>"juurdepääs kaamerale"</b>"."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Sisestage SIM-kaardi PIN-kood. Jäänud on <xliff:g id="NUMBER_1">%d</xliff:g> katset.</item>
<item quantity="one">Sisestage SIM-kaardi PIN-kood. Jäänud on <xliff:g id="NUMBER_0">%d</xliff:g> katse enne, kui peate seadme avamiseks ühendust võtma operaatoriga.</item>
diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml
index 2366156..580399d 100644
--- a/packages/SystemUI/res-keyguard/values-eu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Eskuz blokeatu da gailua"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ez da ezagutu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ez da ezagutu"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu "<b>"kamera atzitzeko baimena"</b>" Ezarpenak > Pribatutasuna atalean"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Idatzi SIMaren PINa. <xliff:g id="NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu.</item>
<item quantity="one">Idatzi SIMaren PINa. <xliff:g id="NUMBER_0">%d</xliff:g> saiakera geratzen zaizu; oker idatziz gero, operadoreari eskatu beharko diozu gailua desblokeatzeko.</item>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index e110d08..a21507e 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"دستگاه بهصورت دستی قفل شده است"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"شناسایی نشد"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"شناسایی نشد"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"برای استفاده از «قفلگشایی با چهره»، "<b>"دسترسی به دوربین"</b>" را در «تنظیمات > حریمخصوصی» روشن کنید"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">پین سیمکارت را وارد کنید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش دیگری باقی مانده است.</item>
<item quantity="other">پین سیمکارت را وارد کنید. <xliff:g id="NUMBER_1">%d</xliff:g> تلاش دیگری باقی مانده است.</item>
diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml
index 82927e1..f0826e5 100644
--- a/packages/SystemUI/res-keyguard/values-fi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Laite lukittiin manuaalisesti"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ei tunnistettu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tunnistettu"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Jos haluat käyttää kasvojentunnistusavausta, valitse Asetukset > Yksityisyys ja laita "<b>"Pääsy kameraan"</b>" päälle"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Anna SIM-kortin PIN-koodi. Sinulla on <xliff:g id="NUMBER_1">%d</xliff:g> yritystä jäljellä.</item>
<item quantity="one">Anna SIM-kortin PIN-koodi. <xliff:g id="NUMBER_0">%d</xliff:g> yrityksen jälkeen laite lukittuu, ja vain operaattori voi avata sen.</item>
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 3646394..dada709 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"L\'appareil a été verrouillé manuellement"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Doigt non reconnu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Doigt non reconnu"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pour utiliser le déverrouillage par reconnaissance faciale, activez l\'"<b>"accès à l\'appareil photo"</b>" dans Paramètres > Confidentialité"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
<item quantity="other">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 6e1ee96..d19db43 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Appareil verrouillé manuellement"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Non reconnu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Non reconnu"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pour utiliser Face Unlock, activez "<b>"Accès à l\'appareil photo"</b>" dans Paramètres > Confidentialité"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Saisissez le code de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentative restante.</item>
<item quantity="other">Saisissez le code de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentatives restantes.</item>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index 123b8c1..bfbcf9d7 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo bloqueouse manualmente"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Non se recoñeceu"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Non se recoñeceu"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o desbloqueo facial, activa "<b>"Acceso á cámara"</b>" en Configuración > Privacidade"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Introduce o código PIN da SIM. Quédanche <xliff:g id="NUMBER_1">%d</xliff:g> intentos.</item>
<item quantity="one">Introduce o código PIN da SIM. Quédache <xliff:g id="NUMBER_0">%d</xliff:g> intento antes de que teñas que contactar co operador para desbloquear o dispositivo.</item>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index 1ca39d7..c804ec0 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ઉપકરણ મેન્યુઅલી લૉક કર્યું હતું"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ઓળખાયેલ નથી"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ઓળખાયેલ નથી"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ફેસ અનલૉક સુવિધાનો ઉપયોગ કરવા માટે, સેટિંગ > પ્રાઇવસીમાં જઈને "<b>"કૅમેરા ઍક્સેસ"</b>" ચાલુ કરો"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">સિમનો પિન દાખલ કરો, તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે.</item>
<item quantity="other">સિમનો પિન દાખલ કરો, તમારી પાસે <xliff:g id="NUMBER_1">%d</xliff:g> પ્રયાસો બાકી છે.</item>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index e017a6b..a571a2a 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिवाइस को मैन्युअल रूप से लॉक किया गया था"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"पहचान नहीं हो पाई"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"पहचान नहीं हो पाई"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फ़ेस अनलॉक की सुविधा का इस्तेमाल करने के लिए, सेटिंग और निजता में जाकर, "<b>"कैमरे का ऐक्सेस"</b>" चालू करें"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">सिम का पिन डालें. आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> मौके बचे हैं.</item>
<item quantity="other">सिम का पिन डालें. आपके पास <xliff:g id="NUMBER_1">%d</xliff:g> मौके बचे हैं.</item>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index 123f423..1a40d46 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -96,6 +96,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nije prepoznat"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Da biste koristili otključavanje licem, uključite opciju "<b>"Pristup kameri"</b>" u odjeljku Postavke > Privatnost"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaj.</item>
<item quantity="few">Unesite PIN za SIM. Imate još <xliff:g id="NUMBER_1">%d</xliff:g> pokušaja.</item>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 47b49a4..47a1c61 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Az eszközt manuálisan lezárták"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nem ismerhető fel"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nem ismerhető fel"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Az Arcalapú feloldás funkció használatához kapcsolja be a "<b>"Hozzáférés a kamerához"</b>" beállítást a Beállítások > Adatvédelem szakaszban."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Adja meg a SIM-kártya PIN-kódját. <xliff:g id="NUMBER_1">%d</xliff:g> próbálkozása maradt.</item>
<item quantity="one">Adja meg a SIM-kártya PIN-kódját. <xliff:g id="NUMBER_0">%d</xliff:g> próbálkozása maradt. Ha elfogynak a próbálkozási lehetőségek, az eszköz feloldásához fel kell vennie a kapcsolatot szolgáltatójával.</item>
diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml
index 16bbb07..923d762 100644
--- a/packages/SystemUI/res-keyguard/values-hy/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Սարքը կողպվել է ձեռքով"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Չհաջողվեց ճանաչել"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Չհաջողվեց ճանաչել"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Դեմքով ապակողպումն օգտագործելու համար անցեք Կարգավորումներ > Գաղտնիություն և տրամադրեք "<b>"տեսախցիկն օգտագործելու թույլտվություն"</b>"։"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Մուտքագրեք SIM քարտի PIN կոդը: Մնացել է <xliff:g id="NUMBER_1">%d</xliff:g> փորձ:</item>
<item quantity="other">Մուտքագրեք SIM քարտի PIN կոդը: Մնացել է <xliff:g id="NUMBER_1">%d</xliff:g> փորձ:</item>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index 757e6a5..559069b 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Perangkat dikunci secara manual"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Tidak dikenali"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Untuk menggunakan Face Unlock, aktifkan "<b>"Akses kamera"</b>" di Setelan > Privasi"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Masukkan PIN SIM. Tersisa <xliff:g id="NUMBER_1">%d</xliff:g> percobaan.</item>
<item quantity="one">Masukkan PIN SIM. Tersisa <xliff:g id="NUMBER_0">%d</xliff:g> percobaan sebelum Anda harus menghubungi operator untuk membuka kunci perangkat.</item>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index 6dc8246..bec957f 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Tækinu var læst handvirkt"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Þekktist ekki"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Þekktist ekki"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Þú verður að kveikja á "<b>"aðgangi að myndavél"</b>" í „Stillingar > persónuvernd“ til að nota andlitskenni"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Sláðu inn PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraun eftir.</item>
<item quantity="other">Sláðu inn PIN-númer SIM-korts. Þú átt <xliff:g id="NUMBER_1">%d</xliff:g> tilraunir eftir.</item>
diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml
index 337d433..656a8bc 100644
--- a/packages/SystemUI/res-keyguard/values-it/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-it/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Il dispositivo è stato bloccato manualmente"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Non riconosciuto"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Non riconosciuto"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Per utilizzare lo sblocco con il volto, attiva "<b>"l\'accesso alla fotocamera"</b>" in Impostazioni > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="other">Inserisci il codice PIN della SIM. Hai ancora <xliff:g id="NUMBER_1">%d</xliff:g> tentativi a disposizione.</item>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 1ba6f83..e241beb 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"המכשיר ננעל באופן ידני"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"לא זוהתה"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"לא זוהתה"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"כדי להשתמש בתכונה \'פתיחה ע\"י זיהוי הפנים\', יש להפעיל את ה"<b>"גישה למצלמה"</b>" בהגדרות > פרטיות"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="two">יש להזין קוד אימות של כרטיס SIM. נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות נוספים.</item>
<item quantity="many">יש להזין קוד אימות של כרטיס SIM. נותרו לך <xliff:g id="NUMBER_1">%d</xliff:g> ניסיונות נוספים.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 1acc14c..6e6adba 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"デバイスは手動でロックされました"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"認識されませんでした"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"認識されませんでした"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"顔認証を使用するには、[設定] > [プライバシー] で"<b>"カメラへのアクセス"</b>"を有効にしてください"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM PIN を入力してください。入力できるのはあと <xliff:g id="NUMBER_1">%d</xliff:g> 回です。</item>
<item quantity="one">SIM PIN を入力してください。入力できるのはあと <xliff:g id="NUMBER_0">%d</xliff:g> 回です。この回数を超えた場合は、携帯通信会社にお問い合わせください。</item>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index 2f38e64..c728471 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"მოწყობილობა ხელით ჩაიკეტა"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"არ არის ამოცნობილი"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"არ არის ამოცნობილი"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"იმისთვის, რომ სახით განბლოკვით ისარგებლოთ, ჩართეთ "<b>"კამერაზე წვდომა"</b>" პარამეტრებსა და კონფიდენციალურობაში"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">შეიყვანეთ SIM ბარათის PIN-კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER_1">%d</xliff:g> მცდელობა.</item>
<item quantity="one">შეიყვანეთ SIM ბარათის PIN-კოდი. თქვენ დაგრჩათ <xliff:g id="NUMBER_0">%d</xliff:g> მცდელობა, რომლის შემდეგაც მოწყობილობის განსაბლოკად დაგჭირდებათ თქვენს ოპერატორთან დაკავშირება.</item>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index c7a1713..b192f02 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Құрылғы қолмен құлыпталды"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Танылмады"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Танылмады"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Face Unlock функциясын пайдалану үшін \"Параметрлер > Құпиялылық\" бөлімінен "<b>"Камераны пайдалану рұқсатын"</b>" қосыңыз."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM PIN кодын енгізіңіз. <xliff:g id="NUMBER_1">%d</xliff:g> мүмкіндік қалды, одан кейін оператордан SIM картасының құлпын ашуды сұрауға тура келеді.</item>
<item quantity="one">SIM PIN кодын енгізіңіз. <xliff:g id="NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін оператордан SIM картасының құлпын ашуды сұрауға тура келеді.</item>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 388d4fc..e31621e 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ឧបករណ៍ត្រូវបានចាក់សោដោយអ្នកប្រើផ្ទាល់"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"មិនអាចសម្គាល់បានទេ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"មិនអាចសម្គាល់បានទេ"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ដើម្បីប្រើមុខងារដោះសោតាមទម្រង់មុខ សូមបើក"<b>"ការចូលប្រើកាមេរ៉ា"</b>"នៅក្នុងការកំណត់ > ឯកជនភាព"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">បញ្ចូលកូដ PIN របស់ស៊ីម។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="NUMBER_1">%d</xliff:g> ដងទៀត។</item>
<item quantity="one">បញ្ចូលកូដ PIN របស់ស៊ីម។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="NUMBER_0">%d</xliff:g> ដងទៀត មុនពេលដែលអ្នកត្រូវទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នកដើម្បីដោះសោឧបករណ៍របស់អ្នក។</item>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index 9279fad..eeb8cbf 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ಸಾಧನವನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಬಳಸಲು, ಸೆಟ್ಟಿಂಗ್ಗಳು > ಗೌಪ್ಯತೆ ಎಂಬಲ್ಲಿ "<b>"ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು"</b>" ಆನ್ ಮಾಡಿ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ. ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ.</item>
<item quantity="other">ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ. ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index 761ccfa..e9b83d1 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"기기가 수동으로 잠금 설정되었습니다."</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"인식할 수 없음"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"인식할 수 없음"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"얼굴 인식 잠금 해제를 사용하려면 설정 > 개인 정보 보호에서 "<b>"카메라 액세스"</b>"를 사용 설정하세요."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM PIN을 입력하세요. 입력은 <xliff:g id="NUMBER_1">%d</xliff:g>번 더 시도할 수 있습니다.</item>
<item quantity="one">SIM PIN을 입력하세요. 입력에 <xliff:g id="NUMBER_0">%d</xliff:g>번 더 실패하면 이동통신사에 문의하여 기기를 잠금 해제해야 합니다.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 216c978..dd2c2f7 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Түзмөк кол менен кулпуланды"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Таанылган жок"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Таанылган жок"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Жүзүнөн таанып ачуу функциясын колдонуу үчүн Жөндөөлөр > Купуялык бөлүмүнө өтүп, "<b>"Камераны колдонууну"</b>" күйгүзүңүз"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM-картанын PIN кодун киргизиңиз. Сизде <xliff:g id="NUMBER_1">%d</xliff:g> аракет калды.</item>
<item quantity="one">SIM-картанын PIN кодун киргизиңиз. Сизде <xliff:g id="NUMBER_0">%d</xliff:g> аракет калды, андан кийин түзмөктү бөгөттөн чыгаруу үчүн байланыш операторуна кайрылышыңыз керек болот.</item>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index a9dd139..611c666 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ອຸປະກອນຖືກສັ່ງໃຫ້ລັອກ"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ບໍ່ຮູ້ຈັກ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ບໍ່ຮູ້ຈັກ"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ເພື່ອໃຊ້ການປົດລັອກດ້ວຍໜ້າ, ກະລຸນາເປີດໃຊ້ "<b>"ສິດເຂົ້າເຖິງກ້ອງຖ່າຍຮູບ"</b>" ໃນການຕັ້ງຄ່າ > ຄວາມເປັນສ່ວນຕົວ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">ລະຫັດ SIM PIN ບໍ່ຖືກຕ້ອງ. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_1">%d</xliff:g> ເທື່ອ.</item>
<item quantity="one">ໃສ່ລະຫັດ SIM PIN. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ຈະຕ້ອງຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການເພື່ອປົດລັອກ.</item>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index 20164a1..08ddb74 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Įrenginys užrakintas neautomatiškai"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Neatpažinta"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Neatpažinta"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Jei norite naudoti atrakinimą pagal veidą, įjunkite parinktį "<b>"Prieiga prie fotoaparato"</b>" skiltyje „Nustatymai“ > „Privatumas“"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymas.</item>
<item quantity="few">Įveskite SIM kortelės PIN kodą. Jums liko <xliff:g id="NUMBER_1">%d</xliff:g> bandymai.</item>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index 238b706..13fcfae 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -96,6 +96,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Ierīce tika bloķēta manuāli."</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nav atpazīts"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nav atpazīts"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Lai izmantotu autorizāciju pēc sejas, sadaļā Iestatījumi > Konfidencialitāte ieslēdziet opciju "<b>"Piekļuve kamerai"</b>"."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="zero">Ievadiet SIM kartes PIN. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizes.</item>
<item quantity="one">Ievadiet SIM kartes PIN. Varat mēģināt vēl <xliff:g id="NUMBER_1">%d</xliff:g> reizi.</item>
diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml
index f4c3dde..5cf025c 100644
--- a/packages/SystemUI/res-keyguard/values-mk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уредот е заклучен рачно"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Непознат"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Непознат"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"За да користите „Отклучување со лик“, вклучете "<b>"Пристап до камерата"</b>" во „Поставки > Приватност“"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Внесете PIN-код за SIM-картичката. Ви преостанува уште <xliff:g id="NUMBER_1">%d</xliff:g> обид.</item>
<item quantity="other">Внесете PIN-код за SIM-картичката. Ви преостануваат уште <xliff:g id="NUMBER_1">%d</xliff:g> обиди.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 06228c6c..30e2081 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ഉപകരണം നേരിട്ട് ലോക്കുചെയ്തു"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"തിരിച്ചറിയുന്നില്ല"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"തിരിച്ചറിയുന്നില്ല"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ഫെയ്സ് അൺലോക്ക് ഉപയോഗിക്കാൻ, ക്രമീകരണം > സ്വകാര്യത എന്നതിൽ "<b>"ക്യാമറാ ആക്സസ്"</b>" ഓണാക്കുക"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">സിം പിൻ നൽകുക. നിങ്ങൾക്ക് <xliff:g id="NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു.</item>
<item quantity="one">സിം പിൻ നൽകുക. ഉപകരണം അൺലോക്ക് ചെയ്യാൻ കാരിയറുമായി ബന്ധപ്പെടേണ്ടിവരുന്നതിന് മുമ്പ് <xliff:g id="NUMBER_0">%d</xliff:g> ശ്രമം കൂടി ശേഷിക്കുന്നു.</item>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index db1396b..0ea710c 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Төхөөрөмжийг гараар түгжсэн"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Таньж чадсангүй"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Таньж чадсангүй"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Царайгаар түгжээ тайлахыг ашиглахын тулд Тохиргоо > Нууцлал хэсэгт "<b>" Камерын хандалтыг "</b>" асаана уу"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM-н ПИН кодыг оруулна уу. Танд <xliff:g id="NUMBER_1">%d</xliff:g> оролдлого үлдлээ.</item>
<item quantity="one">SIM-н ПИН кодыг оруулна уу. Танд оператор компанитайгаа холбогдохгүйгээр төхөөрөмжийн түгжээг тайлах <xliff:g id="NUMBER_0">%d</xliff:g> оролдлого үлдлээ.</item>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index b83ef6bb..647d132 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिव्हाइस मॅन्युअली लॉक केले होते"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ओळखले नाही"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ओळखले नाही"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फेस अनलॉक वापरण्यासाठी, सेटिंग्ज > गोपनीयता येथे "<b>"कॅमेरा अॅक्सेस"</b>" सुरू करा"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">सिम पिन एंटर करा, तुमच्याकडे <xliff:g id="NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत.</item>
<item quantity="one">सिम पिन एंटर करा. तुम्ही तुमचे डिव्हाइस अनलॉक करण्यासाठी तुमच्या वाहकाशी संपर्क साधण्यापूर्वी, तुमच्याकडे <xliff:g id="NUMBER_0">%d</xliff:g> प्रयत्न शिल्लक आहे.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index 4205a2d..88dfd68 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Peranti telah dikunci secara manual"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Tidak dikenali"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Untuk menggunakan Buka Kunci Wajah, hidupkan "<b>"akses Kamera"</b>" dalam Tetapan > Privasi"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Masukkan PIN SIM. Tinggal <xliff:g id="NUMBER_1">%d</xliff:g> percubaan lagi.</item>
<item quantity="one">Masukkan PIN SIM. Tinggal <xliff:g id="NUMBER_0">%d</xliff:g> percubaan lagi sebelum anda perlu menghubungi pembawa anda untuk membuka kunci peranti.</item>
diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml
index 6ce5c05..de879b1 100644
--- a/packages/SystemUI/res-keyguard/values-my/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-my/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"စက်ပစ္စည်းကို ကိုယ်တိုင်ကိုယ်ကျ လော့ခ်ချထားခဲ့သည်"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"မသိ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"မသိ"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"မျက်နှာပြ လော့ခ်ဖွင့်ခြင်းကို သုံးရန် "<b>"ကင်မရာ သုံးခွင့်"</b>" ကို ‘ဆက်တင်များ > ကန့်သတ်ဆက်တင်’ တွင်ဖွင့်ပါ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">ဆင်းမ်ကတ် ပင်နံပါတ် ထည့်ပါ။ <xliff:g id="NUMBER_1">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့်ရှိပါသေးသည်။</item>
<item quantity="one">ဆင်းမ်ကတ် ပင်နံပါတ် ထည့်ပါ။ သင့်စက်ကို လော့ခ်ဖွင့်ပေးရန်အတွက် ဝန်ဆောင်မှုပေးသူသို့ မဆက်သွယ်မီ <xliff:g id="NUMBER_0">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့်ရှိပါသေးသည်။</item>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 890afc0..c7d6613 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten ble låst manuelt"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ikke gjenkjent"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke gjenkjent"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"For å bruke ansiktslås, slå på "<b>"Kameratilgang"</b>" i Innstillinger > Personvern"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Skriv inn PIN-koden for SIM-kortet. Du har <xliff:g id="NUMBER_1">%d</xliff:g> forsøk igjen.</item>
<item quantity="one">Skriv inn PIN-koden for SIM-kortet. Du har <xliff:g id="NUMBER_0">%d</xliff:g> forsøk igjen før du må kontakte operatøren din for å låse opp enheten.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 57d9d95..16ece5d 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"यन्त्रलाई म्यानुअल तरिकाले लक गरिएको थियो"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"पहिचान भएन"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"पहिचान भएन"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"फेस अनलक प्रयोग गर्न \"सेटिङ तथा गोपनीयता\" मा गई "<b>"क्यामेरा प्रयोग गर्ने अनुमति"</b>" दिनुहोस्"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM को PIN प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="NUMBER_1">%d</xliff:g> प्रयासहरू बाँकी छन्।</item>
<item quantity="one">SIM को PIN प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि भने आफ्नो डिभाइस अनलक गर्नका लागि तपाईंले अनिवार्य रूपमा आफ्नो सेवा प्रदायकलाई सम्पर्क गर्नु पर्ने हुन्छ।</item>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index 11f29ef..bf1906d 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Apparaat is handmatig vergrendeld"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Niet herkend"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Niet herkend"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Als je Ontgrendelen via gezichtsherkenning wilt gebruiken, zet je "<b>"Cameratoegang"</b>" aan via Instellingen > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_1">%d</xliff:g> pogingen over.</item>
<item quantity="one">Geef de pincode van de simkaart op. Je hebt nog <xliff:g id="NUMBER_0">%d</xliff:g> poging over voordat je contact met je provider moet opnemen om het apparaat te ontgrendelen.</item>
diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml
index 8a6c2449..3b20dcb 100644
--- a/packages/SystemUI/res-keyguard/values-or/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-or/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ଡିଭାଇସ୍ ମାନୁଆଲ ଭାବେ ଲକ୍ କରାଗଲା"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ଫେସ ଅନଲକ ବ୍ୟବହାର କରିବା ପାଇଁ, ସେଟିଂସ ଏବଂ ଗୋପନୀୟତାରେ "<b>"କ୍ୟାମେରା ଆକ୍ସେସ"</b>"କୁ ଚାଲୁ କରନ୍ତୁ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM PIN ପ୍ରବେଶ କରନ୍ତୁ। ଆପଣଙ୍କ ପାଇଁ <xliff:g id="NUMBER_1">%d</xliff:g>ଟି ପ୍ରୟାସ ବଳକା ଅଛି।</item>
<item quantity="one">SIM PIN ପ୍ରବେଶ କରନ୍ତୁ। ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ଅନଲକ୍ କରିବା ପାଇଁ ପାଖରେ ବଳକା ଥିବା <xliff:g id="NUMBER_0">%d</xliff:g>ଟି ପ୍ରୟାସର ବ୍ୟବହାର କରିବା ପୂର୍ବରୁ ନିଜର କେରିଅର୍ଙ୍କୁ ସମ୍ପର୍କ କରନ୍ତୁ।</item>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index f40e09e..afc8897 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ਡੀਵਾਈਸ ਨੂੰ ਹੱਥੀਂ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ਫ਼ੇਸ ਅਣਲਾਕ ਨੂੰ ਵਰਤਣ ਲਈ, ਸੈਟਿੰਗਾਂ > ਪਰਦੇਦਾਰੀ ਵਿੱਚ ਜਾ ਕੇ "<b>"ਕੈਮਰਾ ਪਹੁੰਚ"</b>" ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ।</item>
<item quantity="other">ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ। ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ।</item>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index 2d53dcc..0b45e36 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Urządzenie zostało zablokowane ręcznie"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nie rozpoznano"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie rozpoznano"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Aby używać rozpoznawania twarzy, włącz "<b>"dostęp do aparatu"</b>" w Ustawieniach i prywatności"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="few">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> próby.</item>
<item quantity="many">Wpisz kod PIN karty SIM. Masz jeszcze <xliff:g id="NUMBER_1">%d</xliff:g> prób.</item>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
index 9fd9b1f..d69b62b 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Não reconhecido"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o Desbloqueio facial, ative o "<b>"acesso à câmera"</b>" em Configurações > Privacidade"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Informe o PIN do chip. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativa restante.</item>
<item quantity="other">Informe o PIN do chip. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativas restantes.</item>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index da663f0..d3f5802 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Não reconhecido."</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido."</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para utilizar o Desbloqueio facial, ative o "<b>"Acesso à câmara"</b>" em Definições > Privacidade"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Introduza o PIN do cartão SIM. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de ser necessário contactar o operador para desbloquear o dispositivo.</item>
<item quantity="other">Introduza o PIN do cartão SIM. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item>
diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml
index 9fd9b1f..d69b62b 100644
--- a/packages/SystemUI/res-keyguard/values-pt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Não reconhecido"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para usar o Desbloqueio facial, ative o "<b>"acesso à câmera"</b>" em Configurações > Privacidade"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Informe o PIN do chip. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativa restante.</item>
<item quantity="other">Informe o PIN do chip. Você tem <xliff:g id="NUMBER_1">%d</xliff:g> tentativas restantes.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml
index be6aea0..2671076 100644
--- a/packages/SystemUI/res-keyguard/values-ro/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml
@@ -96,6 +96,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Dispozitivul a fost blocat manual"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nu este recunoscută"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nu este recunoscut"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Pentru a folosi Deblocarea facială, activați "<b>"Accesul la cameră"</b>" în Setări și confidențialitate"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="few">Introduceți codul PIN pentru cardul SIM. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> încercări.</item>
<item quantity="other">Introduceți codul PIN pentru cardul SIM. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> de încercări.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index 6e11d61..a91eef5 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройство было заблокировано вручную"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Не распознано"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распознано"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Чтобы использовать фейсконтроль, разрешите "<b>"доступ к камере"</b>". Для этого перейдите в настройки и нажмите \"Конфиденциальность\"."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Введите PIN-код. Осталась <xliff:g id="NUMBER_1">%d</xliff:g> попытка.</item>
<item quantity="few">Введите PIN-код. Осталось <xliff:g id="NUMBER_1">%d</xliff:g> попытки.</item>
diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml
index 902127d..d06c4a9 100644
--- a/packages/SystemUI/res-keyguard/values-si/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-si/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"උපාංගය හස්තීයව අගුලු දමන ලදී"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"හඳුනා නොගන්නා ලදී"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"හඳුනා නොගන්නා ලදී"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"මුහුණෙන් අගුලු හැරීම භාවිත කිරීමට, සැකසීම් > පෞද්ගලිකත්වය තුළ "<b>"කැමරා ප්රවේශය"</b>" ක්රියාත්මක කරන්න"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">SIM PIN ඇතුළු කරන්න, ඔබ සතුව උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>
<item quantity="other">SIM PIN ඇතුළු කරන්න, ඔබ සතුව උත්සාහයන් <xliff:g id="NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index 5e4c248..a48123e 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zariadenie bolo uzamknuté ručne"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nerozpoznané"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznané"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ak chcete používať odomknutie tvárou, v sekcii Nastavenia > Ochrana súkromia zapnite "<b>"prístup ku kamere"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="few">Zadajte kód PIN SIM karty. Zostávajú vám <xliff:g id="NUMBER_1">%d</xliff:g> pokusy.</item>
<item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index 149ac8e..4af9fe5 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Naprava je bila ročno zaklenjena"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Ni prepoznano"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Ni prepoznano"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Če želite uporabljati odklepanje z obrazom, v meniju »Nastavitve« > »Zasebnost« vklopite možnost "<b>"Dostop do fotoaparata"</b>"."</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskus.</item>
<item quantity="two">Vnesite kodo PIN kartice SIM. Na voljo imate še <xliff:g id="NUMBER_1">%d</xliff:g> poskusa.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 5fca45b..524f1c3 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Pajisja është kyçur manualisht"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Nuk njihet"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Nuk njihet"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Për të përdorur \"Shkyçjen me fytyrë\", aktivizo "<b>"Qasjen te kamera"</b>" te \"Cilësimet\" > \"Privatësia\""</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Fut kodin PIN të kartës SIM. Të kanë mbetur edhe <xliff:g id="NUMBER_1">%d</xliff:g> tentativa.</item>
<item quantity="one">Fut kodin PIN të kartës SIM. Të ka mbetur edhe <xliff:g id="NUMBER_0">%d</xliff:g> tentativë para se të duhet të kontaktosh me operatorin tënd celular për ta shkyçur pajisjen.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 7facbfb..0bb2cb4 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -96,6 +96,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уређај је ручно закључан"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Није препознат"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Није препознат"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Да бисте користили откључавање лицем, укључите "<b>"приступ камери"</b>" у одељку Подешавања > Приватност"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушај.</item>
<item quantity="few">Унесите PIN за SIM. Имате још <xliff:g id="NUMBER_1">%d</xliff:g> покушаја.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index f271dda..2af9bb5 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten har låsts manuellt"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Identifierades inte"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Identifierades inte"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Om du vill använda ansiktslås aktiverar du "<b>"Kameraåtkomst"</b>" i Inställningar > Integritet"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Ange pinkod för SIM-kortet. <xliff:g id="NUMBER_1">%d</xliff:g> försök återstår.</item>
<item quantity="one">Ange pinkod för SIM-kortet. <xliff:g id="NUMBER_0">%d</xliff:g> försök återstår innan du måste kontakta operatören för att låsa upp enheten.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml
index c84bef0..aaad8b9 100644
--- a/packages/SystemUI/res-keyguard/values-sw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Umefunga kifaa mwenyewe"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Haitambuliwi"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Haitambuliwi"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ili utumie kipengele cha kufungua kwa uso, washa kipengele cha "<b>"ufikiaji wa Kamera"</b>" katika Mipangilio na Faragha"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Weka PIN ya SIM. Zimesalia mara <xliff:g id="NUMBER_1">%d</xliff:g> za kujaribu.</item>
<item quantity="one">Weka PIN ya SIM. Ukijaribu tena mara <xliff:g id="NUMBER_0">%d</xliff:g> bila kufaulu, kifaa chako kitafungwa na utalazimika uwasiliane na mtoa huduma wako ili akifungue.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 151279e..ed9a5d4 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"பயனர் சாதனத்தைப் பூட்டியுள்ளார்"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"அடையாளங்காணபடவில்லை"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"அடையாளங்காணபடவில்லை"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"முகம் காட்டித் திறத்தல் அம்சத்தைப் பயன்படுத்த, அமைப்புகள் > தனியுரிமை என்பதற்குச் சென்று "<b>"கேமரா அணுகலை"</b>" இயக்கவும்"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">சிம் பின்னை உள்ளிடவும். மேலும், <xliff:g id="NUMBER_1">%d</xliff:g> வாய்ப்புகள் மீதமுள்ளன.</item>
<item quantity="one">சிம் பின்னை உள்ளிடவும். மீதமுள்ள <xliff:g id="NUMBER_0">%d</xliff:g> வாய்ப்பில் தவறுதலான பின் உள்ளிடப்பட்டால், உங்கள் தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்பு கொண்டு மட்டுமே சாதனத்தை அன்லாக் செய்ய முடியும்.</item>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index dfb0c81..0c184ab 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"పరికరం మాన్యువల్గా లాక్ చేయబడింది"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"గుర్తించలేదు"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"గుర్తించలేదు"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"ఫేస్ అన్లాక్ను ఉపయోగించడానికి, సెట్టింగ్లు > గోప్యతలో "<b>"కెమెరా యాక్సెస్"</b>"ను ఆన్ చేయండి"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM పిన్ని నమోదు చేయండి. మీకు <xliff:g id="NUMBER_1">%d</xliff:g> ప్రయత్నలు మిగిలి ఉన్నాయి.</item>
<item quantity="one">SIM పిన్ని నమోదు చేయండి, మీరు మీ పరికరాన్ని అన్లాక్ చేయడానికి తప్పనిసరిగా మీ క్యారియర్ను సంప్రదించడానికి ముందు మీకు <xliff:g id="NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది.</item>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index 25968b7..4d3c0b5 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"มีการล็อกอุปกรณ์ด้วยตัวเอง"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"ไม่รู้จัก"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"ไม่รู้จัก"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"หากต้องการใช้ปลดล็อกด้วยใบหน้า ให้เปิด"<b>"การเข้าถึงกล้อง"</b>"ในการตั้งค่าและความเป็นส่วนตัว"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">โปรดป้อน PIN ของซิม คุณพยายามได้อีก <xliff:g id="NUMBER_1">%d</xliff:g> ครั้ง</item>
<item quantity="one">โปรดป้อน PIN ของซิม คุณพยายามได้อีก <xliff:g id="NUMBER_0">%d</xliff:g> ครั้งก่อนที่จะต้องติดต่อผู้ให้บริการเพื่อปลดล็อกอุปกรณ์</item>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index 8927c9e..4c391e5 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Manual na na-lock ang device"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Hindi nakilala"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Hindi nakilala"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Para magamit ang Pag-unlock Gamit ang Mukha, i-on ang "<b>"Access sa camera"</b>" sa Mga Setting > Privacy"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Ilagay ang PIN ng SIM. Mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> natitirang pagsubok.</item>
<item quantity="other">Ilagay ang PIN ng SIM. Mayroon kang <xliff:g id="NUMBER_1">%d</xliff:g> na natitirang pagsubok.</item>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index 5ba351a..100f074d 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihazın manuel olarak kilitlendi"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Tanınmadı"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmadı"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Yüz Tanıma Kilidi\'ni kullanmak için Ayarlar > Gizlilik bölümünden "<b>"Kamera erişimi"</b>"\'ni açın"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM PIN\'inizi girin. <xliff:g id="NUMBER_1">%d</xliff:g> deneme hakkınız kaldı.</item>
<item quantity="one">SIM PIN\'inizi girin. Cihazınızın kilidini açmak için operatörünüzle bağlantı kurmak zorunda kalmadan önce <xliff:g id="NUMBER_0">%d</xliff:g> deneme hakkınız kaldı.</item>
diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml
index 96f2ea2..a915f57 100644
--- a/packages/SystemUI/res-keyguard/values-uk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml
@@ -99,6 +99,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Пристрій заблоковано вручну"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Не розпізнано"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Не розпізнано"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Щоб використовувати фейсконтроль, увімкніть "<b>"Доступ до камери"</b>" в розділі \"Налаштування\" > \"Конфіденційність\""</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Введіть PIN-код SIM-карти. Залишилася <xliff:g id="NUMBER_1">%d</xliff:g> спроба.</item>
<item quantity="few">Введіть PIN-код SIM-карти. Залишилося <xliff:g id="NUMBER_1">%d</xliff:g> спроби.</item>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 3ae43f9..66bc9d6 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"آلہ کو دستی طور پر مقفل کیا گیا تھا"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"تسلیم شدہ نہیں ہے"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"تسلیم شدہ نہیں ہے"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"فیس اَنلاک کا استعمال کرنے کے لیے، ترتیبات اور رازداری میں "<b>"کیمرے تک رسائی"</b>" کو آن کریں"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM کا PIN درج کریں، آپ کے پاس <xliff:g id="NUMBER_1">%d</xliff:g> کوششیں بچی ہیں۔</item>
<item quantity="one">SIM کا PIN درج کریں، آپ کے پاس <xliff:g id="NUMBER_0">%d</xliff:g> کوشش بچی ہے، اس کے بعد آپ کو اپنا آلہ غیر مقفل کرنے کے لیے اپنے کیریئر سے رابطہ کرنا ہوگا۔</item>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 5d281fa..1046dbd 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Qurilma qo‘lda qulflangan"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Aniqlanmadi"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Aniqlanmadi"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Yuz bilan ochish uchun Sozlamalar va maxfiylik orqali "<b>"kameraga kirishga ruxsat bering"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">SIM PIN kodini kiriting, sizda <xliff:g id="NUMBER_1">%d</xliff:g> ta urinish bor.</item>
<item quantity="one">SIM PIN kodini kiriting, qurilmani qulfdan chiqarish uchun sizda <xliff:g id="NUMBER_0">%d</xliff:g> ta urinish bor.</item>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index 52d64b9..569b99e 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Thiết bị đã bị khóa theo cách thủ công"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Không nhận dạng được"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Không nhận dạng được"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Để dùng tính năng Mở khoá bằng khuôn mặt, hãy bật tuỳ chọn "<b>"Truy cập máy ảnh"</b>" trong phần Cài đặt > Quyền riêng tư"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">Hãy nhập mã PIN của SIM. Bạn còn <xliff:g id="NUMBER_1">%d</xliff:g> lần thử.</item>
<item quantity="one">Hãy nhập mã PIN của SIM. Bạn còn <xliff:g id="NUMBER_0">%d</xliff:g> lần thử trước khi phải liên hệ với nhà mạng để mở khóa thiết bị của mình.</item>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 4be7908..e429994 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"此设备已手动锁定"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"无法识别"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"无法识别"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如需使用人脸解锁功能,请在“设置”>“隐私权”中开启"<b>"摄像头使用权限"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
<item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 7ca7677..d870304 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"使用者已手動將裝置上鎖"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"未能識別"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"未能識別"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如要使用「面孔解鎖」,請在 [設定] > [私隱] 開啟"<b>"相機存取權"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">輸入 SIM 卡的 PIN,您還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
<item quantity="one">輸入 SIM 卡的 PIN,您還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,您必須聯絡流動網絡供應商解鎖您的裝置。</item>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index d3802c5..99a00fd 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"裝置已手動鎖定"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"無法識別"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"無法識別"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"如要使用人臉解鎖功能,請前往「設定」>「隱私權」開啟"<b>"攝影機存取權"</b></string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="other">請輸入 SIM 卡的 PIN 碼,你還可以再試 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
<item quantity="one">請輸入 SIM 卡的 PIN 碼,你還可以再試 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍然失敗,就必須請電信業者為裝置解鎖。</item>
diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml
index 5440b00..4c1ca1c 100644
--- a/packages/SystemUI/res-keyguard/values-zu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml
@@ -93,6 +93,7 @@
<string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Idivayisi ikhiywe ngokwenza"</string>
<string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Akwaziwa"</string>
<string name="kg_face_not_recognized" msgid="7903950626744419160">"Akwaziwa"</string>
+ <string name="kg_face_sensor_privacy_enabled" msgid="6513157891227284806">"Ukuze usebenzise Ukuvula ngobuso, vula "<b>"Ukufinyelela kwekhamera"</b>" kokuthi Amasethingi > Ubumfihlo"</string>
<plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
<item quantity="one">Faka i-PIN ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item>
<item quantity="other">Faka i-PIN ye-SIM, unemizamo engu-<xliff:g id="NUMBER_1">%d</xliff:g> esele.</item>
diff --git a/packages/SystemUI/res-keyguard/values/config.xml b/packages/SystemUI/res-keyguard/values/config.xml
index 6194aa0..e824443 100644
--- a/packages/SystemUI/res-keyguard/values/config.xml
+++ b/packages/SystemUI/res-keyguard/values/config.xml
@@ -27,6 +27,6 @@
<bool name="can_use_one_handed_bouncer">false</bool>
<!-- Will display the bouncer on one side of the display, and the current user icon and
user switcher on the other side -->
- <bool name="bouncer_display_user_switcher">false</bool>
+ <bool name="config_enableBouncerUserSwitcher">false</bool>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index c8bb8e9..cbf4f83 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -37,7 +37,6 @@
<!-- Margin around the various security views -->
<dimen name="keyguard_security_view_top_margin">8dp</dimen>
- <dimen name="keyguard_security_view_lateral_margin">20dp</dimen>
<dimen name="keyguard_eca_top_margin">18dp</dimen>
<dimen name="keyguard_eca_bottom_margin">12dp</dimen>
diff --git a/packages/SystemUI/res-product/values-zu/strings.xml b/packages/SystemUI/res-product/values-zu/strings.xml
index e6c140a..8b79a22 100644
--- a/packages/SystemUI/res-product/values-zu/strings.xml
+++ b/packages/SystemUI/res-product/values-zu/strings.xml
@@ -40,7 +40,7 @@
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Udwebe ngokungalungile iphethini yakho yokuvula ngezikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphumelelanga kaningi engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuthi uvule ithebulethi yakho usebenzisa i-akhawunti ye-imeyili.\n\nZama futhi kumasekhondi angu-<xliff:g id="NUMBER_2">%3$d</xliff:g>."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%1$d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google\n\n Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%3$d</xliff:g> imizuzwana."</string>
- <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Vula ifoni yakho ukuthola izinketho ezengeziwe"</string>
- <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Vula ithebulethi yakho ukuthola izinketho ezengeziwe"</string>
- <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Vula idivayisi yakho ukuthola izinketho ezengeziwe"</string>
+ <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Vula ifoni yakho ukuthola okunye okungakhethwa"</string>
+ <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Vula ithebulethi yakho ukuthola okunye okungakhethwa"</string>
+ <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Vula idivayisi yakho ukuthola okunye okungakhethwa"</string>
</resources>
diff --git a/packages/SystemUI/res/layout/dream_overlay_complications_layer.xml b/packages/SystemUI/res/layout/dream_overlay_complications_layer.xml
new file mode 100644
index 0000000..f898ef6
--- /dev/null
+++ b/packages/SystemUI/res/layout/dream_overlay_complications_layer.xml
@@ -0,0 +1,50 @@
+<?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.
+-->
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/dream_overlay_complications_layer"
+ android:padding="20dp"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <TextClock
+ android:id="@+id/time_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-thin"
+ android:format12Hour="h:mm"
+ android:format24Hour="kk:mm"
+ android:shadowColor="#B2000000"
+ android:shadowRadius="2.0"
+ android:singleLine="true"
+ android:textSize="72sp"
+ app:layout_constraintBottom_toTopOf="@+id/date_view"
+ app:layout_constraintStart_toStartOf="parent" />
+ <TextClock
+ android:id="@+id/date_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:shadowColor="#B2000000"
+ android:shadowRadius="2.0"
+ android:format12Hour="EEE, MMM d"
+ android:format24Hour="EEE, MMM d"
+ android:singleLine="true"
+ android:textSize="18sp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="@+id/time_view"
+ app:layout_constraintStart_toStartOf="@+id/time_view" />
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/dream_overlay_container.xml b/packages/SystemUI/res/layout/dream_overlay_container.xml
index 4929f50..c6b502e 100644
--- a/packages/SystemUI/res/layout/dream_overlay_container.xml
+++ b/packages/SystemUI/res/layout/dream_overlay_container.xml
@@ -28,6 +28,8 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
+ <include layout="@layout/dream_overlay_complications_layer" />
+
<com.android.systemui.dreams.DreamOverlayStatusBarView
android:id="@+id/dream_overlay_status_bar"
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/layout/keyguard_media_header.xml b/packages/SystemUI/res/layout/keyguard_media_container.xml
similarity index 93%
rename from packages/SystemUI/res/layout/keyguard_media_header.xml
rename to packages/SystemUI/res/layout/keyguard_media_container.xml
index 63a878f..c717e37 100644
--- a/packages/SystemUI/res/layout/keyguard_media_header.xml
+++ b/packages/SystemUI/res/layout/keyguard_media_container.xml
@@ -16,7 +16,7 @@
-->
<!-- Layout for media controls on the lockscreen -->
-<com.android.systemui.statusbar.notification.stack.MediaHeaderView
+<com.android.systemui.statusbar.notification.stack.MediaContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index f083b85..07f843b 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Sluitskerm."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Werksluitskerm"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Maak toe"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi afgeskakel."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi aangeskakel."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Vliegtuigmodus afgeskakel."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Vliegtuigmodus aangeskakel."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"volkome stilte"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"net wekkers"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Moenie Steur Nie."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Moenie Steur Nie is afgeskakel."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Moenie Steur Nie is aangeskakel."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aan."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth afgeskakel."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth aangeskakel."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Liggingverslaggewing afgeskakel."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Liggingverslaggewing aangeskakel."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Wekker gestel vir <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Meer tyd."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Minder tyd."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Flitslig afgeskakel."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Flitslig aangeskakel."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Kleuromkering afgeskakel."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Kleuromkering aangeskakel."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobiele warmkol afgeskakel."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobiele warmkol aangeskakel."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Uitsaai van skerm gestaak."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Databespaarder is afgeskakel."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Databespaarder is aangeskakel."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Skermhelderheid"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobiele data is laat wag"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data is onderbreek"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi is nie gekoppel nie"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helderheid"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kleuromkering"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Gebruikerinstellings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Jy moet Bluetooth aanskakel om jou sleutelbord aan jou tablet te koppel."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Skakel aan"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Kragkennisgewingkontroles"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Aan – gesiggegrond"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Met kragkennisgewingkontroles kan jy \'n belangrikheidvlak van 0 tot 5 vir \'n program se kennisgewings stel. \n\n"<b>"Vlak 5"</b>" \n- Wys aan die bokant van die kennisgewinglys \n- Laat volskermonderbreking toe \n- Wys altyd opspringkennisgewings \n\n"<b>"Vlak 4"</b>" \n- Verhoed volskermonderbreking \n- Wys altyd opspringkennisgewings \n\n"<b>"Vlak 3"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n\n"<b>"Vlak 2"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n- Moet nooit \'n klank maak of vibreer nie \n\n"<b>"Vlak 1"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n- Moet nooit \'n klank maak of vibreer nie \n- Versteek van sluitskerm en statusbalk \n- Wys aan die onderkant van die kennisgewinglys \n\n"<b>"Vlak 0"</b>" \n- Blokkeer alle kennisgewings van die program af"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Klaar"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Pas toe"</string>
diff --git a/packages/SystemUI/res/values-af/tiles_states_strings.xml b/packages/SystemUI/res/values-af/tiles_states_strings.xml
index 2059490..4b1a5b8 100644
--- a/packages/SystemUI/res/values-af/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-af/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Af"</item>
<item msgid="2075645297847971154">"Aan"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Onbeskikbaar"</item>
<item msgid="9103697205127645916">"Af"</item>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 839b8d2..c31179c 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ማያ ገጽ ቆልፍ።"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"የስራ ማያ ገጽ ቁልፍ"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"ዝጋ"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi በርቷል።"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"የአውሮፕላን ሁነታ ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"የአውሮፕላን ሁነታ በርቷል።"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ሙሉ ለሙሉ ጸጥታ"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ማንቂያዎች ብቻ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"አትረብሽ።"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"አትረብሽ ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"አትረብሽ በርቷል።"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ብሉቱዝ።"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ብሉቱዝ በርቷል።"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ብሉቱዝ ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ብሉቱዝ በርቷል።"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"አካባቢን ሪፖርት ማድረግ ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"አካባቢን ሪፖርት ማድረግ በርቷል።"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ማንቂያ ለ<xliff:g id="TIME">%s</xliff:g> ተዋቅሯል።"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ተጨማሪ ጊዜ።"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"ያነሰ ጊዜ።"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"የባትሪ ብርሃን ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"የባትሪ ብርሃን በርቷል።"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"የቀለም ግልበጣ ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"የቀለም ግልበጣ በርቷል።"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"የተንቀሳቃሽ ስልክ መገናኛ ነጥብ ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"የተንቀሳቃሽ ስልክ መገናኛ ነጥብ በርቷል።"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"ማያ ገጽ መውሰድ ቆሟል።"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ውሂብ ቆጣቢ ጠፍቷል።"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ውሂብ ቆጣቢ በርቷል።"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ብሩህነት ያሳዩ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"የተንቀሳቃሽ ስልክ ውሂብ ባለበት ቆሟል"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ውሂብ ላፍታ ቆሟል"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi አልተገናኘም"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ብሩህነት"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ተቃራኒ ቀለም"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ተጨማሪ ቅንብሮች"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"የተጠቃሚ ቅንብሮች"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ተከናውኗል"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"የቁልፍ ሰሌዳዎን ከእርስዎ ጡባዊ ጋር ለማገናኘት በመጀመሪያ ብሉቱዝን ማብራት አለብዎት።"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"አብራ"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"የኃይል ማሳወቂያ መቆጣጠሪያዎች"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"በርቷል - መልክ ላይ የተመሠረተ"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"በኃይል ማሳወቂያ መቆጣጠሪያዎች አማካኝነት የአንድ መተግበሪያ ማሳወቂያዎች የአስፈላጊነት ደረጃ ከ0 እስከ 5 ድረስ ማዘጋጀት ይችላሉ። \n\n"<b>"ደረጃ 5"</b>" \n- በማሳወቂያ ዝርዝሩ አናት ላይ አሳይ \n- የሙሉ ማያ ገጽ ማቋረጥን ፍቀድ \n- ሁልጊዜ አጮልቀው ይመልከቱ \n\n"<b>"ደረጃ 4"</b>" \n- የሙሉ ማያ ገጽ ማቋረጥን ከልክል \n- ሁልጊዜ አጮልቀው ይመልከቱ \n\n"<b>"ደረጃ 3"</b>" \n- የሙሉ ማያ ገጽ ማቋረጥን ከልክል \n- በፍጹም አጮልቀው አይምልከቱ \n\n"<b>"ደረጃ 2"</b>" \n- የሙሉ ማያ ገጽ ማቋረጥን ይከልክሉ \n- በፍጹም አጮልቀው አይመልከቱ \n- ድምፅ እና ንዝረትን በፍጹም አይኑር \n\n"<b>"ደረጃ 1"</b>" \n- የሙሉ ማያ ገጽ ማቋረጥን ይከልክሉ \n- በፍጹም አጮልቀው አይመልከቱ \n- ድምፅ ወይም ንዝረትን በፍጹም አያደርጉ \n- ከመቆለፊያ ገጽ እና የሁኔታ አሞሌ ይደብቁ \n- በማሳወቂያ ዝርዝር ግርጌ ላይ አሳይ \n\n"<b>"ደረጃ 0"</b>" \n- ሁሉንም የመተግበሪያው ማሳወቂያዎች ያግዱ"</string>
<string name="inline_done_button" msgid="6043094985588909584">"ተከናውኗል"</string>
<string name="inline_ok_button" msgid="603075490581280343">"ተግብር"</string>
diff --git a/packages/SystemUI/res/values-am/tiles_states_strings.xml b/packages/SystemUI/res/values-am/tiles_states_strings.xml
index 7fdfd11..0f7ee3e 100644
--- a/packages/SystemUI/res/values-am/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-am/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ጠፍቷል"</item>
<item msgid="2075645297847971154">"በርቷል"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"አይገኝም"</item>
<item msgid="9103697205127645916">"ጠፍቷል"</item>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 6110793..ec4816f 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"شاشة القفل."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"شاشة قفل بيانات العمل"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"إغلاق"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"تم إيقاف Wifi."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"تم تفعيل Wifi."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"تم إيقاف وضع الطيران."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"تم تفعيل وضع الطيران."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"كتم الصوت تمامًا"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"المنبِّهات فقط"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"عدم الإزعاج"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"تم إيقاف \"عدم الإزعاج\"."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"تم تفعيل \"عدم الإزعاج\"."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"البلوتوث."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"تفعيل البلوتوث."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"تم إيقاف البلوتوث."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"تم تفعيل البلوتوث."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"تم إيقاف الإبلاغ عن الموقع."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"تم تفعيل ميزة الإبلاغ عن الموقع الجغرافي."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"تم ضبط المنبّه على <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"وقت أكثر."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"وقت أقل."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"تم إيقاف الفلاش."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"تم تفعيل الفلاش."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"تم إيقاف \"قلب الألوان\"."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"تم تفعيل \"قلب الألوان\"."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"تم إيقاف نقطة اتصال الجوّال."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"تم تفعيل نقطة اتصال الجوّال."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"توقف إرسال الشاشة."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"تم إيقاف توفير البيانات."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"تم تفعيل توفير البيانات."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"سطوع الشاشة"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"تم إيقاف بيانات الجوّال مؤقتًا"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"تم إيقاف البيانات مؤقتًا"</string>
@@ -255,6 +237,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"لم يتم الاتصال بشبكة Wi-Fi."</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"السطوع"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"قلب الألوان"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"المزيد من الإعدادات"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"إعدادات المستخدم"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"تم"</string>
@@ -499,6 +483,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"لتوصيل لوحة المفاتيح بالجهاز اللوحي، يلزمك تفعيل بلوتوث أولاً."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"تفعيل"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"عناصر التحكم في إشعارات التشغيل"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"تفعيل - استنادًا للوجه"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"باستخدام عناصر التحكم في إشعار التشغيل، يمكنك ضبط مستوى الأهمية من 0 إلى 5 لإشعارات التطبيق. \n\n"<b>"المستوى 5"</b>" \n- العرض أعلى قائمة الإشعارات \n- يسمح بمقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 4"</b>" \n- منع مقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 3"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n\n"<b>"المستوى 2"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات واهتزاز \n\n"<b>"المستوى 1"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات أو اهتزاز أبدًا \n- الإخفاء من شاشة القفل وشريط الحالة \n- العرض أسفل قائمة الإشعارات \n\n"<b>"المستوى 0"</b>" \n- حظر جميع الإشعارات من التطبيق"</string>
<string name="inline_done_button" msgid="6043094985588909584">"تمّ"</string>
<string name="inline_ok_button" msgid="603075490581280343">"تطبيق"</string>
diff --git a/packages/SystemUI/res/values-ar/tiles_states_strings.xml b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
index d7026c7..2da87c4 100644
--- a/packages/SystemUI/res/values-ar/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ar/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"الميزة غير مفعّلة"</item>
<item msgid="2075645297847971154">"الميزة مفعّلة"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"الميزة غير متاحة"</item>
<item msgid="9103697205127645916">"الميزة غير مفعّلة"</item>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 3fe47cb..f118633 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"বন্ধ স্ক্ৰীন।"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"কৰ্মস্থানৰ প্ৰ\'ফাইলৰ লক স্ক্ৰীন"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"বন্ধ কৰক"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"ৱাই-ফাই অফ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"ৱাই-ফাই অন কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"এয়াৰপ্লেইন ম\'ড অফ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"এয়াৰপ্লেইন ম\'ড অন কৰা হ’ল।"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"সম্পূৰ্ণ নিৰৱতা"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"কেৱল এলাৰ্মবোৰৰ বাবে"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"অসুবিধা নিদিব"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"অসুবিধা নিদিব বন্ধ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"অসুবিধা নিদিব অন কৰা হ’ল।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ব্লুটুথ।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ব্লুটুথ অন হৈ আছে।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ব্লুটুথ অফ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ব্লুটুথ অন কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"অৱস্থান সবিশেষ অফ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"অৱস্থান সবিশেষ অন কৰা হ’ল।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>ৰ বাবে এলাৰ্ম ছেট কৰা হৈছে।"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"অধিক সময়।"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"কম সময়।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ফ্লাশ্বলাইট অফ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ফ্লাশ্বলাইট অন কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"ৰং বিপৰীতকৰণ অফ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"ৰং বিপৰীতকৰণ অন কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"ম’বাইল হটস্পট অফ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"ম’বাইল হটস্পট অন কৰা হ’ল।"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"স্ক্ৰীন কাষ্টিং বন্ধ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ডেটা সঞ্চয়কাৰী সুবিধা অফ কৰা হ’ল।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ডেটা সঞ্চয়কাৰী সুবিধা অন কৰা হ’ল।"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ডিছপ্লেৰ উজ্জ্বলতা"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"ম’বাইল ডেটা পজ কৰা হৈছে"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ডেটা পজ কৰা হৈছে"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ৱাই-ফাইৰ সৈতে সংযোগ হৈ থকা নাই"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"উজ্জ্বলতা"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ৰং বিপৰীতকৰণ"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"অধিক ছেটিং"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ব্যৱহাৰকাৰীৰ ছেটিং"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন কৰা হ’ল"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"আপোনাৰ টেবলেটত আপোনাৰ কীব\'ৰ্ড সংযোগ কৰিবলৈ আপুনি প্ৰথমে ব্লুটুথ অন কৰিব লাগিব।"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"অন কৰক"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"জাননী নিয়ন্ত্ৰণৰ অধিক কৰ্তৃত্ব"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"অন আছে - মুখাৱয়ব ভিত্তিক"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"জাননী নিয়ন্ত্ৰণৰ অধিক কৰ্তৃত্বৰ সৈতে আপুনি এটা এপৰ জাননীৰ গুৰুত্বৰ স্তৰ ০ৰ পৰা ৫লৈ ছেট কৰিব পাৰে।\n\n"<b>"স্তৰ ৫"</b>" \n- জাননী তালিকাৰ একেবাৰে ওপৰত দেখুৱাওক \n- সম্পূৰ্ণ স্ক্ৰীনত থাকোঁতে ব্যাঘাত জন্মাবলৈ অনুমতি দিয়ক\n- সদায় ভুমুকি মাৰিবলৈ দিয়ক\n\n"<b>"স্তৰ ৪"</b>" \n- সম্পূৰ্ণ স্ক্ৰীনত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- সদায় ভুমুকি মাৰিবলৈ দিয়ক\n\n"<b>"স্তৰ ৩"</b>" \n- সম্পূৰ্ণ স্ক্ৰীনত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n\n"<b>"স্তৰ ২"</b>" \n- সম্পূর্ণ স্ক্ৰীনত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব \n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n- কেতিয়াও শব্দ আৰু কম্পন কৰিবলৈ নিদিব\n\n"<b>" স্তৰ ১"</b>" \n- সম্পূৰ্ণ স্ক্ৰীনত থাকোঁতে ব্যাঘাত জন্মাবলৈ নিদিব\n- কেতিয়াও ভুমুকি মাৰিবলৈ নিদিব\n-কেতিয়াও শব্দ আৰু কম্পন কৰিবলৈ নিদিব \n- লক স্ক্ৰীন আৰু স্থিতি দণ্ডৰ পৰা লুকুৱাই ৰাখক \n- জাননী তালিকাৰ একেবাৰে তলত দেখুৱাওক\n\n"<b>"স্তৰ ০"</b>" \n- এই এপৰ আটাইবোৰ জাননী অৱৰোধ কৰক"</string>
<string name="inline_done_button" msgid="6043094985588909584">"কৰা হ’ল"</string>
<string name="inline_ok_button" msgid="603075490581280343">"প্ৰয়োগ কৰক"</string>
diff --git a/packages/SystemUI/res/values-as/tiles_states_strings.xml b/packages/SystemUI/res/values-as/tiles_states_strings.xml
index efb2351..2ede374 100644
--- a/packages/SystemUI/res/values-as/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-as/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"অফ আছে"</item>
<item msgid="2075645297847971154">"অন কৰা আছে"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"উপলব্ধ নহয়"</item>
<item msgid="9103697205127645916">"অফ আছে"</item>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 255ce58..9abe0a7a 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kilid ekranı."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ekran kilidi"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Qapadın"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi deaktivdir."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi aktivdir."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Təyyarə rejimi deaktiv edildi."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Təyyarə rejimi aktiv edildi."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"tam sakitlik"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"bildirişlər"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Narahat Etməyin."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\"Narahat etməyin\" deaktivdir."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\"Narahat etməyin\" aktivdir."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aktiv."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth deaktivdir."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth aktivdir."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Məkan xəbərdarlığı deaktivdir."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Məkan xəbərdarlığı aktivdir."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm <xliff:g id="TIME">%s</xliff:g> üçün qurulub."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Daha çox vaxt."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Daha az vaxt."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Fənər deaktivdir."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Fənər aktivdir."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Rəng inversiyası deaktivdir."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Rəng inversiyası aktivdir."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobil hotspot deaktivdir."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobil hotspot aktivdir."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Ekran yayımı dayandırıldı."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Trafikə qənaət edilmir."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Trafikə qənaət edilir."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Display brightness"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobil dataya fasilə verildi"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Məlumatlara fasilə verildi"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi qoşulu deyil"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Parlaqlıq"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Rəng inversiyası"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Digər ayarlar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"İstifadəçi ayarları"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hazır"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Tabletinizlə klaviaturaya bağlanmaq üçün ilk olaraq Bluetooth\'u aktivləşdirməlisiniz."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Aktivləşdirin"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Enerji bildiriş nəzarəti"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Aktiv - Üz əsaslı"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Enerji bildiriş nəzarəti ilə, tətbiq bildirişləri üçün əhəmiyyət səviyyəsini 0-dan 5-ə kimi ayarlaya bilərsiniz. \n\n"<b>"Səviyyə 5"</b>" \n- Bildiriş siyahısının yuxarı hissəsində göstərin \n- Tam ekran kəsintisinə icazə verin \n- Hər zaman izləyin \n\n"<b>"Səviyyə 4"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Hər zaman izləyin \n\n"<b>"Level 3"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Heç vaxt izləməyin \n\n"<b>"Level 2"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Heç vaxt izləməyin \n- Heç vaxt səsliyə və ya vibrasiyaya qoymayın \n\n"<b>"Səviyyə 1"</b>" \n- Prevent full screen interruption \n- Heç vaxt izləməyin \n- Heç vaxt səsliyə və ya vibrasiyaya qoymayın \n- Ekran kilidi və ya status panelindən gizlədin \n- Bildiriş siyahısının yuxarı hissəsində göstərin \n\n"<b>"Səviyyə 0"</b>" \n- Bütün bildirişləri tətbiqdən blok edin"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Hazırdır"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Tətbiq edin"</string>
diff --git a/packages/SystemUI/res/values-az/tiles_states_strings.xml b/packages/SystemUI/res/values-az/tiles_states_strings.xml
index 7c47203..f52a9e1 100644
--- a/packages/SystemUI/res/values-az/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-az/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Deaktiv"</item>
<item msgid="2075645297847971154">"Aktiv"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Əlçatan deyil"</item>
<item msgid="9103697205127645916">"Deaktiv"</item>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index f29d9de..02c4d920 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključan ekran."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaključan ekran za posao"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvori"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WiFi je isključen."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WiFi je uključen."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Režim rada u avionu je isključen."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Režim rada u avionu je uključen."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"potpuna tišina"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"samo alarmi"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne uznemiravaj."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Podešavanje Ne uznemiravaj je isključeno."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Podešavanje Ne uznemiravaj je uključeno."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth je uključen."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth je isključen."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth je uključen."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Izveštavanje o lokaciji je isključeno."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Izveštavanje o lokaciji je uključeno."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm je podešen za <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Više vremena."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Manje vremena."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Baterijska lampa je isključena."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Baterijska lampa je uključena."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inverzija boja je isključena."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inverzija boja je uključena."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobilni hotspot je isključen."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobilni hotspot je uključen."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Prebacivanje ekrana je zaustavljeno."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Ušteda podataka je isključena."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Ušteda podataka je uključena."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Osvetljenost ekrana"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobilni podaci su pauzirani"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Podaci su pauzirani"</string>
@@ -252,6 +234,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"WiFi nije povezan"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Osvetljenost"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija boja"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Još podešavanja"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisnička podešavanja"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
@@ -490,6 +474,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Da biste povezali tastaturu sa tabletom, prvo morate da uključite Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Uključi"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Napredne kontrole za obaveštenja"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Uključeno – na osnovu lica"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Pomoću naprednih kontrola za obaveštenja možete da podesite nivo važnosti od 0. do 5. za obaveštenja aplikacije. \n\n"<b>"5. nivo"</b>" \n– Prikazuju se u vrhu liste obaveštenja \n- Dozvoli prekid režima celog ekrana \n– Uvek zaviruj \n\n"<b>"4. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Uvek zaviruj \n\n"<b>"3. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n\n"<b>"2. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n– Nikada ne proizvodi zvuk ili vibraciju \n\n"<b>"1. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n– Nikada ne proizvodi zvuk ili vibraciju \n– Sakrij na zaključanom ekranu i statusnoj traci \n– Prikazuju se u dnu liste obaveštenja \n\n"<b>"0. nivo"</b>" \n– Blokiraj sva obaveštenja iz aplikacije"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Gotovo"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Primeni"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
index 88caf97..d9e0bfca36 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Isključeno"</item>
<item msgid="2075645297847971154">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nedostupno"</item>
<item msgid="9103697205127645916">"Isključeno"</item>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 3b0c1a3..88f58ac 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Экран блакіроўкі."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Экран блакіроўкі дзейнасці"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Закрыць"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi выключаны."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi уключаны."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Рэжым палёту выключаецца."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Рэжым палёту ўключаецца."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"поўная цішыня"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"толькі будзільнікі"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не турбаваць."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Рэжым \"Не турбаваць\" выключаны."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Рэжым \"Не турбаваць\" уключаны."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth уключаны."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth выключаны."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth уключаны."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Адпраўка даных аб месцазнаходжанні выключаецца."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Адпраўка даных аб месцазнаходжанні ўключаецца."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Наладжаны будзiльнiк: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Больш часу."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Менш часу."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Ліхтарык выключаецца."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Ліхтарык уключаецца."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Інверсія колераў адключаецца."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Інверсія колераў уключаецца."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мабільны хот-спот выключаецца."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Хот-спот уключаны."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Трансляцыя экрана спынена."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Эканомія трафіка адключана."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Эканомія трафіка ўключана."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Яркасць дысплэя"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мабільная перадача даных прыпынена"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Перадача даных прыпынена"</string>
@@ -253,6 +235,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Няма падключэння да Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркасць"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Інверсія колераў"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Дадатковыя налады"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Налады карыстальніка"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Гатова"</string>
@@ -493,6 +477,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Для падлучэння клавіятуры да планшэта трэба спачатку ўключыць Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Уключыць"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Пашыранае кіраванне апавяшчэннямі"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Уключана – З улікам паставы галавы"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"З дапамогай пашыранага кіравання апавяшчэннямі вы можаце задаваць узровень важнасці апавяшчэнняў праграмы ад 0 да 5. \n\n"<b>"Узровень 5"</b>" \n- Паказваць уверсе спіса апавяшчэнняў \n- Дазваляць перапыняць рэжым поўнага экрана \n- Заўсёды дазваляць кароткі паказ \n\n"<b>"Узровень 4"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Заўсёды дазваляць кароткі паказ \n\n"<b>"Узровень 3"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n\n"<b>"Узровень 2"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n- Ніколі не прайграваць гук і не вібрыраваць \n\n"<b>"Узровень 1"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n- Ніколі не прайграваць гук і не вібрыраваць \n- Хаваць з экрана блакіроўкі і панэлі стану \n- Паказваць унізе спіса апавяшчэнняў \n\n"<b>"Узровень 0"</b>" \n- Блакіраваць усе апавяшчэнні ад праграмы"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Гатова"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Прымяніць"</string>
diff --git a/packages/SystemUI/res/values-be/tiles_states_strings.xml b/packages/SystemUI/res/values-be/tiles_states_strings.xml
index ecfde0b..5c7c40f 100644
--- a/packages/SystemUI/res/values-be/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-be/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Выключана"</item>
<item msgid="2075645297847971154">"Уключана"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Недаступна"</item>
<item msgid="9103697205127645916">"Выключана"</item>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 6881fcf..8b455da 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заключване на екрана."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Заключен екран на служебния профил"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Затваряне"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Функцията за Wi-Fi се изключи."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Функцията за Wi-Fi се включи."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Самолетният режим се изключи."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Самолетният режим се включи."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"пълна тишина"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"само будилници"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не безпокойте."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Режимът „Не безпокойте“ е изключен."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Режимът „Не безпокойте“ е включен."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Функцията за Bluetooth е включена."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Функцията за Bluetooth се изключи."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Функцията за Bluetooth се включи."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Функцията „Отчитане на местоположението“ се изключи."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Функцията „Отчитане на местоположението“ се включи."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Будилникът е навит за <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Повече време."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"По-малко време."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Фенерчето е изключено."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Фенерчето е включено."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Функцията за инвертиране на цветовете се изключи."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Функцията за инвертиране на цветовете се включи."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мобилната точка за достъп се изключи."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Мобилната точка за достъп се включи."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Предаването на съдържанието от екрана спря."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Функцията „Икономия на данни“ е изключена."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Функцията „Икономия на данни“ е включена."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Яркост на екрана"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мобилните данни са поставени на пауза"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Данните са поставени на пауза"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"не е установена връзка с Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркост"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инвертиране на цветовете"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Още настройки"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Потребителски настройки"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"За да свържете клавиатурата с таблета си, първо трябва да включите Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Включване"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Контроли за известията"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Вкл. – въз основа на лицето"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"С помощта на контролите за известията можете да зададете ниво на важност от 0 до 5 за известията от дадено приложение. \n\n"<b>"Ниво 5"</b>" \n– Показване най-горе в списъка с известия. \n– Разрешаване на прекъсването на цял екран. \n– Известията винаги се показват мимолетно. \n\n"<b>"Ниво 4"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията винаги се показват мимолетно. \n\n"<b>"Ниво 3"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n\n"<b>"Ниво 2"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n– Без издаване на звуков сигнал и вибриране. \n\n"<b>"Ниво 1"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n– Без издаване на звуков сигнал и вибриране. \n– Скриване от заключения екран и лентата на състоянието. \n– Показване най-долу в списъка с известия. \n\n"<b>"Ниво 0"</b>" \n– Блокиране на всички известия от приложението."</string>
<string name="inline_done_button" msgid="6043094985588909584">"Готово"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Прилагане"</string>
diff --git a/packages/SystemUI/res/values-bg/tiles_states_strings.xml b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
index 7424f81..6839b83 100644
--- a/packages/SystemUI/res/values-bg/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Изкл."</item>
<item msgid="2075645297847971154">"Вкл."</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Не е налице"</item>
<item msgid="9103697205127645916">"Изкл."</item>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 571118a..958853e 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"লক স্ক্রিন।"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"কর্মস্থলের স্ক্রিন লক"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"বন্ধ করুন"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"ওয়াই ফাই বন্ধ হয়েছে।"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"ওয়াই ফাই চালু হয়েছে।"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"বিমান মোড বন্ধ হয়েছে।"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"বিমান মোড চালু হয়েছে।"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"সম্পূর্ণ নীরব"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"শুধুমাত্র অ্যালার্ম"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"বিরক্ত করবে না।"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\'বিরক্ত করবে না\' বন্ধ আছে।"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\'বিরক্ত করবে না\' চালু করা হয়েছে।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ব্লুটুথ"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ব্লুটুথ চালু আছে।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ব্লুটুথ বন্ধ হয়েছে।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ব্লুটুথ চালু হয়েছে।"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"লোকেশন জানানো বন্ধ হয়েছে।"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"লোকেশন জানানো চালু হয়েছে।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> এ অ্যালার্ম সেট করা হয়েছে৷"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"বেশি সময়।"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"কম সময়।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ফ্ল্যাশলাইট বন্ধ হয়েছে।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ফ্ল্যাশলাইট চালু হয়েছে।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"রঙ বিলোমক্রিয়া বন্ধ হয়েছে।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"রঙ বিলোমক্রিয়া চালু হয়েছে।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"মোবাইল হটস্পট বন্ধ হয়েছে।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"মোবাইল হটস্পট চালু হয়েছে।"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"স্ক্রিন কাস্ট করা থেমেছে।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ডেটা সেভার বন্ধ আছে।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ডেটা সেভার চালু আছে।"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"প্রদর্শনের উজ্জ্বলতা"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"মোবাইল ডেটা সাময়িক ভাবে বন্ধ করা হয়েছে"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ডেট বিরতি দেওয়া হয়েছে"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ওয়াই-ফাই কানেক্ট করা নেই"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"উজ্জ্বলতা"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"কালার ইনভার্সন"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"আরও সেটিংস"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ব্যবহারকারী সেটিংস"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"সম্পন্ন হয়েছে"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"আপনার ট্যাবলেটের সাথে আপনার কীবোর্ড সংযুক্ত করতে, আপনাকে প্রথমে ব্লুটুথ চালু করতে হবে।"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"চালু করুন"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"পাওয়ার বিজ্ঞপ্তির নিয়ন্ত্রণগুলি"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"চালু আছে - মুখের হিসেবে"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"পাওয়ার বিজ্ঞপ্তির নিয়ন্ত্রণগুলি ব্যহবার করে, আপনি কোনও অ্যাপ্লিকেশনের বিজ্ঞপ্তির জন্য ০ থেকে ৫ পর্যন্ত একটি গুরুত্বের লেভেলকে সেট করতে পারবেন৷ \n\n"<b>"লেভেল ৫"</b>" \n- বিজ্ঞপ্তি তালিকার শীর্ষে দেখায় \n- পূর্ণ স্ক্রিনের বাধাকে অনুমতি দেয় \n- সর্বদা স্ক্রিনে উপস্থিত হয় \n\n"<b>"লেভেল ৪"</b>" \n- পূর্ণ স্ক্রিনের বাধাকে আটকায় \n- সর্বদা স্ক্রিনে উপস্থিত হয় \n\n"<b>"লেভেল ৩"</b>" \n- পূর্ণ স্ক্রিনের বাধাকে আটকায় \n- কখনওই স্ক্রিনে উপস্থিত হয় না \n\n"<b>"লেভেল ২"</b>" \n- পূর্ণ স্ক্রিনের বাধাকে আটকায় \n- কখনওই স্ক্রিনে উপস্থিত হয় না \n- কখনওই শব্দ এবং কম্পন করে না \n\n"<b>"লেভেল ১"</b>" \n- পূর্ণ স্ক্রিনের বাধাকে আটকায় \n- কখনওই স্ক্রিনে উপস্থিত হয় না \n- কখনওই শব্দ এবং কম্পন করে না \n- লক স্ক্রিন এবং স্ট্যাটাস বার থেকে লুকায় \n- বিজ্ঞপ্তি তালিকার নীচের দিকে দেখায় \n\n"<b>"লেভেল ০"</b>" \n- অ্যাপ্লিকেশন থেকে সমস্ত বিজ্ঞপ্তিকে অবরূদ্ধ করে"</string>
<string name="inline_done_button" msgid="6043094985588909584">"হয়ে গেছে"</string>
<string name="inline_ok_button" msgid="603075490581280343">"প্রয়োগ করুন"</string>
diff --git a/packages/SystemUI/res/values-bn/tiles_states_strings.xml b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
index eddf851..7a6b3ac 100644
--- a/packages/SystemUI/res/values-bn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"বন্ধ আছে"</item>
<item msgid="2075645297847971154">"চালু আছে"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"উপলভ্য নেই"</item>
<item msgid="9103697205127645916">"বন্ধ আছে"</item>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 6d4326b..092d3df 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključan ekran."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaključan ekran radnog profila"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvori"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi je isključen."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi je uključen."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Način rada u avionu je isključen."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Način rada u avionu je uključen."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"potpuna tišina"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"samo alarmi"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne ometaj."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Način rada Ne ometaj je isključen."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Način rada Ne ometaj je uključen."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth uključen."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth je isključen."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth je uključen."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Javljanje lokacije je isključeno."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Javljanje lokacije je uključeno."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm je podešen na <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Više vremena."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Manje vremena."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Svjetiljka je isključena."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Svjetiljka je uključena."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inverzija boja je isključena."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inverzija boja je uključena."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobilna pristupna tačka je isključena."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobilna pristupna tačka je uključena."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Prebacivanje ekrana je zaustavljeno."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Ušteda podataka je isključena."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Ušteda podataka je uključena."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Osvjetljenje ekrana"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Prijenos podataka je pauziran"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Prijenos podataka je pauziran"</string>
@@ -252,6 +234,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"WiFi mreža nije povezana"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Osvjetljenje"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija boja"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Više postavki"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisničke postavke"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
@@ -490,6 +474,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Da povežete tastaturu sa tabletom, prvo morate uključiti Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Uključi"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Kontrole obavještenja o napajanju"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Uključeno – na osnovu lica"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Uz kontrolu obavještenja o napajanju, možete postaviti nivo značaja obavještenja iz aplikacije, i to od nivoa 0 do 5. \n\n"<b>"Nivo 5"</b>" \n- Prikaži na vrhu liste obavještenja \n- Dopusti prekid prikaza cijelog ekrana \n- Uvijek izviruj \n\n"<b>"Nvio 4"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Uvijek izviruj \n\n"<b>"Nivo 3"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikad ne izviruj \n\n"<b>"Nivo 2"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikad ne izviruj \n- Nikada ne puštaj zvuk ili vibraciju \n\n"<b>"Nivo 1"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikada ne izviruj \n- Nikada ne puštaj zvuk ili vibraciju \n- Sakrij sa ekrana za zaključavanje i statusne trake \n- Prikaži na dnu liste obavještenja \n\n"<b>"Nivo 0"</b>" \n- Blokiraj sva obavještenja iz aplikacije"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Gotovo"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Primijeni"</string>
diff --git a/packages/SystemUI/res/values-bs/tiles_states_strings.xml b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
index 88caf97..d9e0bfca36 100644
--- a/packages/SystemUI/res/values-bs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Isključeno"</item>
<item msgid="2075645297847971154">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nedostupno"</item>
<item msgid="9103697205127645916">"Isključeno"</item>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index e6c7cfb..6ae7d16 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueig"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Pantalla de bloqueig per a la feina"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Tanca"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"La xarxa Wi-Fi està desactivada."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"La xarxa Wi-Fi està activada."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"S\'ha desactivat el Mode d\'avió."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"S\'ha activat el Mode d\'avió."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silenci total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"només alarmes"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"No molestis."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"S\'ha desactivat el mode No molestis."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"S\'ha activat el mode No molestis."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activat."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth desactivat."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth activat."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Els informes d\'ubicació estan desactivats."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Els informes d\'ubicació estan activats."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"S\'ha configurat l\'alarma (<xliff:g id="TIME">%s</xliff:g>)."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Més temps"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Menys temps"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Llanterna apagada."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Llanterna encesa."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"La inversió de colors està desactivada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"La inversió de colors està activada."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"El punt d\'accés mòbil està desactivat."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"El punt d\'accés mòbil està activat."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"S\'ha aturat l\'emissió de la pantalla."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"S\'ha desactivat l\'Economitzador de dades."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"S\'ha activat l\'Economitzador de dades."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Brillantor de la pantalla"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"S\'han posat en pausa les dades mòbils"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Les dades estan aturades"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"La Wi‑Fi no està connectada"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillantor"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversió de colors"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Més opcions"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuració d\'usuari"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fet"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Per connectar el teclat amb la tauleta, primer has d\'activar el Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Activa"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controls millorats per a notificacions"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Activat: basat en cares"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Amb els controls de notificació millorats, pots establir un nivell d\'importància d\'entre 0 i 5 per a les notificacions d\'una aplicació. \n\n"<b>"Nivell 5"</b>" \n- Mostra les notificacions a la part superior de la llista \n- Permet la interrupció de la pantalla completa \n- Permet sempre la previsualització \n\n"<b>"Nivell 4"</b>" \n- No permet la interrupció de la pantalla completa \n- Permet sempre la previsualització \n\n"<b>"Nivell 3"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n\n"<b>"Nivell 2"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n- Les notificacions no poden emetre sons ni vibracions \n\n"<b>"Nivell 1"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n- No activa mai el so ni la vibració \n- Amaga les notificacions de la pantalla de bloqueig i de la barra d\'estat \n- Mostra les notificacions a la part inferior de la llista \n\n"<b>"Nivell 0"</b>" \n- Bloqueja totes les notificacions de l\'aplicació"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Fet"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplica"</string>
diff --git a/packages/SystemUI/res/values-ca/tiles_states_strings.xml b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
index e3538fa..28f3da4 100644
--- a/packages/SystemUI/res/values-ca/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Desactivat"</item>
<item msgid="2075645297847971154">"Activat"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"No disponible"</item>
<item msgid="9103697205127645916">"Desactivat"</item>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index b2becd8..7e71616 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Obrazovka uzamčení"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Obrazovka uzamčení pracovního profilu"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zavřít"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Připojení Wi-Fi je vypnuto."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Připojení Wi-Fi je zapnuto."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Režim Letadlo je vypnutý."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Režim Letadlo je zapnutý."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"úplné ticho"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"pouze budíky"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Nerušit."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Režim Nerušit je vypnutý."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Režim Nerušit je zapnutý."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Rozhraní Bluetooth je zapnuto."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Rozhraní Bluetooth je vypnuto."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Rozhraní Bluetooth je zapnuto."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Hlášení polohy je vypnuto."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Hlášení polohy je zapnuto."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Budík je nastaven na <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Delší doba"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Kratší doba"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Svítilna je vypnutá."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Svítilna je zapnutá."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Převrácení barev je vypnuto."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Převrácení barev je zapnuto."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobile hotspot je vypnutý."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobile hotspot je zapnutý."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Odesílání obrazovky zastaveno."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Spořič dat byl vypnut."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Spořič dat byl zapnut."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Jas displeje"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobilní data byla pozastavena"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data jsou pozastavena"</string>
@@ -253,6 +235,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Není připojena Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jas"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Převrácení barev"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Další nastavení"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Uživatelské nastavení"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string>
@@ -493,6 +477,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Chcete-li klávesnici připojit k tabletu, nejdříve musíte zapnout Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Zapnout"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Rozšířené ovládací prvky oznámení"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Zapnuto – podle obličeje"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Rozšířené ovládací prvky oznámení umožňují nastavit úroveň důležitosti oznámení aplikace od 0 do 5. \n\n"<b>"Úroveň 5"</b>" \n– Zobrazit na začátku seznamu oznámení \n– Povolit vyrušení na celou obrazovku \n– Vždy zobrazit náhled \n\n"<b>"Úroveň 4"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Vždy zobrazit náhled \n\n"<b>"Úroveň 3"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n\n"<b>"Úroveň 2"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n– Nikdy nevydávat žádný zvukový signál ani nevibrovat \n\n"<b>"Úroveň 1"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n– Nikdy nevydávat zvukový signál ani nevibrovat \n– Skrýt na obrazovce uzamčení a stavového řádku \n– Zobrazovat na konci seznamu oznámení \n\n"<b>";Úroveň 0"</b>" \n– Blokovat všechna oznámení z aplikace"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Hotovo"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Použít"</string>
diff --git a/packages/SystemUI/res/values-cs/tiles_states_strings.xml b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
index 3f40ab6..ce64e27 100644
--- a/packages/SystemUI/res/values-cs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Vyp"</item>
<item msgid="2075645297847971154">"Zap"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nedostupné"</item>
<item msgid="9103697205127645916">"Vyp"</item>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index d559c15..919f57c 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låseskærm."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Låseskærm til arbejde"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Luk"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi er slået fra."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi er slået til."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Flytilstand er slået fra."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Flytilstand er slået til."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total stilhed"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"kun alarmer"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Forstyr ikke."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Forstyr ikke er slået fra."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Forstyr ikke er slået til."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth er slået til."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth er slået fra."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth er slået til."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Lokationsrapportering er slået fra."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Lokationsrapportering er slået til."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmen er indstillet til <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Mere tid."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Mindre tid."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Lommelygten er slukket."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Lommelygten er tændt."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Ombytning af farver er slået fra."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Ombytning af farver er slået til."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobilhotspot er slået fra."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobilhotspot er slået til."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Casting af din skærm er stoppet."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Datasparefunktionen er slået fra."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Datasparefunktionen er aktiveret."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Skærmens lysstyrke"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobildata er sat på pause"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data er sat på pause"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Manglende Wi-Fi-forbindelse"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Lysstyrke"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ombytning af farver"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere indstillinger"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brugerindstillinger"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Udfør"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Bluetooth skal være slået til, før du kan knytte dit tastatur til din tablet."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Slå til"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Kontrolelementer til notifikation om strøm"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Til – ansigtsbaseret"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Med kontrolelementer til notifikationer om strøm kan du konfigurere et vigtighedsniveau fra 0 til 5 for en apps notifikationer. \n\n"<b>"Niveau 5"</b>\n"- Vis øverst på listen over notifikationer \n- Tillad afbrydelse af fuld skærm \n- Se altid smugkig \n\n"<b>"Niveau 4"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se altid smugkig \n\n"<b>"Niveau 3"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se aldrig smugkig \n\n"<b>"Niveau 2"</b>\n"- Ingen afbrydelse af fuld skærm \n Se aldrig smugkig \n- Ingen lyd og vibration \n\n"<b>"Niveau 1"</b>\n"- Ingen afbrydelse af fuld skærm \n- Se aldrig smugkig \n- Ingen lyd eller vibration \n- Skjul fra låseskærm og statusbjælke \n- Vis nederst på listen over notifikationer \n\n"<b>"Niveau 0"</b>\n"- Bloker alle notifikationer fra appen."</string>
<string name="inline_done_button" msgid="6043094985588909584">"Udfør"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Anvend"</string>
diff --git a/packages/SystemUI/res/values-da/tiles_states_strings.xml b/packages/SystemUI/res/values-da/tiles_states_strings.xml
index b479a44..9e4c6f4 100644
--- a/packages/SystemUI/res/values-da/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-da/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Fra"</item>
<item msgid="2075645297847971154">"Til"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ikke tilgængelig"</item>
<item msgid="9103697205127645916">"Fra"</item>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 801d9e0..ce58c3d 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Sperrbildschirm"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Sperrbildschirm für Arbeitsprofil"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Schließen"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WLAN ist deaktiviert."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WLAN ist aktiviert."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Der Flugmodus ist deaktiviert."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Der Flugmodus ist aktiviert."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"lautlos"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"nur Weckrufe"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Bitte nicht stören."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"„Bitte nicht stören“ deaktiviert."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"„Bitte nicht stören“ aktiviert"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aktiviert"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth ist deaktiviert."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth ist aktiviert."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Der Standortbericht ist deaktiviert."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Der Standortbericht ist aktiviert."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Wecker gestellt für <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Mehr Zeit"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Weniger Zeit"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Die Taschenlampe ist deaktiviert."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Die Taschenlampe ist aktiviert."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Die Farbumkehr ist deaktiviert."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Die Farbumkehr ist aktiviert."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Der mobile Hotspot ist deaktiviert."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Der mobile Hotspot ist aktiviert."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Die Bildschirmübertragung wurde angehalten."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Der Datensparmodus ist deaktiviert."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Der Datensparmodus ist aktiviert."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Helligkeit des Displays"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobile Datennutzung pausiert"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Daten pausiert"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"WLAN nicht verbunden"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helligkeit"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Farbumkehr"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Weitere Einstellungen"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Nutzereinstellungen"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fertig"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Zum Verbinden von Tastatur und Tablet muss Bluetooth aktiviert sein."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Aktivieren"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Erweiterte Benachrichtigungseinstellungen"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"An – gesichtsbasiert"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Mit den erweiterten Benachrichtigungseinstellungen kannst du für App-Benachrichtigungen eine Wichtigkeitsstufe von 0 bis 5 festlegen. \n\n"<b>"Stufe 5"</b>" \n- Auf der Benachrichtigungsleiste ganz oben anzeigen \n- Vollbildunterbrechung zulassen \n- Immer kurz einblenden \n\n"<b>"Stufe 4"</b>" \n- Keine Vollbildunterbrechung \n- Immer kurz einblenden \n\n"<b>"Stufe 3"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n\n"<b>"Stufe 2"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n- Weder Ton noch Vibration \n\n"<b>"Stufe 1"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n- Weder Ton noch Vibration \n- Auf Sperrbildschirm und Statusleiste verbergen \n- Auf der Benachrichtigungsleiste ganz unten anzeigen \n\n"<b>"Stufe 0"</b>" \n- Alle Benachrichtigungen der App sperren"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Fertig"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Anwenden"</string>
diff --git a/packages/SystemUI/res/values-de/tiles_states_strings.xml b/packages/SystemUI/res/values-de/tiles_states_strings.xml
index 81f030c..e958670 100644
--- a/packages/SystemUI/res/values-de/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-de/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Aus"</item>
<item msgid="2075645297847971154">"An"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nicht verfügbar"</item>
<item msgid="9103697205127645916">"Aus"</item>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index bc7d3b0..96aed4c 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Οθόνη κλειδώματος"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Οθόνη κλειδωμένης εργασίας"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Κλείσιμο"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Το Wi-fi απενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Το Wi-fi ενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Η λειτουργία πτήσης απενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Ενεργή λειτουργία πτήσης."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"πλήρης σίγαση"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"μόνο ξυπνητήρια"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Μην ενοχλείτε."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Η λειτουργία Μην ενοχλείτε απενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Η λειτουργία Μην ενοχλείτε ενεργοποιήθηκε."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Ενεργό Bluetooth."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Το Bluetooth απενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Το Bluetooth ενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Η Αναφορά τοποθεσίας απενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Η Αναφορά τοποθεσίας ενεργοποιήθηκε."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Το ξυπνητήρι έχει οριστεί στις <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Περισσότερη ώρα."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Λιγότερη ώρα."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Ο φακός απενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Ο φακός ενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Η αντιστροφή χρωμάτων απενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Η αντιστροφή χρωμάτων ενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Το σημείο πρόσβασης κινητής συσκευής απενεργοποιήθηκε."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Το σημείο πρόσβασης κινητής συσκευής ενεργοποιήθηκε."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Η μετάδοση της οθόνης διακόπηκε."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Η Εξοικονόμηση δεδομένων είναι ανενεργή."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Η Εξοικονόμηση δεδομένων είναι ενεργή."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Φωτεινότητα οθόνης"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Τα δεδομένα κινητής τηλεφωνίας τέθηκαν σε παύση"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Τα δεδομένα τέθηκαν σε παύση"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Το Wi-Fi δεν είναι συνδεδεμένο"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Φωτεινότητα"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Αντιστροφή χρωμάτων"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Περισσότερες ρυθμίσεις"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ρυθμίσεις χρήστη"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Τέλος"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Για να συνδέσετε το πληκτρολόγιο με το tablet σας, θα πρέπει πρώτα να ενεργοποιήσετε το Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Ενεργοποίηση"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Στοιχεία ελέγχου ειδοποίησης ισχύος"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Ενεργό - Βάσει προσώπου"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Με τα στοιχεία ελέγχου ειδοποίησης ισχύος, μπορείτε να ορίσετε ένα επίπεδο βαρύτητας από 0 έως 5 για τις ειδοποιήσεις μιας εφαρμογής. \n\n"<b>"Επίπεδο 5"</b>" \n- Εμφάνιση στην κορυφή της λίστας ειδοποιήσεων \n- Να επιτρέπεται η διακοπή πλήρους οθόνης \n- Να γίνεται πάντα σύντομη προβολή \n\n"<b>"Επίπεδο 4"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να γίνεται πάντα σύντομη προβολή \n\n"<b>"Επίπεδο 3"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n\n"<b>"Επίπεδο 2"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n- Να μην χρησιμοποιείται ποτέ ήχος και δόνηση \n\n"<b>"Επίπεδο 1"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n- Να μην χρησιμοποιείται ποτέ ήχος και δόνηση \n- Απόκρυψη από την οθόνη κλειδώματος και τη γραμμή κατάστασης \n- Εμφάνιση στο κάτω μέρος της λίστας ειδοποιήσεων \n\n"<b>"Επίπεδο 0"</b>" \n- Αποκλεισμός όλων των ειδοποιήσεων από την εφαρμογή"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Τέλος"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Εφαρμογή"</string>
diff --git a/packages/SystemUI/res/values-el/tiles_states_strings.xml b/packages/SystemUI/res/values-el/tiles_states_strings.xml
index 422f2aa..1c95835 100644
--- a/packages/SystemUI/res/values-el/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-el/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Ανενεργό"</item>
<item msgid="2075645297847971154">"Ενεργό"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Μη διαθέσιμο"</item>
<item msgid="9103697205127645916">"Ανενεργό"</item>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 3427442..8504cb7 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi turned off."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi turned on."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Aeroplane mode turned off."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Aeroplane mode turned on."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Do Not Disturb turned off."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Do Not Disturb turned on."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth turned off."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth turned on."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Location reporting turned off."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Location reporting turned on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"More time."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Less time."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Torch turned off."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Torch turned on."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Colour inversion turned off."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Colour inversion turned on."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobile hotspot turned off."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobile hotspot turned on."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Screen casting stopped."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Data Saver turned off."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Data Saver turned on."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Display brightness"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobile data is paused"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data is paused"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi not connected"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Colour inversion"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Colour correction"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"To connect your keyboard with your tablet, you first have to turn on Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Turn on"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Power notification controls"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"On – Face-based"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Done"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Apply"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
index 9b00c8b..13f236b 100644
--- a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index b6d1b1d..68c5e64 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi turned off."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi turned on."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Airplane mode off."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Airplane mode turned on."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Do Not Disturb turned off."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Do Not Disturb turned on."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth turned off."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth turned on."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Location reporting turned off."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Location reporting turned on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"More time."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Less time."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Flashlight turned off."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Flashlight turned on."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Colour inversion turned off."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Colour inversion turned on."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobile hotspot turned off."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobile hotspot turned on."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Screen casting stopped."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Data Saver turned off."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Data Saver turned on."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Display brightness"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobile data is paused"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data is paused"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi not connected"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Colour inversion"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Colour correction"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"To connect your keyboard with your tablet, you first have to turn on Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Turn on"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Power notification controls"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"On – Face-based"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Done"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Apply"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
index 9b00c8b..13f236b 100644
--- a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 3427442..8504cb7 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi turned off."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi turned on."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Aeroplane mode turned off."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Aeroplane mode turned on."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Do Not Disturb turned off."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Do Not Disturb turned on."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth turned off."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth turned on."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Location reporting turned off."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Location reporting turned on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"More time."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Less time."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Torch turned off."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Torch turned on."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Colour inversion turned off."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Colour inversion turned on."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobile hotspot turned off."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobile hotspot turned on."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Screen casting stopped."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Data Saver turned off."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Data Saver turned on."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Display brightness"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobile data is paused"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data is paused"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi not connected"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Colour inversion"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Colour correction"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"To connect your keyboard with your tablet, you first have to turn on Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Turn on"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Power notification controls"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"On – Face-based"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Done"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Apply"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
index 9b00c8b..13f236b 100644
--- a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 3427442..8504cb7 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi turned off."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi turned on."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Aeroplane mode turned off."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Aeroplane mode turned on."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Do Not Disturb turned off."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Do Not Disturb turned on."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth turned off."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth turned on."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Location reporting turned off."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Location reporting turned on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"More time."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Less time."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Torch turned off."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Torch turned on."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Colour inversion turned off."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Colour inversion turned on."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobile hotspot turned off."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobile hotspot turned on."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Screen casting stopped."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Data Saver turned off."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Data Saver turned on."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Display brightness"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobile data is paused"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data is paused"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi not connected"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Colour inversion"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Colour correction"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"To connect your keyboard with your tablet, you first have to turn on Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Turn on"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Power notification controls"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"On – Face-based"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Done"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Apply"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
index 9b00c8b..13f236b 100644
--- a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index a4e9ab4..60f725e 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work lock screen"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Close"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi turned off."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi turned on."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Airplane mode turned off."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Airplane mode turned on."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total silence"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarms only"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Do Not Disturb."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Do Not Disturb turned off."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Do Not Disturb turned on."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth turned off."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth turned on."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Location reporting turned off."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Location reporting turned on."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm set for <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"More time."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Less time."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Flashlight turned off."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Flashlight turned on."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Color inversion turned off."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Color inversion turned on."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobile hotspot turned off."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobile hotspot turned on."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Screen casting stopped."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Data Saver turned off."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Data Saver turned on."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Display brightness"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobile data is paused"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data is paused"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi not connected"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Color inversion"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Color correction"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"More settings"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"User settings"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Done"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"To connect your keyboard with your tablet, you first have to turn on Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Turn on"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Power notification controls"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"On - Face-based"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Done"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Apply"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
index 0012b57..e6baa31 100644
--- a/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Unavailable"</item>
+ <item msgid="1909756493418256167">"Off"</item>
+ <item msgid="4531508423703413340">"On"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Unavailable"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 9065e7f..66bbbbe 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Pantalla bloqueada del perfil de trabajo"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Cerrar"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi desactivado"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi activado"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Modo de avión desactivado"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Modo de avión activado"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silencio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"solo alarmas"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"No interrumpir."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"La función No interrumpir está desactivada."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Se activó la opción No interrumpir."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activado"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth desactivado"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth activado"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Informes de Ubicación desactivados"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Informes de Ubicación activados"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarma: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Más tiempo"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Menos tiempo"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Linterna desactivada"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Linterna activada"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversión de color desactivada"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversión de color activada"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Zona móvil desactivada"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Zona móvil activada"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Transmisión de pantalla detenida"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Se desactivó el Ahorro de datos."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Se activó el Ahorro de datos."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Brillo de pantalla"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Se detuvo el uso de datos móviles"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Datos pausados"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Red Wi-Fi no conectada"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversión de color"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Más configuraciones"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuración del usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Listo"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Para conectar el teclado con la tablet, primero debes activar Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Activar"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controles de activación de notificaciones"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Activa - En función del rostro"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Con los controles de activación de notificaciones, puedes establecer un nivel de importancia para las notificaciones de una app. \n\n"<b>"Nivel 5"</b>" \n- Mostrar en la parte superior de la lista de notificaciones. \n- Permitir interrupción en la pantalla completa. \n- Mostrar siempre. \n\n"<b>"Nivel 4"</b>" \n- No permitir interrupción en la pantalla completa. \n- Mostrar siempre. \n\n"<b>"Nivel 3"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n\n"<b>"Nivel 2"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n- No sonar ni vibrar. \n\n"<b>"Nivel 1"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n- No sonar ni vibrar. \n- Ocultar de la pantalla bloqueada y la barra de estado. \n- Mostrar al final de la lista de notificaciones. \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas las notificaciones de la app."</string>
<string name="inline_done_button" msgid="6043094985588909584">"Listo"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplicar"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
index afb0e72..0d77977 100644
--- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Desactivado"</item>
<item msgid="2075645297847971154">"Activado"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"No disponible"</item>
<item msgid="9103697205127645916">"Desactivado"</item>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index cf3b2f7..98b45d5 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Pantalla de bloqueo para el perfil de trabajo"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Cerrar"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi desactivado."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi activado."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Modo avión desactivado."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Modo avión activado."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silencio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"solo alarmas"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"No molestar."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"No molestar desactivado."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"No molestar activado."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth desactivado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth activado."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Informes de ubicación desactivados."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Informes de ubicación activados."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"La alarma sonará a la(s) <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Más tiempo."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Menos tiempo."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Linterna desactivada."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Linterna activada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversión de color desactivada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversión de color activada."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Punto de acceso móvil desactivado."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Punto de acceso móvil activado."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Envío de pantalla detenido."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Ahorro de datos desactivado."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Ahorro de datos activado."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Brillo de la pantalla"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Datos móviles en pausa"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Datos pausados"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi no conectado"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Invertir colores"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Más ajustes"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ajustes de usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hecho"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Para poder conectar tu teclado a tu tablet, debes activar el Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Activar"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controles de energía de las notificaciones"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Activado: basado en caras"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Los controles de energía de las notificaciones permiten establecer un nivel de importancia de 0 a 5 para las notificaciones de las aplicaciones. \n\n"<b>"Nivel 5"</b>" \n- Mostrar en la parte superior de la lista de notificaciones \n- Permitir interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n"<b>"Nivel 4"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n"<b>"Nivel 3"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n\n"<b>"Nivel 2"</b>" \n- Evitar interrumpir en el modo de pantalla completa\n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n\n"<b>"Nivel 1"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n- Ocultar de la pantalla de bloqueo y de la barra de estado \n- Mostrar en la parte inferior de la lista de notificaciones \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas las notificaciones de la aplicación"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Hecho"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplicar"</string>
diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml
index dd1ed43..080731a 100644
--- a/packages/SystemUI/res/values-es/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Desactivado"</item>
<item msgid="2075645297847971154">"Activado"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"No disponible"</item>
<item msgid="9103697205127645916">"Desactivado"</item>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 1494f0f..7526b0d 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kuva lukustamine."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Töö lukustuskuva"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Sulgemine"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WiFi on välja lülitatud."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WiFi on sisse lülitatud."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Lennurežiim on välja lülitatud."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Lennukirežiim on sisse lülitatud."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"täielik vaikus"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ainult alarmid"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Mitte segada."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Funktsioon Mitte segada on välja lülitatud."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Funktsioon Mitte segada on sisse lülitatud."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on sees."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth on välja lülitatud."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth on sisse lülitatud."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Asukohateavitus on välja lülitatud."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Asukohateavitus on sisse lülitatud."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Määratud äratus: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Pikem aeg."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Lühem aeg."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Taskulamp on välja lülitatud."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Taskulamp on sisse lülitatud."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Värvi ümberpööramine on välja lülitatud."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Värvi ümberpööramine on sisse lülitatud."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobiilside kuumkoht on välja lülitatud."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobiilside kuumkoht on sisse lülitatud."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Ekraanikuva ülekandmine on peatatud."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Andmemahu säästja on välja lülitatud."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Andmemahu säästja on sisse lülitatud."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Ekraani heledus"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobiilne andmeside on peatatud"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Andmekasutus on peatatud"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"WiFi-ühendus puudub"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Heledus"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Värvide ümberpööramine"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Rohkem seadeid"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Kasutaja seaded"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Klaviatuuri ühendamiseks tahvelarvutiga peate esmalt Bluetoothi sisse lülitama."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Lülita sisse"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Toite märguannete juhtnupud"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Sees – näopõhine"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Toite märguannete juhtnuppudega saate määrata rakenduse märguannete tähtsuse taseme vahemikus 0–5. \n\n"<b>"5. tase"</b>" \n- Kuva märguannete loendi ülaosas\n- Luba täisekraanil häirimine \n- Kuva alati ekraani servas \n\n"<b>"4. tase"</b>" \n- Keela täisekraanil häirimine \n- Kuva alati ekraani servas \n\n"<b>"3. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n\n"<b>"2. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n- Ära kunagi helise ega vibreeri \n\n"<b>"1. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n- Ära kunagi helise ega vibreeri \n- Peida lukustuskuval ja olekuribal \n- Kuva märguannete loendi allosas \n\n"<b>"Tase 0"</b>" \n- Blokeeri kõik rakenduse märguanded"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Valmis"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Rakenda"</string>
diff --git a/packages/SystemUI/res/values-et/tiles_states_strings.xml b/packages/SystemUI/res/values-et/tiles_states_strings.xml
index 26fbe80..26d71fe 100644
--- a/packages/SystemUI/res/values-et/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-et/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Väljas"</item>
<item msgid="2075645297847971154">"Sees"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Pole saadaval"</item>
<item msgid="9103697205127645916">"Väljas"</item>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 565bc1b..71c3feb 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantaila blokeatzeko aukera."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Laneko pantaila blokeatua"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Itxi"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi konexioa desaktibatu egin da."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi konexioa aktibatu egin da."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Hegaldi modua desaktibatu egin da."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Hegaldi modua aktibatu egin da."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"isiltasun osoa"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarmak soilik"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ez molestatzeko modua."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Desaktibatu egin da ez molestatzeko modua."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Aktibatu egin da ez molestatzeko modua."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth-a."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth bidezko konexioa aktibatuta dago."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth bidezko konexioa desaktibatu egin da."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth bidezko konexioa aktibatu egin da."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Kokapena hautemateko aukera desaktibatu egin da."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Kokapena hautemateko aukera aktibatu egin da."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarma ordu honetarako ezarri da: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Denbora gehiago."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Denbora gutxiago."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Flasha desaktibatu egin da."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Flasha aktibatu egin da."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Koloreen alderantzikatzea desaktibatu egin da."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Koloreen alderantzikatzea aktibatu egin da."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Wifi-gune mugikorra desaktibatu egin da."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Wifi-gune mugikorra aktibatu egin da."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Pantaila igortzeari utzi zaio."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Desaktibatuta dago datu-aurrezlea."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Aktibatuta dago datu-aurrezlea."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Bistaratu distira"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Datu-konexioa pausatu egin da"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Datuen erabilera pausatu da"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Ez zaude konektatuta wifi-sarera"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Distira"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kolore-alderantzikatzea"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Ezarpen gehiago"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Erabiltzaile-ezarpenak"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Eginda"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Teklatua tabletara konektatzeko, Bluetooth eginbidea aktibatu behar duzu."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Aktibatu"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Bateria-mailaren arabera jakinarazpenak kontrolatzeko aukerak"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Aktibatuta: aurpegian oinarrituta"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Bateria-mailaren arabera jakinarazpenak kontrolatzeko aukerekin, 0 eta 5 bitarteko garrantzi-mailetan sailka ditzakezu aplikazioen jakinarazpenak. \n\n"<b>"5. maila"</b>" \n- Erakutsi jakinarazpenen zerrendaren goialdean. \n- Baimendu etetea pantaila osoko moduan zaudenean. \n- Agerrarazi beti jakinarazpenak. \n\n"<b>"4. maila"</b>" \n- Galarazi etetea pantaila osoko moduan zaudenean. \n- Agerrarazi beti jakinarazpenak. \n\n"<b>"3. maila"</b>" \n- Galarazi etetea pantaila osoko moduan zaudenean. \n- Ez agerrarazi jakinarazpenik inoiz. \n\n"<b>"2. maila"</b>" \n- Galarazi etetea pantaila osoko moduan zaudenean. \n- Ez agerrarazi jakinarazpenik inoiz. \n- Ez egin soinurik edo dardararik inoiz. \n\n"<b>"1. maila"</b>" \n- Galarazi etetea pantaila osoko moduan zaudenean. \n- Ez agerrarazi jakinarazpenik inoiz. \n- Ez egin soinurik edo dardararik inoiz. \n- Ezkutatu pantaila blokeatutik eta egoera-barratik. \n- Erakutsi jakinarazpenen zerrendaren behealdean. \n\n"<b>"0. maila"</b>" \n- Blokeatu aplikazioaren jakinarazpen guztiak."</string>
<string name="inline_done_button" msgid="6043094985588909584">"Eginda"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplikatu"</string>
@@ -863,7 +848,7 @@
<string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak irudi bat bidali du"</string>
<string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak egoera eguneratu du: <xliff:g id="STATUS">%2$s</xliff:g>"</string>
<string name="person_available" msgid="2318599327472755472">"Konektatuta"</string>
- <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat gertatu da bateria-neurgailua irakurtzean"</string>
+ <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat izan da bateria-neurgailua irakurtzean"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Informazio gehiago lortzeko, sakatu hau"</string>
<string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ez da ezarri alarmarik"</string>
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Hatz-marken sentsorea"</string>
diff --git a/packages/SystemUI/res/values-eu/tiles_states_strings.xml b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
index a2a08db..1109045 100644
--- a/packages/SystemUI/res/values-eu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Desaktibatuta"</item>
<item msgid="2075645297847971154">"Aktibatuta"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ez dago erabilgarri"</item>
<item msgid="9103697205127645916">"Desaktibatuta"</item>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 674101d6..4efdc84 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"صفحه قفل."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"صفحه قفل کاری"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"بستن"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi خاموش شد."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi روشن شد."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"حالت هواپیما خاموش شد."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"حالت هواپیما روشن شد."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"سکوت کامل"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"فقط زنگ ساعت"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"مزاحم نشوید."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"«مزاحم نشوید» خاموش شد."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"«مزاحم نشوید» روشن شد."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"بلوتوث."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"بلوتوث روشن است."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"بلوتوث خاموش شد."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"بلوتوث روشن شد."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"گزارش موقعیت مکانی خاموش شد."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"گزارش موقعیت مکانی روشن شد."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"زنگ برای <xliff:g id="TIME">%s</xliff:g> تنظیم شد."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"زمان بیشتر."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"زمان کمتر."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"چراغ قوه خاموش شد."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"چراغ قوه روشن شد."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"وارونگی رنگ خاموش شد."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"وارونگی رنگ روشن شد."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"نقطه اتصال دستگاه همراه خاموش شد."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"نقطه اتصال دستگاه همراه روشن شد."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"فرستادن صفحه نمایش متوقف شد."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"صرفهجویی داده خاموش شد."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"صرفهجویی داده روشن شد."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"روشنایی نمایشگر"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"داده تلفن همراه موقتاً متوقف شده است"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"داده موقتاً متوقف شده است"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi وصل نیست"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"روشنایی"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"وارونگی رنگ"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"تنظیمات بیشتر"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"تنظیمات کاربر"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"تمام"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"برای مرتبط کردن صفحهکلید با رایانه لوحی، ابتدا باید بلوتوث را روشن کنید."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"روشن کردن"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"کنترلهای قدرتمند اعلان"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"روشن - براساس چهره"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"با کنترلهای قدرتمند اعلان میتوانید سطح اهمیت اعلانهای هر برنامه را از ۰ تا ۵ تعیین کنید. \n\n"<b>"سطح ۵"</b>" \n- در صدر فهرست اعلانها نشان داده میشود \n- وقفه برای نمایش تمامصفحه مجاز است \n- همیشه اجمالی نشان داده میشود \n\n"<b>"سطح ۴"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- همیشه اجمالی نشان داده میشود \n\n"<b>"سطح ۳"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n\n"<b>"سطح ۲"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n- هیچوقت صدا و لرزش ایجاد نمیکند \n\n"<b>"سطح ۱"</b>" \n- نمایش تمام صفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n- هیچوقت صدا یا لرزش ایجاد نمیکند \n- در صفحه قفل و نوار وضعیت پنهان است \n- در پایین فهرست اعلانها نشان داده میشود \n\n"<b>"سطح ۰"</b>" \n- همه اعلانهای این برنامه مسدود است"</string>
<string name="inline_done_button" msgid="6043094985588909584">"تمام"</string>
<string name="inline_ok_button" msgid="603075490581280343">"اعمال"</string>
diff --git a/packages/SystemUI/res/values-fa/tiles_states_strings.xml b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
index 8c40e71..ab75519 100644
--- a/packages/SystemUI/res/values-fa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"خاموش"</item>
<item msgid="2075645297847971154">"روشن"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"دردسترس نیست"</item>
<item msgid="9103697205127645916">"خاموش"</item>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 432d951..1ab196f 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lukitse näyttö."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Työlukitusnäyttö"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Sulje"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi otettiin käyttöön."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Lentokonetila poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Lentokonetila otettiin käyttöön."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"hiljennä kaikki"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"vain herätykset"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Älä häiritse."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Älä häiritse -tila poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Älä häiritse -tila otettiin käyttöön."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth on päällä."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth otettiin käyttöön."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Sijainnin ilmoittaminen poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Sijainnin ilmoittaminen otettiin käyttöön."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Hälytys asetettu, aika: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Lisää aikaa."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Vähennä aikaa."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Taskulamppu poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Taskulamppu otettiin käyttöön."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Käänteiset värit poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Käänteiset värit otettiin käyttöön."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobiiliyhteyden hotspot poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobiiliyhteyden hotspot otettiin käyttöön."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Ruudun lähetys pysäytettiin."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Data Saver poistettiin käytöstä."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Data Saver otettiin käyttöön."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Näytön kirkkaus"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobiilidatan käyttö on keskeytetty"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Tiedonsiirto keskeytettiin"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fiä ei ole yhdistetty"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kirkkaus"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Käänteiset värit"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Lisäasetukset"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Käyttäjäasetukset"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Valmis"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Jotta voit yhdistää näppäimistön tablettiisi, sinun on ensin otettava Bluetooth käyttöön."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Ota käyttöön"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Ilmoitusten tehohallinta"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Päällä – kasvojen perusteella"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Ilmoitusten tehohallinnan avulla voit määrittää sovelluksen ilmoituksille tärkeystason väliltä 0–5. \n\n"<b>"Taso 5"</b>" \n– Ilmoitukset näytetään ilmoitusluettelon yläosassa \n– Näkyminen koko näytön tilassa sallitaan \n– Ilmoitukset kurkistavat aina näytölle\n\n"<b>"Taso 4"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ilmoitukset kurkistavat aina näytölle \n\n"<b>"Taso 3"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n\n"<b>"Taso 2"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n– Ei ääniä eikä värinää \n\n"<b>"Taso 1"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n– Ei ääniä eikä värinää \n– Ilmoitukset piilotetaan lukitusnäytöltä ja tilapalkista \n– Ilmoitukset näytetään ilmoitusluettelon alaosassa \n\n"<b>"Taso 0"</b>" \n– Kaikki sovelluksen ilmoitukset estetään"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Valmis"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Käytä"</string>
diff --git a/packages/SystemUI/res/values-fi/tiles_states_strings.xml b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
index cb9e07c..6fa9466 100644
--- a/packages/SystemUI/res/values-fi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Poissa päältä"</item>
<item msgid="2075645297847971154">"Päällä"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ei saatavilla"</item>
<item msgid="9103697205127645916">"Poissa päältä"</item>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 1123c40..4eadcc2 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Écran de verrouillage"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Verrouillage de l\'écran du profil professionnel"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fermer"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi désactivé"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi activé."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Le mode Avion est désactivé."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Le mode Avion est activé."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"aucune interruption"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarmes seulement"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne pas déranger."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Le mode Ne pas déranger est désactivé."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Le mode Ne pas déranger est activé."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activé."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth désactivé."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth activé."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Signalement de position désactivé."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Signalement de position activé."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme réglée sur <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Plus longtemps"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Moins longtemps."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Lampe de poche désactivée."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Lampe de poche activée."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversion des couleurs désactivée."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversion des couleurs activée."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Point d\'accès mobile désactivé."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Point d\'accès mobile activé."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Diffusion d\'écran arrêtée."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Mode Économiseur de données désactivé."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Mode Économiseur de données activé."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Luminosité de l\'écran"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Données cellulaires interrompues"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Données désactivées"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Non connecté au Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosité"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversion des couleurs"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Plus de paramètres"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Paramètres utilisateur"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Terminé"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Pour connecter votre clavier à votre tablette, vous devez d\'abord activer la connectivité Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Activer"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Réglages avancés des notifications"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Activé : en fonction du visage"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Avec les réglages avancés des notifications, vous pouvez définir un degré d\'importance de 0 à 5 pour les notifications d\'une application. \n\n"<b>"Niveau 5"</b>" \n- Afficher dans le haut de la liste des notifications \n- Autoriser les interruptions en mode plein écran \n- Toujours afficher les aperçus \n\n"<b>"Niveau 4"</b>" \n- Empêcher les interruptions en mode plein écran \n- Toujours afficher les aperçus \n\n"<b>"Niveau 3"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n\n"<b>"Niveau 2"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n- Ne pas autoriser les sons et les vibrations \n\n"<b>"Niveau 1"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n- Ne pas autoriser les sons et les vibrations \n- Masquer de l\'écran de verrouillage et de la barre d\'état status bar \n- Afficher dans le bas de la liste des notifications \n\n"<b>"Level 0"</b>" \n- Bloquer toutes les notifications de l\'application"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Terminé"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Appliquer"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
index eb38d94..aec8ab8 100644
--- a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Désactivé"</item>
<item msgid="2075645297847971154">"Activé"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Non disponible"</item>
<item msgid="9103697205127645916">"Désactivée"</item>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 74ad1bd..33fc294 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Écran de verrouillage"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Écran de verrouillage du profil professionnel"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fermer"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi désactivé."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi activé."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Le mode Avion est désactivé."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Le mode Avion est activé."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"aucune interruption"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alarmes uniquement"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne pas déranger."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Le mode Ne pas déranger a été désactivé."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Le mode Ne pas déranger a été activé."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activé."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth désactivé."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth activé."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Mise à jour de la position désactivée."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Mise à jour de la position activée."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme réglée sur <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Plus longtemps"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Moins longtemps"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Lampe de poche désactivée."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Lampe de poche activée."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversion des couleurs désactivée."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversion des couleurs activée."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Point d\'accès mobile désactivé."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Point d\'accès mobile activé."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Diffusion d\'écran interrompue."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"L\'économiseur de données est désactivé."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"L\'économiseur de données est activé."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Luminosité de l\'affichage"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Les données mobiles sont suspendues"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Données désactivées"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi non connecté"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosité"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversion des couleurs"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Plus de paramètres"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Paramètres utilisateur"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"OK"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Pour connecter un clavier à votre tablette, vous devez avoir activé le Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Activer"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Commandes de gestion des notifications"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Active - En fonction du visage"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Grâce aux commandes de gestion des notifications, vous pouvez définir le niveau d\'importance (compris entre 0 et 5) des notifications d\'une application. \n\n"<b>"Niveau 5"</b>" \n- Afficher en haut de la liste des notifications \n- Autoriser l\'interruption en plein écran \n- Toujours en aperçu \n\n"<b>"Niveau 4"</b>" \n- Empêcher l\'interruption en plein écran \n- Toujours en aperçu \n\n"<b>"Niveau 3"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n\n"<b>"Niveau 2"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n- Ne jamais émettre de signal sonore ni déclencher le vibreur \n\n"<b>"Niveau 1"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n- Ne jamais émettre de signal sonore ni déclencher le vibreur \n- Masquer les notifications dans l\'écran de verrouillage et la barre d\'état \n- Afficher au bas de la liste des notifications \n\n"<b>"Niveau 0"</b>" \n- Bloquer toutes les notifications de l\'application"</string>
<string name="inline_done_button" msgid="6043094985588909584">"OK"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Appliquer"</string>
diff --git a/packages/SystemUI/res/values-fr/tiles_states_strings.xml b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
index 3aefb1d..01d9c1d 100644
--- a/packages/SystemUI/res/values-fr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Désactivé"</item>
<item msgid="2075645297847971154">"Activé"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponible"</item>
<item msgid="9103697205127645916">"Désactivée"</item>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 121d434..40fe254 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Pantalla de bloqueo."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Pantalla de bloqueo do perfil de traballo"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Pechar"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi desactivada."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi activada."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Desactivouse o modo avión."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Activouse o modo avión."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silencio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"só alarmas"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Modo Non molestar."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Desactivouse o modo Non molestar."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Activouse o modo Non molestar."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth activado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth desactivado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth activado."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Desactiváronse os Informes de localización."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Activáronse os Informes de localización."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarma definida para as <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Máis tempo."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Menos tempo."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Desactivouse a lanterna."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Activouse a lanterna."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Desactivouse a inversión da cor."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Activouse a inversión da cor."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Desactivouse a zona wifi móbil."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Activouse a zona wifi móbil."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Detívose a emisión en pantalla."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Desactivouse o aforro de datos."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Activouse o aforro de datos."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Brillo de pantalla"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Pausáronse os datos móbiles"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Os datos están en pausa"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"A wifi non está conectada"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillo"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversión da cor"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Máis opcións"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Configuración de usuario"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Feito"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Para conectar o teu teclado coa tableta, primeiro tes que activar o Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Activar"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controis de notificacións mellorados"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Activada: baseada na cara"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Cos controis de notificacións mellorados, podes asignarlles un nivel de importancia comprendido entre 0 e 5 ás notificacións dunha aplicación determinada. \n\n"<b>"Nivel 5"</b>" \n- Mostrar na parte superior da lista de notificacións. \n- Permitir interrupcións no modo de pantalla completa. \n- Mostrar sempre. \n\n"<b>"Nivel 4"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Mostrar sempre. \n\n"<b>"Nivel 3"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n\n"<b>"Nivel 2"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n- Non soar nin vibrar nunca. \n\n"<b>"Nivel 1"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n- Non soar nin vibrar nunca. \n- Ocultar na pantalla de bloqueo e na barra de estado. \n- Mostrar na parte inferior da lista de notificacións. \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas as notificacións da aplicación."</string>
<string name="inline_done_button" msgid="6043094985588909584">"Feito"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplicar"</string>
diff --git a/packages/SystemUI/res/values-gl/tiles_states_strings.xml b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
index 90dcf7d..9045983 100644
--- a/packages/SystemUI/res/values-gl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Non"</item>
<item msgid="2075645297847971154">"Si"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Non dispoñible"</item>
<item msgid="9103697205127645916">"Non"</item>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index c397848..da52c40 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"લૉક સ્ક્રીન."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"કાર્ય લૉક સ્ક્રીન"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"બંધ કરો"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi બંધ કર્યું."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi ચાલુ કર્યું."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"એરપ્લેન મોડ બંધ કર્યું."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"એરપ્લેન મોડ ચાલુ કર્યો."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"બિલકુલ અવાજ નહીં"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"માત્ર અલાર્મ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ખલેલ પાડશો નહીં."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"ખલેલ પાડશો નહીં બંધ કર્યું."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"ખલેલ પાડશો નહીં ચાલુ કર્યું."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"બ્લૂટૂથ."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"બ્લૂટૂથ ચાલુ."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"બ્લૂટૂથ બંધ કરી."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"બ્લૂટૂથ ચાલુ કર્યું."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"સ્થાનની જાણ કરવી બંધ કર્યું."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"સ્થાનની જાણ કરવી ચાલુ કર્યું."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> માટે એલાર્મ સેટ કર્યું."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"વધુ સમય."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"ઓછો સમય."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ફ્લેશલાઇટ બંધ કરી."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ફ્લેશલાઇટ ચાલુ કરી."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"રંગ ઉલટાવવાનું બંધ કર્યું."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"રંગ ઉલટાવવાનું ચાલુ કર્યું."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"મોબાઇલ હૉટસ્પૉટ બંધ કર્યું."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"મોબાઇલ હૉટસ્પૉટ ચાલુ કર્યું."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"સ્ક્રીન કાસ્ટિંગ બંધ કર્યું."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ડેટા સેવર બંધ કર્યું."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ડેટા સેવર ચાલુ કર્યું."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"પ્રદર્શન તેજ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"મોબાઇલ ડેટા થોભાવ્યો છે"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ડેટા થોભાવ્યો છે"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"વાઇ-ફાઇ કનેક્ટ નથી"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"તેજ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"વિપરીત રંગમાં બદલવું"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"વધુ સેટિંગ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"વપરાશકર્તા સેટિંગ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"થઈ ગયું"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"તમારા ટેબ્લેટ સાથે કીબોર્ડ કનેક્ટ કરવા માટે, તમારે પહેલાં બ્લૂટૂથ ચાલુ કરવાની જરૂર પડશે."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ચાલુ કરો"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"પાવર સૂચના નિયંત્રણો"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ચાલુ છે - ચહેરા આધારિત રોટેશન"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"પાવર સૂચના નિયંત્રણો સાથે, તમે ઍપની સૂચનાઓ માટે 0 થી 5 સુધીના મહત્વના સ્તરને સેટ કરી શકો છો. \n\n"<b>"સ્તર 5"</b>" \n- સૂચના સૂચિની ટોચ પર બતાવો \n- પૂર્ણ સ્ક્રીન અવરોધની મંજૂરી આપો \n- હંમેશાં ત્વરિત દૃષ્ટિ કરો \n\n"<b>"સ્તર 4"</b>" \n- પૂર્ણ સ્ક્રીન અવરોધ અટકાવો \n- હંમેશાં ત્વરિત દૃષ્ટિ કરો \n\n"<b>"સ્તર 3"</b>" \n- પૂર્ણ સ્ક્રીન અવરોધ અટકાવો \n- ક્યારેય ત્વરિત દૃષ્ટિ કરશો નહીં \n\n"<b>"સ્તર 2"</b>" \n- પૂર્ણ સ્ક્રીન અવરોધ અટકાવો \n- ક્યારેય ત્વરિત દૃષ્ટિ કરશો નહીં \n- ક્યારેય અવાજ અથવા વાઇબ્રેટ કરશો નહીં \n\n"<b>"સ્તર 1"</b>" \n- પૂર્ણ સ્ક્રીન અવરોધની મંજૂરી આપો \n- ક્યારેય ત્વરિત દૃષ્ટિ કરશો નહીં \n- ક્યારેય અવાજ અથવા વાઇબ્રેટ કરશો નહીં \n- લૉક સ્ક્રીન અને સ્ટેટસ બારથી છુપાવો \n- સૂચના સૂચિના તળિયા પર બતાવો \n\n"<b>"સ્તર 0"</b>" \n- ઍપની તમામ સૂચનાઓને બ્લૉક કરો"</string>
<string name="inline_done_button" msgid="6043094985588909584">"થઈ ગયું"</string>
<string name="inline_ok_button" msgid="603075490581280343">"લાગુ કરો"</string>
diff --git a/packages/SystemUI/res/values-gu/tiles_states_strings.xml b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
index e50f3cf..15b0f9f 100644
--- a/packages/SystemUI/res/values-gu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"બંધ છે"</item>
<item msgid="2075645297847971154">"ચાલુ છે"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ઉપલબ્ધ નથી"</item>
<item msgid="9103697205127645916">"બંધ છે"</item>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 098b2a1..54b7389 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"लॉक स्क्रीन."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"वर्क लॉक स्क्रीन"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"बंद करें"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"वाई-फ़ाई को बंद किया गया."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"वाई-फ़ाई को चालू किया गया."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"हवाई जहाज़ मोड को बंद किया गया."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"हवाई जहाज़ मोड को चालू किया गया."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"कोई आवाज़ सुनाई नहीं देगी"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"सिर्फ़ अलार्म की आवाज़ सुनाई देगी"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"परेशान न करें."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\'परेशान न करें\' बंद किया गया."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\'परेशान न करें\' चालू किया गया."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ब्लूटूथ."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ब्लूटूथ चालू है."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ब्लूटूथ को बंद किया गया."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ब्लूटूथ को चालू किया गया."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"जगह की रिपोर्ट को बंद किया गया."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"जगह की रिपोर्ट को चालू किया गया."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> के लिए अलार्म सेट किया गया."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ज़्यादा समय."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"कम समय."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"फ़्लैशलाइट को बंद किया गया."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"फ़्लैशलाइट को चालू किया गया."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"रंग व्युत्क्रमण को बंद किया गया."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"रंग व्युत्क्रमण को चालू किया गया."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"मोबाइल हॉटस्पॉट को बंद किया गया."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"मोबाइल हॉटस्पॉट को चालू किया गया."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"स्क्रीन कास्ट करना रुक गया."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"डेटा बचाने की सेटिंग बंद कर दी गई है."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"डेटा बचाने की सेटिंग चालू कर दी गई है."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"स्क्रीन की स्क्रीन की रोशनी"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"मोबाइल डेटा रोक दिया गया है"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"डेटा रोक दिया गया है"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"वाई-फ़ाई कनेक्ट नहीं है"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"स्क्रीन की रोशनी"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"रंग बदलने की सुविधा"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"और सेटिंग"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"उपयोगकर्ता सेटिंग"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"हो गया"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"अपने कीबोर्ड को अपने टैबलेट से कनेक्ट करने के लिए, आपको पहले ब्लूटूथ चालू करना होगा."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"चालू करें"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"पावर सूचना नियंत्रण"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"चालू है - चेहरे की गतिविधि के हिसाब से कैमरे को घुमाने की सुविधा"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"पावर सूचना नियंत्रण के ज़रिये, आप किसी ऐप की सूचना को उसकी अहमियत के हिसाब से 0 से 5 के लेवल पर सेट कर सकते हैं.\n\n"<b>"लेवल 5"</b>" \n- सूचना सूची में सबसे ऊपर दिखाएं \n- पूरे स्क्रीन को ढंकने की अनुमति दें \n- लगातार देखते रहें \n\n"<b>" लेवल 4"</b>" \n- पूरे स्क्रीन को ढंकें \n- लगातार देखते रहें \n\n"<b>"लेवल 3"</b>" \n- पूरे स्क्रीन को ढंकने से रोकें \n-कभी भी न देखें \n\n"<b>"लेवल 2"</b>" \n- पूरे स्क्रीन को ढंकने से रोकें \n- कभी भी देखें \n- कभी भी आवाज़ या कंपन (वाइब्रेशन) न करें \n\n"<b>"लेवल 1"</b>" \n- पूरे स्क्रीन को ढंकने से रोकें \n- कभी भी न देखें \n- कभी भी आवाज़ या कंपन (वाइब्रेशन) न करें \n- लॉक स्क्रीन और स्टेटस बार से छिपाएं \n- सूचना सूची के नीचे दिखाएं \n\n"<b>"लेवल 0"</b>" \n- ऐप्लिकेशन की सभी सूचनाएं रोक दें"</string>
<string name="inline_done_button" msgid="6043094985588909584">"हो गया"</string>
<string name="inline_ok_button" msgid="603075490581280343">"लागू करें"</string>
diff --git a/packages/SystemUI/res/values-hi/tiles_states_strings.xml b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
index 7698912..00fa699 100644
--- a/packages/SystemUI/res/values-hi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"बंद है"</item>
<item msgid="2075645297847971154">"चालू है"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"उपलब्ध नहीं है"</item>
<item msgid="9103697205127645916">"बंद है"</item>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 45fa359..8931d20 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaključavanje zaslona."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaključan zaslon radnog profila"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvaranje"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi isključen."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi uključen."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Način rada u zrakoplovu isključen."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Način rada u zrakoplovu uključen."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"potpuna tišina"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"samo alarmi"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne uznemiravaj."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Isključena je značajka Ne uznemiravaj."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Uključena je značajka Ne uznemiravaj."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth uključen."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth isključen."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth uključen."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Izvješćivanje o lokaciji isključeno."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Izvješćivanje o lokaciji uključeno."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Vrijeme alarma: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Više vremena."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Manje vremena."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Svjetiljka isključena."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Svjetiljka uključena."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inverzija boja isključena."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inverzija boja uključena."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobilna žarišna točka isključena."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobilna žarišna točka uključena."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Emitiranje zaslona zaustavljeno."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Štednja podatkovnog prometa isključena."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Štednja podatkovnog prometa uključena."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Svjetlina zaslona"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobilni su podaci pauzirani"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Podaci su pauzirani"</string>
@@ -252,6 +234,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi mreža nije povezana"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Svjetlina"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija boja"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Više postavki"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Korisničke postavke"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotovo"</string>
@@ -490,6 +474,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Da biste povezali tipkovnicu s tabletom, morate uključiti Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Uključi"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Napredne kontrole obavijesti"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Uključeno – na temelju lica"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Napredne kontrole obavijesti omogućuju vam da postavite razinu važnosti za obavijesti aplikacije od 0 do 5. \n\n"<b>"Razina 5"</b>" \n– prikaži na vrhu popisa obavijesti \n– dopusti prekide prikaza na cijelom zaslonu \n– uvijek dopusti brzi pregled \n\n"<b>"Razina 4"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– uvijek dopusti brzi pregled \n\n"<b>"Razina 3"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled\n\n"<b>"Razina 2"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled \n– nikad ne emitiraj zvuk ni vibraciju \n\n"<b>"Razina 1"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled \n– nikad ne emitiraj zvuk ni vibraciju \n– ne prikazuj na zaključanom zaslonu i traci statusa \n– prikaži na dnu popisa obavijesti \n\n"<b>"Razina 0"</b>" \n– blokiraj sve obavijesti aplikacije"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Gotovo"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Primijeni"</string>
diff --git a/packages/SystemUI/res/values-hr/tiles_states_strings.xml b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
index ae9ffb3..7300816 100644
--- a/packages/SystemUI/res/values-hr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Isključeno"</item>
<item msgid="2075645297847971154">"Uključeno"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nedostupno"</item>
<item msgid="9103697205127645916">"Isključeno"</item>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 5539787..eff9e82 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lezárási képernyő."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Munka lezárási képernyővel"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Bezárás"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi kikapcsolva."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi bekapcsolva."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Repülős üzemmód kikapcsolva."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Repülős üzemmód bekapcsolva."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"teljes némítás"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"csak ébresztések"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne zavarjanak."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"A Ne zavarjanak mód kikapcsolva."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"A Ne zavarjanak mód bekapcsolva."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth bekapcsolva."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth kikapcsolva."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth bekapcsolva."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"A tartózkodási hely jelentése kikapcsolva."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"A tartózkodási hely jelentése bekapcsolva."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Ébresztés időpontja: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Több idő."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Kevesebb idő."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Vaku kikapcsolva."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Vaku bekapcsolva."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"A színek invertálása kikapcsolva."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"A színek invertálása bekapcsolva."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"A mobil hotspot kikapcsolva."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"A mobil hotspot bekapcsolva."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"A képernyő átküldése leállítva."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Adatforgalom-csökkentő kikapcsolva."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Adatforgalom-csökkentő bekapcsolva."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"A kijelző fényereje"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobiladatok szüneteltetve"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Az adatforgalom szünetel"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Nem kapcsolódik Wi‑Fi-hálózathoz"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Fényerő"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Színek invertálása"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"További beállítások"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Felhasználói beállítások"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Kész"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Ha a billentyűzetet csatlakoztatni szeretné táblagépéhez, először engedélyeznie kell a Bluetooth-kapcsolatot."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Bekapcsolás"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Teljes körű értesítésvezérlők"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Be: Arcalapú"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Az értesítési beállítások révén 0-tól 5-ig állíthatja be a fontossági szintet az alkalmazás értesítéseinél. \n\n"<b>"5. szint"</b>" \n– Megjelenítés az értesítési lista tetején \n– Teljes képernyő megszakításának engedélyezése \n– Mindig felugrik \n\n"<b>"4. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Mindig felugrik \n\n"<b>"3. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n\n"<b>"2. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n– Soha nincs hangjelzés és rezgés \n\n"<b>"1. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n– Soha nincs hangjelzés vagy rezgés \n– Elrejtés a lezárási képernyőről és az állapotsávról \n– Megjelenítés az értesítési lista alján \n\n"<b>"0. szint"</b>" \n– Az alkalmazás összes értesítésének letiltása"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Kész"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Alkalmaz"</string>
diff --git a/packages/SystemUI/res/values-hu/tiles_states_strings.xml b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
index 140f2db..52450e4 100644
--- a/packages/SystemUI/res/values-hu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Ki"</item>
<item msgid="2075645297847971154">"Be"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nem áll rendelkezésre"</item>
<item msgid="9103697205127645916">"Ki"</item>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 7323cef..084b309 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Էկրանի կողպում:"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Աշխատանքային պրոֆիլի կողպէկրան"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Փակել"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi-ն անջատվեց:"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi-ը միացավ:"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Ավիառեժիմն անջատվեց:"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Ավիառեժիմը միացավ:"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"կատարյալ լռություն"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"միայն զարթուցիչը"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Չանհանգստացնել։"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"«Չանհանգստացնել» ռեժիմն անջատվեց։"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"«Չանհանգստացնել» ռեժիմը միացվեց։"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth:"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth-ը միացված է:"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth-ն անջատվեց:"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth-ը միացավ:"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Տեղադրության ծանուցումն անջատվեց:"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Տեղադրության ծանուցումը միացավ:"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Զարթուցիչը դրված է <xliff:g id="TIME">%s</xliff:g>-ին:"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Ավելացնել ժամանակը:"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Պակասեցնել ժամանակը:"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Լապտերն անջատվեց:"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Լապտերը միացավ:"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Գունաշրջումն անջատվեց:"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Գունաշրջումը միացավ:"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Շարժական կապի WiFi ցրիչն անջատվեց:"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Շարժական կապի WiFi ցրիչը միացավ:"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Էկրանի հեռարձակումն ընդհատվեց:"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Տվյալների խնայումն անջատվեց:"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Թրաֆիկի տնտեսումը միացվեց:"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Ցուցադրել պայծառությունը"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Բջջային տվյալներն ընդհատված են"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Տվյալների օգտագործումը դադարեցված է"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi-ը միացված չէ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Պայծառություն"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Գունաշրջում"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Հավելյալ կարգավորումներ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Օգտատիրոջ կարգավորումներ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Պատրաստ է"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Ստեղնաշարը ձեր պլանշետին միացնելու համար նախ անհրաժեշտ է միացնել Bluetooth-ը:"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Միացնել"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Ծանուցումների ընդլայնված կառավարում"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Միաց․ – Դիմաճանաչման հիման վրա"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Ծանուցումների ընդլայնված կառավարման օգնությամբ կարող եք յուրաքանչյուր հավելվածի ծանուցումների համար նշանակել կարևորության աստիճան՝ 0-5 սահմաններում: \n\n"<b>"5-րդ աստիճան"</b>" \n- Ցուցադրել ծանուցումների ցանկի վերևում \n- Թույլատրել լիաէկրան ընդհատումները \n- Միշտ ցուցադրել կարճ ծանուցումները \n\n"<b>"4-րդ աստիճան"</b>" \n- Արգելել լիաէկրան ընդհատումները \n- Միշտ ցուցադրել կարճ ծանուցումները \n\n"<b>"3-րդ աստիճան"</b>" \n- Արգելել լիաէկրան ընդհատումները \n- Արգելել կարճ ծանուցումների ցուցադրումը \n\n"<b>"2-րդ աստիճան"</b>" \n- Արգելել լիաէկրան ընդհատումները \n- Արգելել կարճ ծանուցումների ցուցադրումը \n- Անջատել ձայնը և թրթռումը \n\n"<b>"1-ին աստիճան"</b>" \n- Արգելել լիաէկրան ընդհատումները \n- Արգելել կարճ ծանուցումների ցուցադրումը \n- Անջատել ձայնը և թրթռումը \n- Չցուցադրել կողպէկրանում և կարգավիճակի գոտում \n- Ցուցադրել ծանուցումների ցանկի ներքևում \n\n"<b>"0-րդ աստիճան"</b>\n"- Արգելափակել հավելվածի բոլոր ծանուցումները"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Փակել"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Կիրառել"</string>
diff --git a/packages/SystemUI/res/values-hy/tiles_states_strings.xml b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
index df69ce7..23a096b 100644
--- a/packages/SystemUI/res/values-hy/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Անջատված է"</item>
<item msgid="2075645297847971154">"Միացված է"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Հասանելի չէ"</item>
<item msgid="9103697205127645916">"Անջատված է"</item>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index f659465..e595045 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Layar kunci."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Layar kunci kantor"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Tutup"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi dinonaktifkan."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi diaktifkan."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Mode pesawat dinonaktifkan."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Mode pesawat diaktifkan."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"senyap total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"hanya alarm"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Jangan Ganggu."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Mode Jangan Ganggu dinonaktifkan."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Mode Jangan Ganggu diaktifkan."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aktif."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth dinonaktifkan."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth diaktifkan."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Pelaporan lokasi dinonaktifkan."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Pelaporan lokasi diaktifkan."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm disetel ke <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Lebih lama."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Lebih cepat."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Senter dinonaktifkan."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Senter diaktifkan."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversi warna dinonaktifkan."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversi warna diaktifkan."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Hotspot seluler dinonaktifkan."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Hotspot seluler diaktifkan."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Transmisi layar berhenti."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Penghemat Data nonaktif."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Penghemat Data diaktifkan."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Kecerahan tampilan"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Data seluler dijeda"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data dijeda"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi tidak terhubung"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kecerahan"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversi warna"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Setelan lainnya"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setelan pengguna"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Untuk menghubungkan keyboard dengan tablet, terlebih dahulu aktifkan Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Aktifkan"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Kontrol notifikasi daya"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Aktif - Berbasis deteksi wajah"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Dengan kontrol notifikasi daya, Anda dapt menyetel level kepentingan notifikasi aplikasi dari 0 sampai 5. \n\n"<b>"Level 5"</b>" \n- Muncul di atas daftar notifikasi \n- Izinkan interupsi layar penuh \n- Selalu intip pesan \n\n"<b>"Level 4"</b>" \n- Jangan interupsi layar penuh \n- Selalu intip pesan \n\n"<b>"Level 3"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n\n"<b>"Level 2"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n- Tanpa suara dan getaran \n\n"<b>"Level 1"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n- Tanpa suara atau getaran \n- Sembunyikan dari layar kunci dan bilah status \n- Muncul di bawah daftar notifikasi \n\n"<b>"Level 0"</b>" \n- Blokir semua notifikasi dari aplikasi"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Selesai"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Terapkan"</string>
diff --git a/packages/SystemUI/res/values-in/tiles_states_strings.xml b/packages/SystemUI/res/values-in/tiles_states_strings.xml
index 811294f..c296e54 100644
--- a/packages/SystemUI/res/values-in/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-in/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Nonaktif"</item>
<item msgid="2075645297847971154">"Aktif"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Tidak tersedia"</item>
<item msgid="9103697205127645916">"Nonaktif"</item>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 48068b1..43ae1b6 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lásskjár."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Vinnulásskjár"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Loka"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Slökkt á Wi-Fi."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Kveikt á Wi-Fi."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Slökkt á flugstillingu."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Kveikt á flugstillingu."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"algjör þögn"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"aðeins vekjarar"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ónáðið ekki."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Slökkt á „Ónáðið ekki“."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Kveikt á „Ónáðið ekki“."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Kveikt á Bluetooth."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Slökkt á Bluetooth."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Kveikt á Bluetooth."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Slökkt á staðsetningartilkynningum."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Kveikt á staðsetningartilkynningum."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Vekjari stilltur á <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Meiri tími."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Minni tími."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Slökkt á vasaljósi."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Kveikt á vasaljósi."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Slökkt á umsnúningi lita."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Kveikt á umsnúningi lita."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Slökkt á farsímaaðgangsstað."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Kveikt á farsímaaðgangsstað."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Skjáútsendingu hætt."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Slökkt var á gagnasparnaði."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Kveikt var á gagnasparnaði."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Birtustig skjás"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Hlé gert á farsímagögnum"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Slökkt er á gagnanotkun"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi ekki tengt"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Birtustig"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Umsnúningur lita"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Fleiri stillingar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Notandastillingar"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Lokið"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Til að geta tengt lyklaborðið við spjaldtölvuna þarftu fyrst að kveikja á Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Kveikja"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Orkustillingar tilkynninga"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Kveikt – út frá andliti"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Með orkutilkynningastýringum geturðu stillt mikilvægi frá 0 upp í 5 fyrir tilkynningar forrita. \n\n"<b>"Stig 5"</b>" \n- Sýna efst á tilkynningalista \n- Leyfa truflun þegar birt er á öllum skjánum \n- Kíkja alltaf \n\n"<b>"Stig 4"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja alltaf \n\n"<b>"Stig 3"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n\n"<b>"Stig 2"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n- Slökkva á hljóði og titringi \n\n"<b>"Stig 1"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n- Slökkva á hljóði og titringi \n- Fela á lásskjá og stöðustiku \n- Sýna neðst á tilkynningalista \n\n"<b>"Stig 0"</b>" \n- Setja allar tilkynningar frá forriti á bannlista"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Lokið"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Nota"</string>
diff --git a/packages/SystemUI/res/values-is/tiles_states_strings.xml b/packages/SystemUI/res/values-is/tiles_states_strings.xml
index dd704a7..25b3dcc 100644
--- a/packages/SystemUI/res/values-is/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-is/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Slökkt"</item>
<item msgid="2075645297847971154">"Kveikt"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ekki í boði"</item>
<item msgid="9103697205127645916">"Slökkt"</item>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index cd53a50..00d7fb3 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Schermata di blocco."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Schermata di blocco del profilo di lavoro"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Chiudi"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi disattivato."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi attivato."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Modalità aereo disattivata."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Modalità aereo attivata."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silenzio totale"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"solo sveglie"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Non disturbare."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\"Non disturbare\" disattivato."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\"Non disturbare\" attivato."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth attivo."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth disattivato."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth attivato."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Segnalazione della posizione disattivata."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Segnalazione della posizione attivata."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Sveglia impostata per le <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Più tempo."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Meno tempo."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Torcia disattivata."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Torcia attivata."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversione dei colori disattivata."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversione dei colori attivata."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Hotspot mobile disattivato."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Hotspot mobile attivato."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Trasmissione dello schermo interrotta."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Funzione Risparmio dati disattivata."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Funzione Risparmio dati attivata."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Luminosità dello schermo"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Dati mobili sospesi"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Dati sospesi"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Nessuna connessione Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminosità"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversione dei colori"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Altre impostazioni"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Impostazioni utente"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Fine"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Per connettere la tastiera al tablet, devi prima attivare il Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Attiva"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controlli di gestione delle notifiche"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"On - Rotazione basata sul viso"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"I controlli di gestione delle notifiche ti consentono di impostare un livello di importanza compreso tra 0 e 5 per le notifiche di un\'app. \n\n"<b>"Livello 5"</b>" \n- Mostra in cima all\'elenco di notifiche \n- Consenti l\'interruzione a schermo intero \n- Visualizza sempre \n\n"<b>"Livello 4"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Visualizza sempre \n\n"<b>"Livello 3"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n\n"<b>"Livello 2"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n- Non emettere mai suoni e vibrazioni \n\n"<b>"Livello 1"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n- Non emettere mai suoni e vibrazioni \n- Nascondi da schermata di blocco e barra di stato \n- Mostra in fondo all\'elenco di notifiche \n\n"<b>"Livello 0"</b>" \n- Blocca tutte le notifiche dell\'app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Fine"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Applica"</string>
diff --git a/packages/SystemUI/res/values-it/tiles_states_strings.xml b/packages/SystemUI/res/values-it/tiles_states_strings.xml
index 1596998..7e6827a 100644
--- a/packages/SystemUI/res/values-it/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-it/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Off"</item>
<item msgid="2075645297847971154">"On"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Non disponibile"</item>
<item msgid="9103697205127645916">"Off"</item>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index f36827c..b150eb7 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"מסך נעילה."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"מסך נעילה של עבודה"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"סגירה"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi כבוי."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi מופעל."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"מצב טיסה נכבה."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"מצב טיסה הופעל."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"השתקה מוחלטת"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"רק התראות"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"נא לא להפריע."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"התכונה \'נא לא להפריע\' כבויה."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"התכונה \'נא לא להפריע\' פועלת."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth מופעל."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth נכבה."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth הופעל."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"התכונה \'דיווח מיקום\' הושבתה."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"התכונה \'דיווח מיקום\' הופעלה."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ההתראה נקבעה ל-<xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"יותר זמן."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"פחות זמן."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"הפנס נכבה."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"הפנס הופעל."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"היפוך צבעים כבוי."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"היפוך צבעים מופעל."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"נקודת האינטרנט (hotspot) כבויה."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"נקודת האינטרנט (hotspot) מופעלת."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"העברת המסך הופסקה."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"חוסך הנתונים (Data Saver) כובה."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"חוסך הנתונים (Data Saver) הופעל."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"בהירות תצוגה"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"חבילת הגלישה מושהה"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"השימוש בנתונים מושהה"</string>
@@ -253,6 +235,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"אין חיבור ל-Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"בהירות"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"היפוך צבעים"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"הגדרות נוספות"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"הגדרות המשתמש"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"בוצע"</string>
@@ -493,6 +477,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"כדי לחבר את המקלדת לטאבלט, תחילה עליך להפעיל את ה-Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"הפעלה"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"פקדים של הודעות הפעלה"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"פועל – מבוסס על זיהוי פנים"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"בעזרת פקדים של התראות הפעלה, אפשר להגדיר רמת חשיבות מ-0 עד 5 להתראות אפליקציה. \n\n"<b>"רמה 5"</b>" \n- הצגה בראש רשימת ההתראות \n- לאפשר הפרעה במסך מלא \n- תמיד לאפשר הצצה \n\n"<b>"רמה 4"</b>" \n- מניעת הפרעה במסך מלא \n- תמיד לאפשר הצצה \n\n"<b>"רמה 3"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם לא לאפשר הצצה \n\n"<b>"רמה 2"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם לא לאפשר הצצה \n- אף פעם לא לאפשר קול ורטט \n\n"<b>"רמה 1"</b>" \n- מניעת הפרעה במסך מלא \n- אף פעם לא לאפשר הצצה \n- אף פעם לא לאפשר קול ורטט \n- הסתרה ממסך הנעילה ומשורת הסטטוס \n- הצגה בתחתית רשימת ההתראות \n\n"<b>"רמה 0"</b>" \n- חסימת כל ההתראות מהאפליקציה"</string>
<string name="inline_done_button" msgid="6043094985588909584">"סיום"</string>
<string name="inline_ok_button" msgid="603075490581280343">"אישור"</string>
diff --git a/packages/SystemUI/res/values-iw/tiles_states_strings.xml b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
index 28548bc..bf3c2b6 100644
--- a/packages/SystemUI/res/values-iw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-iw/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"כבוי"</item>
<item msgid="2075645297847971154">"פועל"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"לא זמין"</item>
<item msgid="9103697205127645916">"כבוי"</item>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 6fbcbb3..1dde210 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ロック画面"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"仕事用プロファイルのロック画面"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"閉じる"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-FiをOFFにしました。"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-FiをONにしました。"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"機内モードをOFFにしました。"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"機内モードをONにしました。"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"サイレント"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"アラームのみ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"サイレント モード。"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"サイレント モードを無効にしました。"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"サイレント モードを有効にしました。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"BluetoothがONです。"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"BluetoothをOFFにしました。"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"BluetoothをONにしました。"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"現在地送信機能をOFFにしました。"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"現在地送信機能をONにしました。"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"アラームは<xliff:g id="TIME">%s</xliff:g>に設定されています。"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"長くします。"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"短くします。"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ライトをOFFにしました。"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ライトをONにしました。"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"色反転をOFFにしました。"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"色反転をONにしました。"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"モバイルアクセスポイントをOFFにしました。"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"モバイルアクセスポイントをONにしました。"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"画面のキャストが停止しました。"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"データセーバーが OFF になりました。"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"データセーバーが ON になりました。"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ディスプレイの明るさ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"モバイルデータが一時停止"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"データの一時停止"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi 未接続"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"画面の明るさ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"色反転"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"詳細設定"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ユーザー設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完了"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"タブレットでキーボードに接続するには、最初にBluetoothをONにする必要があります。"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ONにする"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"電源通知管理"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ON - 顔ベース"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"電源通知管理では、アプリの通知の重要度をレベル 0~5 で設定できます。\n\n"<b>"レベル 5"</b>" \n- 通知リストの一番上に表示する \n- 全画面表示を許可する \n- 常にポップアップする \n\n"<b>"レベル 4"</b>" \n- 全画面表示しない \n- 常にポップアップする \n\n"<b>"レベル 3"</b>" \n- 全画面表示しない \n- ポップアップしない \n\n"<b>"レベル 2"</b>" \n- 全画面表示しない \n- ポップアップしない \n- 音やバイブレーションを使用しない \n\n"<b>"レベル 1"</b>" \n- 全画面表示しない \n- ポップアップしない \n- 音やバイブレーションを使用しない \n- ロック画面やステータスバーに表示しない \n- 通知リストの一番下に表示する \n\n"<b>"レベル 0"</b>" \n- アプリからのすべての通知をブロックする"</string>
<string name="inline_done_button" msgid="6043094985588909584">"完了"</string>
<string name="inline_ok_button" msgid="603075490581280343">"適用"</string>
diff --git a/packages/SystemUI/res/values-ja/tiles_states_strings.xml b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
index 7fc9c08c..9197aab 100644
--- a/packages/SystemUI/res/values-ja/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"OFF"</item>
<item msgid="2075645297847971154">"ON"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"使用不可"</item>
<item msgid="9103697205127645916">"OFF"</item>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 08adb0f..304c19d2 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ეკრანის დაბლოკვა."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"სამსახურის ჩაკეტილი ეკრანი"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"დახურვა"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi გამორთულია."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi ჩართულია."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"თვითმფრინავის რეჟიმი გამოირთო."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"თვითმფრინავის რეჟიმი ჩაირთო."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"სრული სიჩუმე"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"მხოლოდ მაღვიძარები"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"არ შემაწუხოთ."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"„არ შემაწუხოთ“ რეჟიმი გამორთულია."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"„არ შემაწუხოთ“ რეჟიმი ჩართულია."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ჩართულია."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth გამოირთო."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth ჩაირთო."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"მდებარეობის შეტყობინება გამოირთო."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"მდებარეობის შეტყობინება ჩაირთო."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"მაღვიძარა დაყენებულია: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"მეტი დრო."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"ნაკლები დრო."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ფანარი გამოირთო."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ფანარი ჩაირთო."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"ფერის ინვერსია გამოირთო."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"ფერის ინვერსია ჩაირთო."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"მობილური ქსელის წერტილი გამოირთო."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"მობილური ქსელის წერტილი ჩაირთო."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"ეკრანის გადაცემა შეჩერებულია."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"მონაცემთა დამზოგველი გამორთულია."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"მონაცემთა დამზოგველი ჩართულია."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ეკრანის სიკაშკაშე"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"მობილური ინტერნეტი დაპაუზებულია"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"მონაცემები შეჩერებულია"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi არ არის დაკავშირებული"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"განათება"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ფერთა ინვერსია"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"დამატებითი პარამეტრები"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"მომხმარებლის პარამეტრები"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"დასრულდა"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"კლავიატურის ტაბლეტთან დასაკავშირებლად, ჯერ უნდა ჩართოთ Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ჩართვა"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"შეტყობინებების მართვის საშუალებები"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ჩართული — სახის მიხედვით"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"შეტყობინებების მართვის საშუალებების მეშვეობით, შეგიძლიათ განსაზღვროთ აპის შეტყობინებების მნიშვნელობის დონე 0-დან 5-მდე დიაპაზონში. \n\n"<b>"დონე 5"</b>" \n— შეტყობინებათა სიის თავში ჩვენება \n— სრულეკრანიანი რეჟიმის შეფერხების დაშვება \n— ეკრანზე ყოველთვის გამოჩენა \n\n"<b>"დონე 4"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე ყოველთვის გამოჩენა \n\n"<b>"დონე 3"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n\n"<b>"დონე 2"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n— ხმისა და ვიბრაციის აღკვეთა \n\n"<b>"დონე 1"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n— ხმისა და ვიბრაციის აღკვეთა \n— ჩაკეტილი ეკრანიდან და სტატუსის ზოლიდან დამალვა \n— შეტყობინებათა სიის ბოლოში ჩვენება \n\n"<b>"დონე 0"</b>" \n— აპის ყველა შეტყობინების დაბლოკვა"</string>
<string name="inline_done_button" msgid="6043094985588909584">"მზადაა"</string>
<string name="inline_ok_button" msgid="603075490581280343">"მისადაგება"</string>
diff --git a/packages/SystemUI/res/values-ka/tiles_states_strings.xml b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
index 40dfd39..485c3de 100644
--- a/packages/SystemUI/res/values-ka/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"გამორთულია"</item>
<item msgid="2075645297847971154">"ჩართულია"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"მიუწვდომელია"</item>
<item msgid="9103697205127645916">"გამორთულია"</item>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index ffdde5b..90865f0 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Бекіту экраны."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Әрекетті құлыптау экраны"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Жабу"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi өшірілді."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi қосылды."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Ұшақ режимі өшірілді."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Ұшақ режимі қосылды."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"үнсіз"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"оятқыштар ғана"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Мазаламау."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Мазаламау режимі өшірілді."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Мазаламау режимі қосылды."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth қосулы."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth өшірілді."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth қосылды."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Геодерек жіберу функциясы өшірілді."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Геодерек жіберу функциясы қосылды."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Дабыл <xliff:g id="TIME">%s</xliff:g> уақытына реттелген."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Көбірек уақыт."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Азырақ уақыт."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Қол шам өшірілді."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Қол шам қосылды."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Түстердің инверсиясы өшірілді."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Түстердің инверсиясы қосылды."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мобильді хотспот өшірілді."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Мобильді хотспот қосылды."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Экранды трансляциялау тоқтатылды."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Трафикті үнемдеу режимі өшірілді."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Трафикті үнемдеу режимі қосылды."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Дисплей жарықтығы"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мобильдік деректер кідіртілді"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Деректер кідіртілді"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi желісіне жалғанбаған"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Жарықтығы"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Түс инверсиясы"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Қосымша параметрлер"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Пайдаланушы параметрлері"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Дайын"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Пернетақтаны планшетке қосу үшін алдымен Bluetooth функциясын қосу керек."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Қосу"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Қуат хабарландыруының басқару элементтері"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Қосулы – бет негізінде"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Қуат хабарландыруының басқару элементтерімен қолданбаның хабарландырулары үшін 0-ден бастап 5-ке дейін маңыздылық деңгейін орнатуға болады. \n\n"<b>"5-деңгей"</b>" \n- Хабарландыру тізімінің ең басында көрсету \n- Толық экранға ашылуын рұқсат ету \n- Әрдайым қалқымалы хабарландыру түрінде көрсету \n\n"<b>"4-деңгей"</b>" \n- Толық экранға шығармау \n- Әрдайым қалқымалы хабарландыру түрінде көрсету \n\n"<b>"3-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n\n"<b>"2-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n- Ешқашан дыбыс және діріл шығармау \n\n"<b>"1-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n- Ешқашан дыбыс немесе діріл шығармау \n- Құлыпталған экраннан және күйін көрсету жолағынан жасыру \n- Хабарландыру тізімінің ең астында көрсету \n\n"<b>"0-деңгей"</b>" \n- Қолданбадағы барлық хабарландыруларға тыйым салу"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Дайын"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Қолдану"</string>
diff --git a/packages/SystemUI/res/values-kk/tiles_states_strings.xml b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
index 3e9aefa..b143632 100644
--- a/packages/SystemUI/res/values-kk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Өшірулі"</item>
<item msgid="2075645297847971154">"Қосулы"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Қолжетімсіз"</item>
<item msgid="9103697205127645916">"Өшірулі"</item>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 02f7550..4b66999 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ចាក់សោអេក្រង់។"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"អេក្រង់ចាក់សោលក្ខណៈការងារ"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"បិទ"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"បានបិទវ៉ាយហ្វាយ។"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"បានបើកវ៉ាយហ្វាយ។"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"បានបិទរបៀបជិះយន្តហោះ។"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"បានបើករបៀបជិះយន្តហោះ។"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"បិទសំឡេងទាំងស្រុង"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"សំឡេងរោទ៍ប៉ុណ្ណោះ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"កុំរំខាន។"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"បានបិទមុខងារកុំរំខាន។"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"បានបើកមុខងារកុំរំខាន។"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ប៊្លូធូស"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"បើកប៊្លូធូស។"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"បានបិទប៊្លូធូស។"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"បានបើកប៊្លូធូស។"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"បានបិទការរាយការណ៍ទីតាំង។"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"បានបើកការរាយការណ៍ទីតាំង។"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"កំណត់សំឡេងរោទ៍សម្រាប់ <xliff:g id="TIME">%s</xliff:g> ។"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ច្រើនជាង"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"តិចជាង"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"បានបិទពិល។"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"បានបើកពិល។"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"បានបិទការបញ្ច្រាសពណ៌។"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"បានបើកការបញ្ច្រាសពណ៌។"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"បានបិទហតស្ប៉តចល័ត។"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"បានបើកហតស្ប៉តចល័ត។"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"បានបញ្ឈប់ការចាត់ថ្នាក់អេក្រង់។"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"បានបិទកម្មវិធីសន្សំសំចៃទិន្នន័យ"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"បានបើកកម្មវិធីសន្សំសំចៃទិន្នន័យ"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ពន្លឺការបង្ហាញ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"ទិន្នន័យទូរសព្ទចល័តបានផ្អាក"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ទិន្នន័យត្រូវបានផ្អាក"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"មិនមានការតភ្ជាប់ Wi-Fi ទេ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ពន្លឺ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ការបញ្ច្រាសពណ៌"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ការកំណត់ច្រើនទៀត"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ការកំណត់អ្នកប្រើប្រាស់"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"រួចរាល់"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"ដើម្បីភ្ជាប់ក្តារចុចរបស់អ្នកជាមួយនឹងថេប្លេតរបស់អ្នក អ្នកត្រូវតែបើកប៊្លូធូសជាមុនសិន។"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"បើក"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"អង្គគ្រប់គ្រងការជូនដំណឹងថាមពល"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"បើក - ផ្អែកលើមុខ"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"ជាមួយអង្គគ្រប់គ្រងការជូនដំណឹងថាមពល អ្នកអាចកំណត់កម្រិតសំខាន់ពី 0 ទៅ 5 សម្រាប់ការជូនដំណឹងរបស់កម្មវិធី។ \n\n"<b>"កម្រិត 5"</b>" \n- បង្ហាញនៅផ្នែកខាងលើបញ្ជីជូនដំណឹង \n- អនុញ្ញាតការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 4"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 3"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 2"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n- មិនបន្លឺសំឡេង ឬញ័រ \n\n"<b>"កម្រិត 1"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n- មិនបន្លឺសំឡេង ឬញ័រ \n- លាក់ពីអេក្រង់ចាក់សោ និងរបារស្ថានភាព \n- បង្ហាញនៅផ្នែកខាងក្រោមបញ្ជីជូនដំណឹង \n\n"<b>"កម្រិត 0"</b>" \n- រារាំងការជូនដំណឹងទាំងអស់ពីកម្មវិធី"</string>
<string name="inline_done_button" msgid="6043094985588909584">"រួចរាល់"</string>
<string name="inline_ok_button" msgid="603075490581280343">"ប្រើ"</string>
diff --git a/packages/SystemUI/res/values-km/tiles_states_strings.xml b/packages/SystemUI/res/values-km/tiles_states_strings.xml
index 32a6e22..38d3894 100644
--- a/packages/SystemUI/res/values-km/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-km/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"បិទ"</item>
<item msgid="2075645297847971154">"បើក"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"មិនមានទេ"</item>
<item msgid="9103697205127645916">"បិទ"</item>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index b29b0bb..bbb9ef1 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ಲಾಕ್ ಪರದೆ."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ಕೆಲಸದ ಲಾಕ್ ಪರದೆ"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"ಮುಚ್ಚು"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"ವೈಫೈ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"ವೈಫೈ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ ಅನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ಸಂಪೂರ್ಣ ನಿಶ್ಯಬ್ಧ"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ಅಲಾರಮ್ಗಳು ಮಾತ್ರ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ಅಡಚಣೆ ಮಾಡಬೇಡ."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"ಅಡಚಣೆ ಮಾಡಬೇಡ ಆಯ್ಕೆಯನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"ಅಡಚಣೆ ಮಾಡಬೇಡ ಆಯ್ಕೆಯನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ಬ್ಲೂಟೂತ್."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ಬ್ಲೂಟೂತ್ ಆನ್ ಆಗಿದೆ."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ಬ್ಲೂಟೂತ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"ಸ್ಥಳ ವರದಿಮಾಡುವಿಕೆಯನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"ಸ್ಥಳ ವರದಿಮಾಡುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> ಗಂಟೆಗೆ ಅಲಾರಮ್ ಹೊಂದಿಸಲಾಗಿದೆ."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ಹೆಚ್ಚು ಸಮಯ."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"ಕಡಿಮೆ ಸಮಯ."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ಫ್ಲ್ಯಾಶ್ಲೈಟ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ಫ್ಲ್ಯಾಶ್ಲೈಟ್ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"ಬಣ್ಣ ತಿರುಗಿಸುವಿಕೆಯನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"ಬಣ್ಣ ತಿರುಗಿಸುವಿಕೆಯನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"ಮೊಬೈಲ್ ಹಾಟ್ಸ್ಪಾಟ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"ಮೊಬೈಲ್ ಹಾಟ್ಸ್ಪಾಟ್ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"ಸ್ಕ್ರೀನ್ ಪ್ರಸಾರವನ್ನು ನಿಲ್ಲಿಸಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ಡೇಟಾ ಸೇವರ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ಡೇಟಾ ಸೇವರ್ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ಹೊಳಪನ್ನು ಪ್ರದರ್ಶಿಸಿ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ವೈ-ಫೈ ಸಂಪರ್ಕಗೊಂಡಿಲ್ಲ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ಪ್ರಕಾಶಮಾನ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ಕಲರ್ ಇನ್ವರ್ಶನ್"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ಬಳಕೆದಾರರ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ಮುಗಿದಿದೆ"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್ಗೆ ಸಂಪರ್ಕಿಸಲು, ನೀವು ಮೊದಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ಆನ್ ಮಾಡಿ"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"ಪವರ್ ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳು"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ಆನ್ ಆಗಿದೆ - ಮುಖ-ಆಧಾರಿತ"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"ಪವರ್ ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳ ಮೂಲಕ, ನೀವು ಅಪ್ಲಿಕೇಶನ್ಗಳ ಅಧಿಸೂಚನೆಗಳನ್ನು 0 ರಿಂದ 5 ರವರೆಗಿನ ಹಂತಗಳ ಪ್ರಾಮುಖ್ಯತೆಯನ್ನು ಹೊಂದಿಸಬಹುದು. \n\n"<b>"ಹಂತ 5"</b>" \n- ಮೇಲಿನ ಅಧಿಸೂಚನೆ ಪಟ್ಟಿಯನ್ನು ತೋರಿಸಿ \n- ಪೂರ್ಣ ಪರದೆ ಅಡಚಣೆಯನ್ನು ಅನುಮತಿಸಿ \n- ಯಾವಾಗಲು ಇಣುಕು ನೋಟ \n\n"<b>"ಹಂತ 4"</b>" \n- ಪೂರ್ಣ ಪರದೆ ಅಡಚಣೆಯನ್ನು ತಡೆಯಿರಿ \n- ಯಾವಾಗಲು ಇಣುಕು ನೋಟ\n\n"<b>"ಹಂತ 3"</b>" \n- ಪೂರ್ಣ ಪರದೆ ಅಡಚಣೆಯನ್ನು ತಡೆಯಿರಿ \n- ಎಂದಿಗೂ ಇಣುಕು ನೋಟ ಬೇಡ \n\n"<b>"ಹಂತ 2"</b>" \n- ಪೂರ್ಣ ಪರದೆ ಅಡಚಣೆಯನ್ನು ತಡೆಯಿರಿ \n- ಎಂದಿಗೂ ಇಣುಕು ನೋಟ ಬೇಡ \n- ಶಬ್ದ ಮತ್ತು ವೈಬ್ರೇಷನ್ ಎಂದಿಗೂ ಮಾಡಬೇಡಿ \n\n"<b>"ಹಂತ 1"</b>" \n- ಪೂರ್ಣ ಪರದೆ ಅಡಚಣೆಯನ್ನು ತಡೆಯಿರಿ \n- ಎಂದಿಗೂ ಇಣುಕು ನೋಟ ಬೇಡ \n- ಶಬ್ದ ಮತ್ತು ವೈಬ್ರೇಷನ್ ಎಂದಿಗೂ ಮಾಡಬೇಡಿ \n- ಸ್ಥಿತಿ ಪಟ್ಟಿ ಮತ್ತು ಲಾಕ್ ಪರದೆಯಿಂದ ಮರೆಮಾಡಿ \n- ಕೆಳಗಿನ ಅಧಿಸೂಚನೆ ಪಟ್ಟಿಯನ್ನು ತೋರಿಸಿ \n\n"<b>"ಹಂತ 0"</b>" \n- ಅಪ್ಲಿಕೇಶನ್ನಿಂದ ಎಲ್ಲಾ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ"</string>
<string name="inline_done_button" msgid="6043094985588909584">"ಪೂರ್ಣಗೊಂಡಿದೆ"</string>
<string name="inline_ok_button" msgid="603075490581280343">"ಅನ್ವಯಿಸಿ"</string>
diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
index c13e198..022c5cf 100644
--- a/packages/SystemUI/res/values-kn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ಆಫ್ ಮಾಡಿ"</item>
<item msgid="2075645297847971154">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ಲಭ್ಯವಿಲ್ಲ"</item>
<item msgid="9103697205127645916">"ಆಫ್ ಮಾಡಿ"</item>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index b5f2ad3..4275960 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"화면을 잠급니다."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"업무용 잠금 화면"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"닫기"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi가 사용 중지되었습니다."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi를 사용합니다."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"비행기 모드가 사용 중지되었습니다."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"비행기 모드를 사용합니다."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"모두 음소거"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"알람만 허용"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"방해 금지 모드"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"방해 금지 모드가 사용 중지되었습니다."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"방해 금지 모드가 사용 설정되었습니다."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"블루투스"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"블루투스: 사용"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"블루투스가 사용 중지되었습니다."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"블루투스를 사용합니다."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"위치 정보 전송이 사용 중지되었습니다."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"위치 정보 전송을 사용합니다."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"알람이 <xliff:g id="TIME">%s</xliff:g>(으)로 설정되었습니다."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"시간 늘리기"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"시간 줄이기"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"손전등이 사용 중지되었습니다."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"손전등을 사용합니다."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"색상 반전이 사용 중지되었습니다."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"색상 반전을 사용합니다."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"모바일 핫스팟이 사용 중지되었습니다."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"모바일 핫스팟을 사용합니다."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"화면 전송이 중지되었습니다."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"데이터 절약 모드를 사용 중지했습니다."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"데이터 절약 모드를 사용 설정했습니다."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"디스플레이 밝기"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"모바일 데이터가 일시중지됨"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"데이터 사용 중지됨"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi가 연결되지 않음"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"밝기"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"색상 반전"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"설정 더보기"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"사용자 설정"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"완료"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"키보드를 태블릿에 연결하려면 먼저 블루투스를 켜야 합니다."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"사용"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"전원 알림 컨트롤"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"켜짐 - 얼굴 기준"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"전원 알림 컨트롤을 사용하면 앱 알림 관련 중요도를 0부터 5까지로 설정할 수 있습니다. \n\n"<b>"레벨 5"</b>" \n- 알림 목록 상단에 표시 \n- 전체 화면일 경우 알림 표시 허용 \n- 항상 엿보기 표시 \n\n"<b>"레벨 4"</b>" \n- 전체 화면에 알림 표시 금지 \n- 항상 엿보기 표시 \n\n"<b>"레벨 3"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n\n"<b>"레벨 2"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n- 소리나 진동으로 알리지 않음 \n\n"<b>"레벨 1"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n- 소리나 진동으로 알리지 않음 \n- 잠금 화면 및 상태 표시줄에서 숨김 \n- 알림 목록 하단에 표시 \n\n"<b>"레벨 0"</b>" \n- 앱의 모든 알림 차단"</string>
<string name="inline_done_button" msgid="6043094985588909584">"완료"</string>
<string name="inline_ok_button" msgid="603075490581280343">"적용"</string>
diff --git a/packages/SystemUI/res/values-ko/tiles_states_strings.xml b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
index 28d45cf..ae6f148 100644
--- a/packages/SystemUI/res/values-ko/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"꺼짐"</item>
<item msgid="2075645297847971154">"켜짐"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"이용 불가"</item>
<item msgid="9103697205127645916">"꺼짐"</item>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 2d2f1cf..448fb84 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Кулпуланган экран."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Жумуштун кулпуланган экраны"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Жабуу"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi өчүрүлдү."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi күйгүзүлдү."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Учак режими өчүрүлдү."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Учак режими күйгүзүлдү."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"тымтырс"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ойготкуч гана"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Тынчымды алба."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\"Тынчымды алба\" режими өчүрүлдү."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\"Тынчымды алба\" режими күйгүзүлдү."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth күйүк."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth өчүрүлдү."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth күйгүзүлдү."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Жайгашкан жерди кабарлоо өчүрүлдү."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Жайгашкан жерди кабарлоо күйгүзүлдү."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Ойготкуч кийинкиге коюлган: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Көбүрөөк убакыт."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Азыраак убакыт."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Колчырак өчүрүлдү."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Колчырак күйгүзүлдү."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Түстү өзгөртүү аракети өчүрүлдү."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Түстү өзгөртүү аракети күйгүзүлдү."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мобилдик байланыш түйүнү өчүрүлдү."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Мобилдик байланыш түйүнү күйгүзүлдү."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Тышкы экранга чыгаруу аракети токтотулду."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Трафикти үнөмдөө режими өчүрүлдү."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Трафикти үнөмдөө режими күйгүзүлдү."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Жарыктыгын көрсөтүү"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мобилдик Интернет кызматы тындырылды"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Дайындар тындырылды"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi туташкан жок"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Жарыктыгы"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Түстү инверсиялоо"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Дагы жөндөөлөр"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Колдонуучунун жөндөөлөрү"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Бүттү"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Баскычтобуңузду планшетиңизге туташтыруу үчүн, адегенде Bluetooth\'ту күйгүзүшүңүз керек."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Күйгүзүү"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Эскертмелерди башкаруу каражаттары"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Күйүк – Жүздүн негизинде"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Бул функциянын жардамы менен, ар бир колдонмо үчүн билдирменин маанилүүлүгүн 0дон 5ке чейин бааласаңыз болот. \n\n"<b>"5-деңгээл"</b>" \n- Билдирмелер тизмесинин өйдө жагында көрүнөт \n- Билдирмелер толук экранда көрүнөт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n"<b>"4-деңгээл"</b>" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге уруксат берилет \n\n"<b>"3-деңгээл"</b>" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n\n"<b>"2-деңгээл"</b>" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n\n"<b>"1-деңгээл"</b>" \n- Билдирмелер толук экранда көрүнбөйт \n- Калкып чыгуучу билдирмелерге тыюу салынат \n- Эч качан үн чыкпайт же дирилдебейт \n- Кулпуланган экрандан жана абал тилкесинен жашырылат \n- Билдирмелер тизмесинин ылдый жагында көрүнөт \n\n"<b>"0-деңгээл"</b>" \n- Колдонмодон алынган бардык билдирмелер бөгөттөлөт"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Бүттү"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Колдонуу"</string>
diff --git a/packages/SystemUI/res/values-ky/tiles_states_strings.xml b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
index 139d784..0eadc34 100644
--- a/packages/SystemUI/res/values-ky/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Өчүк"</item>
<item msgid="2075645297847971154">"Күйүк"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Жеткиликсиз"</item>
<item msgid="9103697205127645916">"Өчүк"</item>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 6903250..702b76e 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ລັອກໜ້າຈໍ."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ໜ້າຈໍລັອກວຽກ"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"ປິດ"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"ປິດ Wi-Fi ແລ້ວ."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"ເປີດ Wi-Fi ແລ້ວ."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"ປິດໂໝດຢູ່ໃນຍົນແລ້ວ."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"ເປີດໂໝດຢູ່ໃນຍົນແລ້ວ."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ງຽບທັງໝົດ"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ໂມງປຸກເທົ່ານັ້ນ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ຫ້າມລົບກວນ."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"ປິດໂໝດຫ້າມລົບກວນແລ້ວ."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"ຢ່າລົບກວນເປີດແລ້ວ."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ເປີດ."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ປິດ Bluetooth ແລ້ວ."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ເປີດ Bluetooth ແລ້ວ."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"ປິດການລາຍງານສະຖານທີ່ແລ້ວ."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"ເປີດການລາຍງານສະຖານທີ່ແລ້ວ."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ຕັ້ງໂມງປຸກ <xliff:g id="TIME">%s</xliff:g> ແລ້ວ."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ເພີ່ມເວລາ."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"ຫຼຸດເວລາ."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ປິດໄຟສາຍແລ້ວ."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ເປີດໄຟສາຍແລ້ວ."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"ປິດການສະລັບສີ."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"ເປີດການສຳລັບສີ."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"ປິດຮັອດສະປອດເຄື່ອນທີ່ແລ້ວ."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"ເປີດຮັອດສະປອດເຄື່ອນທີ່ແລ້ວ."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"ຢຸດການສົ່ງພາບໜ້າຈໍແລ້ວ."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ປິດຕົວປະຢັດອິນເຕີເນັດແລ້ວ."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ເປີດຕົວປະຢັດອິນເຕີເນັດແລ້ວ."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ຄວາມແຈ້ງຂອງຈໍ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"ຢຸດການໃຊ້ອິນເຕີເນັດມືຖືຊົ່ວຄາວແລ້ວ"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ຂໍ້ມູນຢຸດຊົ່ວຄາວແລ້ວ"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ບໍ່ໄດ້ເຊື່ອມຕໍ່ Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ຄວາມແຈ້ງ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ການປີ້ນສີ"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ການຕັ້ງຄ່າເພີ່ມເຕີມ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ຕັ້ງຄ່າຜູ້ໃຊ້"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ແລ້ວໆ"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"ເພື່ອເຊື່ອມຕໍ່ແປ້ນພິມຂອງທ່ານກັບແທັບເລັດຂອງທ່ານ, ກ່ອນອື່ນໝົດທ່ານຕ້ອງເປີດ Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ເປີດ"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"ການຄວບຄຸມການແຈ້ງເຕືອນ"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ເປີດ - ອ້າງອີງໃບໜ້າ"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"ດ້ວຍການຄວບຄຸມການແຈ້ງເຕືອນ, ທ່ານສາມາດຕັ້ງລະດັບຄວາມສຳຄັນຈາກ 0 ຮອດ 5 ໃຫ້ກັບການແຈ້ງເຕືອນແອັບໃດໜຶ່ງໄດ້. \n\n"<b>"ລະດັບ 5"</b>" \n- ສະແດງຢູ່ເທິງສຸດຂອງລາຍການແຈ້ງເຕືອນ \n- ອະນຸຍາດໃຫ້ຂັດຈັງຫວະຕອນເປີດເຕັມຈໍ \n- ແນມເບິ່ງທຸກເທື່ອ \n\n"<b>"ລະດັບ 4"</b>" \n- ກັນບໍ່ໃຫ້ຂັດຈັງຫວະຕອນເປີດເຕັມຈໍ \n- ແນມເບິ່ງທຸກເທື່ອ \n\n"<b>"ລະດັບ 3"</b>" \n- ກັນບໍ່ໃຫ້ຂັດຈັງຫວະຕອນເປີດເຕັມຈໍ \n- ບໍ່ແນມເບິ່ງ \n\n"<b>"ລະດັບ 2"</b>" \n- ກັນບໍ່ໃຫ້ຂັດຈັງຫວະຕອນເປີດເຕັມຈໍ \n- ບໍ່ແນມເບິ່ງ \n- ບໍ່ມີສຽງ ແລະ ບໍ່ມີການສັ່ນເຕືອນ \n\n"<b>"ລະດັບ 1"</b>" \n- ກັນບໍ່ໃຫ້ຂັດຈັງຫວະຕອນເປີດເຕັມຈໍ \n- ບໍ່ແນມເບິ່ງ \n- ບໍ່ມີສຽງ ແລະ ບໍ່ມີການສັ່ນເຕືອນ \n- ເຊື່ອງຈາກໜ້າຈໍລັອກ ແລະ ແຖບສະຖານະ \n- ສະແດງຢູ່ລຸ່ມສຸດຂອງລາຍການແຈ້ງເຕືອນ \n\n"<b>"ລະດັບ 0"</b>" \n- ປິດກັ້ນການແຈ້ງເຕືອນທັງໝົດຈາກແອັບ"</string>
<string name="inline_done_button" msgid="6043094985588909584">"ແລ້ວໆ"</string>
<string name="inline_ok_button" msgid="603075490581280343">"ນຳໃຊ້"</string>
diff --git a/packages/SystemUI/res/values-lo/tiles_states_strings.xml b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
index 74c0f24..5fe5cff 100644
--- a/packages/SystemUI/res/values-lo/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ປິດ"</item>
<item msgid="2075645297847971154">"ເປີດ"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ບໍ່ສາມາດໃຊ້ໄດ້"</item>
<item msgid="9103697205127645916">"ປິດ"</item>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index b8c8a4a..eb59362 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Užrakinimo ekranas."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Darbo profilio užrakinimo ekranas"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Uždaryti"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"„Wi-Fi“ ryšys išjungtas."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"„Wi-Fi“ ryšys įjungtas."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Lėktuvo režimas išjungtas."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Lėktuvo režimas įjungtas."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"visiška tyla"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"tik įspėjimai"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Netrukdymo režimas."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Netrukdymo režimas išjungtas."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Netrukdymo režimas įjungtas."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"„Bluetooth“."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"„Bluetooth“ įjungtas."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"„Bluetooth“ išjungtas."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"„Bluetooth“ įjungtas."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Vietovių ataskaitų teikimas išjungtas."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Vietovių ataskaitų teikimas įjungtas."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Signalas nustatytas <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Daugiau laiko."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Mažiau laiko."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Blykstė išjungta."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Blykstė įjungta."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Spalvų inversija išjungta."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Spalvų inversija įjungta."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobiliojo ryšio viešosios interneto prieigos taškas išjungtas."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobiliojo ryšio viešosios interneto prieigos taškas įjungtas."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Ekrano perdavimas sustabdytas."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Duomenų taupymo priemonė išjungta."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Duomenų taupymo priemonė įjungta."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Ekrano šviesumas"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobiliojo ryšio duomenys pristabdyti"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Duomenys pristabdyti"</string>
@@ -253,6 +235,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"„Wi-Fi“ neprijungtas"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Šviesumas"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Spalvų inversija"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Daugiau nustatymų"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Naudotojo nustatymai"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Atlikta"</string>
@@ -493,6 +477,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Kad galėtumėte prijungti klaviatūrą prie planšetinio kompiuterio, pirmiausia turite įjungti „Bluetooth“."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Įjungti"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Galingi pranešimų valdikliai"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Įjungta – pagal veidą"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Naudodami pranešimų valdiklius galite nustatyti programos pranešimų svarbos lygį nuo 0 iki 5. \n\n"<b>"5 lygis"</b>" \n– Rodyti pranešimų sąrašo viršuje \n– Leisti pertraukti, kai veikia viso ekrano režimas \n– Visada rodyti pranešimus \n\n"<b>"4 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Visada rodyti pranešimus \n\n"<b>"3 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n\n"<b>"2 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n– Niekada neleisti garso ir nevibruoti \n\n"<b>"1 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n– Niekada neleisti garso ir nevibruoti \n– Slėpti užrakinimo ekrane ir būsenos juostoje \n– Rodyti pranešimų sąrašo apačioje \n\n"<b>"0 lygis"</b>" \n– Blokuoti visus programos pranešimus"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Atlikta"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Taikyti"</string>
diff --git a/packages/SystemUI/res/values-lt/tiles_states_strings.xml b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
index 08e0e6d..7a0caa9 100644
--- a/packages/SystemUI/res/values-lt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Išjungta"</item>
<item msgid="2075645297847971154">"Įjungta"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nepasiekiama"</item>
<item msgid="9103697205127645916">"Išjungta"</item>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 48715802..a27036e 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Bloķēšanas ekrāns."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Darba profila bloķēšanas ekrāns"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Aizvērt"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi ir izslēgts."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi ir ieslēgts."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Lidojuma režīms ir izslēgts."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Lidojuma režīms ir ieslēgts."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"pilnīgs klusums"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"tikai signāli"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Režīms “Netraucēt”."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Statuss Netraucēt tika izslēgts."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Režīms “Netraucēt” tika ieslēgts."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth savienojums ir ieslēgts."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth savienojums ir izslēgts."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth savienojums ir ieslēgts."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Ziņošana par atrašanās vietu ir izslēgta."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Ziņošana par atrašanās vietu ir ieslēgta."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Signāls ir iestatīts uz: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Vairāk laika."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Mazāk laika."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Apgaismojums ir izslēgts."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Apgaismojums ir ieslēgts."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Krāsu inversija ir izslēgta."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Krāsu inversija ir ieslēgta."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobilais tīklājs ir izslēgts."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobilais tīklājs ir ieslēgts."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Ekrāna apraidīšana ir apturēta."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Datu lietojuma samazinātājs ir izslēgts."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Datu lietojuma samazinātājs ir ieslēgts."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Ekrāna spilgtums"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobilo datu lietojums apturēts"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Datu lietojums ir apturēts"</string>
@@ -252,6 +234,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Nav izveidots savienojums ar Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Spilgtums"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Krāsu inversija"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Vairāk iestatījumu"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Lietotāja iestatījumi"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gatavs"</string>
@@ -490,6 +474,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Lai pievienotu tastatūru planšetdatoram, vispirms ir jāieslēdz Bluetooth savienojums."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Ieslēgt"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Barošanas paziņojumu vadīklas"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Ieslēgta — ar sejas noteikšanu"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Izmantojot barošanas paziņojumu vadīklas, varat lietotnes paziņojumiem iestatīt svarīguma līmeni (no 0 līdz 5). \n\n"<b>"5. līmenis"</b>" \n- Tiek rādīts paziņojumu saraksta augšdaļā \n- Tiek atļauta pilnekrāna režīma pārtraukšana \n- Ieskats vienmēr atļauts \n\n"<b>"4. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats vienmēr atļauts \n\n"<b>"3. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n\n"<b>"2. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n- Nav atļautas skaņas un vibrosignāls \n\n"<b>"1. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n- Nav atļautas skaņas un vibrosignāls \n- Paziņojumi tiek paslēpti bloķēšanas ekrānā un statusa joslā \n- Paziņojumi tiek rādīti paziņojumu saraksta apakšdaļā \n\n"<b>"0. līmenis"</b>" \n- Visi lietotnes paziņojumi tiek bloķēti"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Gatavs"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Lietot"</string>
diff --git a/packages/SystemUI/res/values-lv/tiles_states_strings.xml b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
index c5718f8..872dba6 100644
--- a/packages/SystemUI/res/values-lv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Izslēgts"</item>
<item msgid="2075645297847971154">"Ieslēgts"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nav pieejama"</item>
<item msgid="9103697205127645916">"Izslēgta"</item>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index ae9f3c0..7f60c25 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заклучи екран."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Работен заклучен екран"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Затвори"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi е исклученo."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi е вклученo."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Авионскиот режим е исклучен."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Авионскиот режим е вклучен."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"целосна тишина"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"само аларми"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не вознемирувај."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"„Не вознемирувај“ е исклучено."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"„Не вознемирувај“ е вклучено."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth е вклучен."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth е исклучен."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth е вклучен."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Известувањето за локација е исклучено."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Известувањето за локација е вклучено."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Аларм наместен за <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Повеќе време."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Помалку време."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Блицот е исклучен."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Блицот е вклучен."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Инверзијата на бои е исклучена."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Инверзијата на бои е вклучена."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мобилната точка на пристап е исклучена."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Мобилната точка на пристап е вклучена."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Емитувањето на екранот запре."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Штедачот на интернет е исклучен."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Штедачот на интернет е вклучен."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Осветленост на екранот"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мобилниот интернет е паузиран"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Податоците се паузирани"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi не е поврзано"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Осветленост"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверзија на боите"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Повеќе поставки"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Поставки на корисникот"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"За да ја поврзете тастатурата со таблетот, најпрво треба да вклучите Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Вклучи"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Контроли за известувањата за напојување"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Вклучено - според лице"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Со контролите за известувањата за напојување, може да поставите ниво на важност од 0 до 5 за известувањата на која било апликација. \n\n"<b>"Ниво 5"</b>" \n- Прикажувај на врвот на списокот со известувања \n- Дозволи прекин во цел екран \n- Секогаш користи појавување \n\n"<b>"Ниво 4"</b>" \n- Спречи прекин во цел екран \n- Секогаш користи појавување \n\n"<b>"Ниво 3"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n\n"<b>"Ниво 2"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n- Без звук и вибрации \n\n"<b>"Ниво 1"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n- Без звук и вибрации \n- Сокриј од заклучен екран и статусна лента \n- Прикажувај на дното на списокот со известувања \n\n"<b>"Ниво 0"</b>" \n- Блокирај ги сите известувања од апликацијата"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Готово"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Примени"</string>
diff --git a/packages/SystemUI/res/values-mk/tiles_states_strings.xml b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
index fa484ae..65e94f3 100644
--- a/packages/SystemUI/res/values-mk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Исклучено"</item>
<item msgid="2075645297847971154">"Вклучено"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Недостапно"</item>
<item msgid="9103697205127645916">"Исклучено"</item>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index ea54bd0..a65593c 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ലോക്ക് സ്ക്രീൻ."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ഔദ്യോഗിക ലോക്ക് സ്ക്രീൻ"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"അവസാനിപ്പിക്കുക"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"വൈഫൈ ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"വൈഫൈ ഓണാക്കി."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"ഫ്ലൈറ്റ് മോഡ് ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"ഫ്ലൈറ്റ് മോഡ് ഓണാക്കി."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"പൂർണ്ണ നിശബ്ദത"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"അലാറങ്ങൾ മാത്രം"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ശല്യപ്പെടുത്തരുത്."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"ശല്യപ്പെടുത്തരുത് എന്നത് ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"ശല്യപ്പെടുത്തരുത് എന്നത് ഓണാക്കി."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ബ്ലൂടൂത്ത് ഓണാണ്."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ബ്ലൂടൂത്ത് ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ബ്ലൂടൂത്ത് ഓണാക്കി."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"ലൊക്കേഷൻ റിപ്പോർട്ടുചെയ്യൽ ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"ലൊക്കേഷൻ റിപ്പോർട്ടുചെയ്യൽ ഓണാക്കി."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>-ന് അലാറം സജ്ജീകരിച്ചു."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"കൂടുതൽ സമയം."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"സമയം കുറയ്ക്കുക."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ടോർച്ച് ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ടോർച്ച് ഓണാക്കി."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"വർണ്ണ വൈപരീത്യം ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"വർണ്ണ വൈപരീത്യം ഓണാക്കി."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"മൊബൈൽ ഹോട്ട്സ്പോട്ട് ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"മൊബൈൽ ഹോട്ട്സ്പോട്ട് ഓണാക്കി."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"സ്ക്രീൻ കാസ്റ്റുചെയ്യൽ നിർത്തി."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ഡാറ്റ സേവർ ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ഡാറ്റ സേവർ ഓണാക്കി."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ഡിസ്പ്ലേ തെളിച്ചം"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"മൊബൈൽ ഡാറ്റ തല്ക്കാലം നിര്ത്തിയിരിക്കുന്നു"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ഡാറ്റ താൽക്കാലികമായി നിർത്തി"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"വൈഫൈ കണക്റ്റ് ചെയ്തിട്ടില്ല"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"തെളിച്ചം"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"നിറം വിപരീതമാക്കൽ"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"കൂടുതൽ ക്രമീകരണങ്ങൾ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ഉപയോക്തൃ ക്രമീകരണം"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"പൂർത്തിയാക്കി"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"നിങ്ങളുടെ ടാബ്ലെറ്റുമായി കീബോർഡ് കണക്റ്റുചെയ്യുന്നതിന്, ആദ്യം Bluetooth ഓണാക്കേണ്ടതുണ്ട്."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ഓണാക്കുക"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"പവർ അറിയിപ്പ് നിയന്ത്രണങ്ങൾ"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ഓണാണ് - ഫേസ് ബേസ്ഡ്"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"പവർ അറിയിപ്പ് നിയന്ത്രണം ഉപയോഗിച്ച്, ഒരു ആപ്പിനായുള്ള അറിയിപ്പുകൾക്ക് 0 മുതൽ 5 വരെയുള്ള പ്രാധാന്യ ലെവലുകളിലൊന്ന് നിങ്ങൾക്ക് സജ്ജമാക്കാവുന്നതാണ്. \n\n"<b>"ലെവൽ 5"</b>" \n- അറിയിപ്പ് ലിസ്റ്റിന്റെ മുകളിൽ കാണിക്കുക \n- മുഴുവൻ സ്ക്രീൻ തടസ്സം അനുവദിക്കുക \n- എല്ലായ്പ്പോഴും ദൃശ്യമാക്കുക \n\n"<b>"ലെവൽ 4"</b>" \n- മുഴുവൻ സ്ക്രീൻ തടസ്സം തടയുക \n- എല്ലായ്പ്പോഴും ദൃശ്യമാക്കുക \n\n"<b>"ലെവൽ 3"</b>" \n- മുഴുവൻ സ്ക്രീൻ തടസ്സം തടയുക \n- ഒരിക്കലും സൃശ്യമാക്കരുത് \n\n"<b>"ലെവൽ 2"</b>" \n- മുഴുവൻ സ്ക്രീൻ തടസ്സം തടയുക \n- ഒരിക്കലും ദൃശ്യമാക്കരുത് \n- ഒരിക്കലും ശബ്ദവും വൈബ്രേഷനും ഉണ്ടാക്കരുത് \n\n"<b>"ലെവൽ 1"</b>" \n- മുഴുവൻ സ്ക്രീൻ തടസ്സം തടയുക \n- ഒരിക്കലും ദൃശ്യമാക്കരുത് \n- ഒരിക്കലും ശബ്ദവും വൈബ്രേഷനും ഉണ്ടാക്കരുത് \n- ലോക്ക് സ്ക്രീനിൽ നിന്നും സ്റ്റാറ്റസ് ബാറിൽ നിന്നും മറയ്ക്കുക \n- അറിയിപ്പ് ലിസ്റ്റിന്റെ അടിയിൽ കാണിക്കുക \n\n"<b>"ലെവൽ 0"</b>" \n- ആപ്പിൽ നിന്നുള്ള എല്ലാ അറിയിപ്പുകളും ബ്ലോക്കുചെയ്യുക"</string>
<string name="inline_done_button" msgid="6043094985588909584">"പൂർത്തിയായി"</string>
<string name="inline_ok_button" msgid="603075490581280343">"ബാധകമാക്കുക"</string>
diff --git a/packages/SystemUI/res/values-ml/tiles_states_strings.xml b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
index 0cca763..8746c74 100644
--- a/packages/SystemUI/res/values-ml/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ഓഫാണ്"</item>
<item msgid="2075645297847971154">"ഓണാണ്"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ലഭ്യമല്ല"</item>
<item msgid="9103697205127645916">"ഓഫാണ്"</item>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index d4c924d..9cc0b3f 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Дэлгэц түгжих."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ажлын түгжигдсэн дэлгэц"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Хаах"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi унтраасан."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi асаасан."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Нислэгийн горимыг унтраасан."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Нислэгийн горимыг асаасан."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"бүх дууг хаах"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"зөвхөн сэрүүлэг"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Бүү саад бол."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Бүү саад бол горимыг унтраалаа."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Бүү саад бол горимыг асаалаа."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth идэвхтэй."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Блютүүтийг унтраасан."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Блютүүтийг асаасан."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Байршил мэдээлэлтийг унтраасан."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Байршил мэдээлэлтийг асаасан."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Сэрүүлгийг <xliff:g id="TIME">%s</xliff:g>-д тохируулсан."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Хугацаа нэмэх."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Хугацаа хасах."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Флаш гэрлийг унтраасан."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Флаш гэрлийг асаасан."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Өнгө хувиргалтыг унтраасан."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Өнгө хувиргалтыг асаасан."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мобайл хотспотыг унтраасан."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Мобайл хотспотыг асаасан."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Дэлгэц дамжуулалт зогссон."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Дата хэмнэгчийг унтраасан."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Дата хэмнэгчийг асаасан."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Дэлгэцийн гэрэлтэлт"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мобайл датаг түр зогсоосон"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Дата-г түр зогсоосон байна"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi-д холбогдоогүй байна"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Тодрол"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Өнгө урвуулах"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Бусад тохиргоо"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Хэрэглэгчийн тохиргоо"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Дууссан"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Компьютерийн гараа таблетад холбохын тулд эхлээд Bluetooth-г асаана уу."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Асаах"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Тэжээлийн мэдэгдлийн удирдлага"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Асаалттай - Царайнд суурилсан"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Тэжээлийн мэдэгдлийн удирдлагын тусламжтайгаар та апп-н мэдэгдэлд 0-5 хүртэлх ач холбогдлын түвшин тогтоох боломжтой. \n\n"<b>"5-р түвшин"</b>" \n- Мэдэгдлийн жагсаалтын хамгийн дээр харуулна \n- Бүтэн дэлгэцэд саад болно \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"4-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"3-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n\n"<b>"2-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n\n"<b>"1-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n- Түгжигдсэн дэлгэц болон статусын самбараас нууна \n- Мэдэгдлийн жагсаалтын доор харуулна \n\n"<b>"0-р түвшин"</b>" \n- Энэ апп-н бүх мэдэгдлийг блоклоно"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Болсон"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Ашиглах"</string>
diff --git a/packages/SystemUI/res/values-mn/tiles_states_strings.xml b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
index 41049d8..07dde9f 100644
--- a/packages/SystemUI/res/values-mn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Унтраалттай"</item>
<item msgid="2075645297847971154">"Асаалттай"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Боломжгүй"</item>
<item msgid="9103697205127645916">"Унтраалттай"</item>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 5b41bed..4d32587 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"लॉक स्क्रीन."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"कार्य लॉक स्क्रीन"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"बंद करा"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi बंद झाले."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi सुरू झाले."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"विमान मोड बंद केला."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"विमान मोड सुरू केला."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"संपूर्ण शांतता"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"फक्त अलार्म"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"व्यत्यय आणू नका."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"व्यत्यय आणू नका बंद केले आहे."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"व्यत्यय आणू नका सुरू केले आहे."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ब्लूटूथ."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ब्लूटूथ सुरू."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ब्लूटूथ बंद केले."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ब्लूटूथ सुरू केले."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"स्थान अहवाल देणे बंद केले."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"स्थान अहवाल देणे सुरू केले."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> साठी अलार्म सेट केला."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"अधिक वेळ."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"कमी वेळ."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"फ्लॅशलाइट बंद केला."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"फ्लॅशलाइट सुरू केला."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"रंग उत्क्रमण बंद केले."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"रंग उत्क्रमण सुरू केले."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"मोबाइल हॉटस्पॉट बंद केला."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"मोबाइल हॉटस्पॉट सुरू केला."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"स्क्रीन कास्ट करणे थांबले."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"डेटा सर्व्हर बंद केला."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"डेटा सर्व्हर सुरू केला."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"डिस्प्ले चमक"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"मोबाइल डेटा थांबवला आहे"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"डेटास विराम दिला आहे"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"वाय-फाय नाही"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"चमक"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"कलर इन्व्हर्जन"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"अधिक सेटिंग्ज"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"वापरकर्ता सेटिंग्ज"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"पूर्ण झाले"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"तुमचा कीबोर्ड तुमच्या टॅबलेटसह कनेक्ट करण्यासाठी, तुम्ही प्रथम ब्लूटूथ सुरू करणे आवश्यक आहे."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"सुरू करा"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"पॉवर सूचना नियंत्रणे"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"सुरू - चेहऱ्यावर आधारित"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"पॉवर सूचना नियंत्रणांच्या साहाय्याने तुम्ही अॅप सूचनांसाठी 0 ते 5 असे महत्त्व स्तर सेट करू शकता. \n\n"<b>"स्तर 5"</b>" \n- सूचना सूचीच्या शीर्षस्थानी दाखवा \n- फुल स्क्रीन व्यत्ययास अनुमती द्या \n- नेहमी डोकावून पहा \n\n"<b>"स्तर 4"</b>\n" - फुल स्क्रीन व्यत्ययास प्रतिबंधित करा \n- नेहमी डोकावून पहा \n\n"<b>"स्तर 3"</b>" \n- फुल स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n\n"<b>"स्तर 2"</b>" \n- फुल स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा व्हायब्रेट करू नका \n\n"<b>"स्तर 1"</b>\n"- फुल स्क्रीन व्यत्ययास प्रतिबंधित करा \n- कधीही डोकावून पाहू नका \n- कधीही ध्वनी किंवा व्हायब्रेट करू नका \n- लॉक स्क्रीन आणि स्टेटस बार मधून लपवा \n- सूचना सूचीच्या तळाशी दर्शवा \n\n"<b>"स्तर 0"</b>" \n- अॅपमधील सर्व सूचना ब्लॉक करा"</string>
<string name="inline_done_button" msgid="6043094985588909584">"पूर्ण झाले"</string>
<string name="inline_ok_button" msgid="603075490581280343">"लागू करा"</string>
diff --git a/packages/SystemUI/res/values-mr/tiles_states_strings.xml b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
index 588c5ad..f0ca333 100644
--- a/packages/SystemUI/res/values-mr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"बंद आहे"</item>
<item msgid="2075645297847971154">"सुरू आहे"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"उपलब्ध नाही"</item>
<item msgid="9103697205127645916">"बंद आहे"</item>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 1dc3873..3555804 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kunci skrin."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Skrin kunci kerja"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Tutup"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi dimatikan."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi dihidupkan."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Mod pesawat dimatikan."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Mod pesawat dihidupkan."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"senyap sepenuhnya"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"penggera sahaja"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Jangan Ganggu."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Jangan Ganggu dimatikan."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Jangan Ganggu dihidupkan."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth dihidupkan."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth dimatikan."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth dihidupkan."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Pelaporan lokasi dimatikan."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Pelaporan lokasi dihidupkan."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Penggera ditetapkan pada <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Lagi masa."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Kurang masa."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Lampu suluh dimatikan."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Lampu suluh dihidupkan."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Penyongsangan warna dimatikan."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Penyongsangan warna dihidupkan."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Tempat liputan mudah alih bergerak dimatikan."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Tempat liputan mudah alih bergerak dihidupkan."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Penghantaran skrin dihentikan."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Penjimat Data dimatikan."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Penjimat Data dihidupkan."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Kecerahan paparan"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Data mudah alih dijeda"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data dijeda"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi tidak disambungkan"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Kecerahan"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Penyongsangan warna"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Lagi tetapan"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Tetapan pengguna"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Selesai"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Untuk menyambungkan papan kekunci anda dengan tablet, anda perlu menghidupkan Bluetooth terlebih dahulu."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Hidupkan"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Kawalan pemberitahuan berkuasa"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Hidup - Berasaskan wajah"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Dengan kawalan pemberitahuan berkuasa, anda boleh menetapkan tahap kepentingan dari 0 hingga 5 untuk pemberitahuan apl. \n\n"<b>"Tahap 5"</b>" \n- Tunjukkan pada bahagian atas senarai pemberitahuan \n- Benarkan gangguan skrin penuh \n- Sentiasa intai \n\n"<b>"Tahap 4"</b>" \n- Halang gangguan skrin penuh \n- Sentiasa intai \n\n"<b>"Tahap 3"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n\n"<b>"Tahap 2"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n- Jangan berbunyi dan bergetar \n\n"<b>"Tahap 1"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n- Jangan berbunyi atau bergetar \n- Sembunyikan daripada skrin kunci dan bar status \n- Tunjukkan di bahagian bawah senarai pemberitahuan \n\n"<b>"Tahap 0"</b>" \n- Sekat semua pemberitahuan daripada apl"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Selesai"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Guna"</string>
diff --git a/packages/SystemUI/res/values-ms/tiles_states_strings.xml b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
index 60ce1f0..b682df1 100644
--- a/packages/SystemUI/res/values-ms/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Mati"</item>
<item msgid="2075645297847971154">"Hidup"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Tidak tersedia"</item>
<item msgid="9103697205127645916">"Mati"</item>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 5ceadae..26333ed 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"မျက်နှာပြင် သော့ပိတ်ရန်"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"အလုပ်သုံး လော့ခ်မျက်နှာပြင်"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"ပိတ်ရန်"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"ကြိုးမဲ့ ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"ကြိုးမဲ့ ဖွင့်ထား။"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"လေယာဉ် မုဒ်ကို ပိတ်ထားလိုက်ပြီ။"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"လေယာဉ် မုဒ်ကို ဖွင့်ထားလိုက်ပြီ။"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"လုံးဝ အသံပိတ်ထားရန်"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"နှိုးစက်များသာ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"မနှောင့်ယှက်ရ။"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\'မနှောင့်ယှက်ရ\' ကိုပိတ်ထားသည်။"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\'မနှောင့်ယှက်ရ\' ကိုဖွင့်ထားသည်။"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ဘလူးတုသ်။"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ဘလူးတုသ် ဖွင့်ထား။"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ဘလူးတုသ် ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ဘလူးတုသ် ဖွင့်ထား။"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"တည်နေရာ သတင်းပို့မှု ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"တည်နေရာ သတင်းပို့မှု ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"နိုးစက်ပေးထားသော အချိန် <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"အချိန် တိုး"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"အချိန် လျှော့"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ဖလက်ရှမီး ပိတ်ထားသည်။"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ဖလက်ရှမီး ဖွင့်ထားသည်။"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"အရောင် ပြောင်းပြန်လှန်မှု ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"အရောင် ပြောင်းပြန်လှန်မှု ဖွင့်ထား။"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"မိုဘိုင်း ဟော့စပေါ့ ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"မိုဘိုင်း ဟော့စပေါ့ ဖွင့်ထား။"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"မျက်နှာပြင် ကာစ်တင် လုပ်မှု ရပ်လိုက်ပြီ။"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ဒေတာချွေတာမှု ပိတ်ထားသည်။"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ဒေတာချွေတာမှု ဖွင့်ထားသည်။"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"တောက်ပမှုကို ပြရန်"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"မိုဘိုင်းဒေတာကို ခေတ္တရပ်ထားသည်"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ဒေတာ ခေတ္တရပ်တန့်သည်"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi ချိတ်ဆက်ထားခြင်းမရှိပါ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"အလင်းတောက်ပမှု"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"အရောင်ပြောင်းပြန်ပြုလုပ်ရန်"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"နောက်ထပ် ဆက်တင်များ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"အသုံးပြုသူ ဆက်တင်များ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ပြီးပါပြီ"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"ကီးဘုတ်ကို တပ်ဘလက်နှင့် ချိတ်ဆက်ရန်၊ ပမထဦးစွာ ဘလူးတုသ်ကို ဖွင့်ပါ။"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ဖွင့်ပါ"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"ပါဝါအကြောင်းကြားချက် ထိန်းချုပ်မှုများ"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ဖွင့် - မျက်နှာအခြေခံ"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"ပါဝါအကြောင်းကြားချက် ထိန်းချုပ်မှုများကိုအသုံးပြုပြီး အက်ပ်တစ်ခု၏ အကြောင်းကြားချက် အရေးပါမှု ၀ မှ ၅ အထိသတ်မှတ်ပေးနိုင်သည်။ \n\n"<b>"အဆင့် ၅"</b>" \n- အကြောင်းကြားချက်စာရင်း၏ ထိပ်ဆုံးတွင် ပြသည် \n- မျက်နှာပြင်အပြည့် ကြားဖြတ်ဖော်ပြခြင်းကို ခွင့်ပြုသည် \n- အမြဲတမ်း ခေတ္တပြပါမည် \n\n"<b>"အဆင့် ၄"</b>" \n- မျက်နှာပြင်အပြည့် ကြားဖြတ်ဖော်ပြခြင်း မရှိစေရန် ကာကွယ်ပေးသည် \n- အမြဲတမ်း ခေတ္တပြပါမည် \n\n"<b>"အဆင့် ၃"</b>" \n- မျက်နှာပြင်အပြည့် ကြားဖြတ်ဖော်ပြခြင်း မရှိစေရန် ကာကွယ်ပေးသည် \n- ဘယ်တော့မှ ခေတ္တပြခြင်း မရှိပါ \n\n"<b>"အဆင့် ၂"</b>" \n- မျက်နှာပြင်အပြည့် ကြားဖြတ်ဖော်ပြခြင်း မရှိစေရန် ကာကွယ်ပေးသည် \n- ဘယ်တော့မှ ခေတ္တပြခြင်း မရှိပါ \n- အသံမြည်ခြင်းနှင့် တုန်ခါခြင်းများ ဘယ်တော့မှ မပြုလုပ်ပါ \n\n"<b>"အဆင့် ၁"</b>" \n- မျက်နှာပြင်အပြည့် ကြားဖြတ်ဖော်ပြခြင်း မရှိစေရန် ကာကွယ်ပေးသည် \n- ဘယ်တော့မှ ခေတ္တပြခြင်း မရှိပါ \n- အသံမြည်ခြင်းနှင့် တုန်ခါခြင်းများ ဘယ်တော့မှ မပြုလုပ်ပါ \n- လော့ခ်ချထားသည့် မျက်နှာပြင်နှင့် အခြေအနေဘားတန်းတို့တွင် မပြပါ \n- အကြောင်းကြားချက်စာရင်း အောက်ဆုံးတွင်ပြသည် \n\n"<b>"အဆင့် ၀"</b>" \n- အက်ပ်မှ အကြောင်းကြားချက်များ အားလုံးကို ပိတ်ဆို့သည်"</string>
<string name="inline_done_button" msgid="6043094985588909584">"ပြီးပြီ"</string>
<string name="inline_ok_button" msgid="603075490581280343">"အသုံးပြုရန်"</string>
diff --git a/packages/SystemUI/res/values-my/tiles_states_strings.xml b/packages/SystemUI/res/values-my/tiles_states_strings.xml
index 7d2f20b..af8d55c 100644
--- a/packages/SystemUI/res/values-my/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-my/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ပိတ်"</item>
<item msgid="2075645297847971154">"ဖွင့်"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"မရနိုင်ပါ"</item>
<item msgid="9103697205127645916">"ပိတ်"</item>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 5aa4dd2..0102801 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låseskjerm."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Låseskjerm for arbeid"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Lukk"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi er slått av."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi er slått på."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Flymodus er slått av."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Flymodus er slått på."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"total stillhet"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"bare alarmer"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ikke forstyrr."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"«Ikke forstyrr» er slått av."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"«Ikke forstyrr» er slått på."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth er på."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth er av."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth er på."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Posisjonsrapportering er slått av."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Posisjonsrapportering er slått på."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmen ble stilt for <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Mer tid."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Mindre tid."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Lommelykten er slått av."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Lommelykten er slått på."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inverterte farger er slått av."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inverterte farger er slått på."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobil Wi-Fi-sone er slått av."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobil Wi-Fi-sone er slått på."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Skjermcastingen er stoppet."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Datasparing er slått av."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Datasparing er slått på."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Lysstyrken på skjermen"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobildatabruk er satt på pause"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data er satt på pause"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi er ikke tilkoblet"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Lysstyrke"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Fargeinvertering"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Flere innstillinger"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Brukerinnstillinger"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Ferdig"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"For å koble tastaturet til nettbrettet ditt må du først slå på Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Slå på"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Effektive varselinnstillinger"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"På – ansiktsbasert"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Med effektive varselinnstillinger kan du angi viktighetsnivåer fra 0 til 5 for appvarsler. \n\n"<b>"Nivå 5"</b>" \n– Vis øverst på varsellisten \n– Tillat forstyrrelser ved fullskjermmodus \n– Vis alltid raskt \n\n"<b>"Nivå 4"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis alltid raskt \n\n"<b>"Nivå 3"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri raskt \n\n"<b>"Nivå 2"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri fort \n– Tillat aldri lyder eller vibrering \n\n"<b>"Nivå 1"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri raskt \n– Tillat aldri lyder eller vibrering \n– Skjul fra låseskjermen og statusfeltet \n– Vis nederst på varsellisten \n\n"<b>"Nivå 0"</b>" \n– Blokkér alle varsler fra appen"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Ferdig"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Bruk"</string>
diff --git a/packages/SystemUI/res/values-nb/tiles_states_strings.xml b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
index e512a84..619f613 100644
--- a/packages/SystemUI/res/values-nb/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Av"</item>
<item msgid="2075645297847971154">"På"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Utilgjengelig"</item>
<item msgid="9103697205127645916">"Av"</item>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index afa8f1f..dc220c7 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"स्क्रीन बन्द गर्नुहोस्।"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"कार्य प्रोफाइलको लक स्क्रिन"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"बन्द गर्नुहोस्"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi बन्द गरियो।"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi खुला गरियो।"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"हवाइजहाज मोड बन्द छ।"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"हवाइजहाज मोड खोलियो।"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"पूर्ण मौनता"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"अलार्महरू मात्र"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"बाधा नपुऱ्याउनुहोस्।"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"बाधा नपुऱ्याउनुहोस् नामक सुविधा निष्क्रिय पारियो।"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"बाधा नपुऱ्याउनुहोस् नामक सुविधा सक्रिय पारियो।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ब्लुटुथ।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ब्लुटुथ खुला छ।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ब्लुटुथ बन्द गरियो।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ब्लुटुथ चालू गरियो।"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"स्थान रिपोर्टिङ बन्द गरियो।"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"स्थान रिपोर्टिङ खुला गरियो।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>को लागि सङ्केत घन्टी सेट गरिएको"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"थप समय।"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"कम समय।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"टर्च बन्द गरियो।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"टर्च खुला गरियो।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"रङ्ग उल्टाउने बन्द गरियो।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"रङ्ग उल्टाउने खुला गरियो।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"मोबाइल हटस्पट बन्द गरियो।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"मोबाइल हटस्पट खुला गरियो।"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"स्क्रिन कास्टिङ रोकियो।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"डेटा सेभरलाई निष्क्रिय पारियो।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"डेटा सेभरलाई सक्रिय गरियो।"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"प्रदर्शन चमक"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"मोबाइल डेटा पज गरिएको छ"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"डेटा रोकिएको छ"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi जडान गरिएको छैन"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"उज्यालपन"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"कलर इन्भर्सन"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"थप सेटिङहरू"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"प्रयोगकर्तासम्बन्धी सेटिङ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"भयो"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"आफ्नो ट्याब्लेटसँग किबोर्ड जोड्न, पहिले तपाईँले ब्लुटुथ सक्रिय गर्नुपर्छ।"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"सक्रिय पार्नुहोस्"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"सशक्त सूचना नियन्त्रण"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"अन छ - अनुहारमा आधारित"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"सशक्त सूचना नियन्त्रणहरू मार्फत तपाईं अनुप्रयाेगका सूचनाहरूका लागि ० देखि ५ सम्मको महत्व सम्बन्धी स्तर सेट गर्न सक्नुहुन्छ। \n\n"<b>"स्तर ५"</b>" \n- सूचनाको सूचीको माथिल्लो भागमा देखाउने \n- पूर्ण स्क्रिनमा अवरोधका लागि अनुमति दिने \n- सधैँ चियाउने \n\n"<b>"स्तर ४"</b>" \n- पूर्ण स्क्रिनमा अवरोधलाई रोक्ने \n- सधैँ चियाउने \n\n"<b>"स्तर ३"</b>" \n- पूर्ण स्क्रिनमा अवरोधलाई रोक्ने \n- कहिल्यै नचियाउने \n\n"<b>"स्तर २"</b>" \n- पूर्ण स्क्रिनमा अवरोधलाई रोक्ने \n- कहिल्यै नचियाउने \n- कहिल्यै पनि आवाज ननिकाल्ने र कम्पन नगर्ने \n\n"<b>"स्तर १"</b>" \n- पूर्ण स्क्रिनमा अवरोध रोक्ने \n- कहिल्यै नचियाउने \n- कहिल्यै पनि आवाज ननिकाल्ने वा कम्पन नगर्ने \n- लक स्क्रिन र वस्तुस्थिति पट्टीबाट लुकाउने \n- सूचनाको सूचीको तल्लो भागमा देखाउने \n\n"<b>"स्तर ०"</b>" \n- एपका सबै सूचनाहरूलाई रोक्ने"</string>
<string name="inline_done_button" msgid="6043094985588909584">"सम्पन्न भयो"</string>
<string name="inline_ok_button" msgid="603075490581280343">"लागू गर्नुहोस्"</string>
diff --git a/packages/SystemUI/res/values-ne/tiles_states_strings.xml b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
index 355df40..808b58d 100644
--- a/packages/SystemUI/res/values-ne/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"अफ छ"</item>
<item msgid="2075645297847971154">"अन छ"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"उपलब्ध छैन"</item>
<item msgid="9103697205127645916">"अफ छ"</item>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 09b278f..e7dbd2ec 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Vergrendelscherm."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Vergrendelscherm voor werk"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Sluiten"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi staat uit."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi staat aan."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Vliegtuigmodus staat uit."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Vliegtuigmodus staat aan."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"totale stilte"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"alleen wekkers"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Niet storen."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Niet storen staat uit."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Niet storen staat aan."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth aan."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth staat uit."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth staat aan."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Locatiemelding staat uit."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Locatiemelding staat aan."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Wekker is ingesteld op <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Meer tijd."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Minder tijd."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Zaklamp staat uit."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Zaklamp staat aan."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Kleurinversie staat uit."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Kleurinversie staat aan."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobiele hotspot staat uit."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobiele hotspot staat aan."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Casten van scherm gestopt."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Databesparing staat uit."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Databesparing staat aan."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Helderheid van het scherm"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobiele data zijn onderbroken"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Gegevens zijn onderbroken"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wifi niet verbonden"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Helderheid"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Kleurinversie"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellingen"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Gebruikersinstellingen"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth aanzetten."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Aanzetten"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Beheeropties voor meldingen met betrekking tot stroomverbruik"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Aan: op basis van gezicht"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Met beheeropties voor meldingen met betrekking tot stroomverbruik kun je een belangrijkheidsniveau van 0 tot 5 instellen voor de meldingen van een app. \n\n"<b>"Niveau 5"</b>" \n- Bovenaan de lijst met meldingen tonen \n- Onderbreking op volledig scherm toestaan \n- Altijd korte weergave \n\n"<b>"Niveau 4"</b>" \n- Geen onderbreking op volledig scherm \n- Altijd korte weergave \n\n"<b>"Niveau 3"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n\n"<b>"Niveau 2"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n\n"<b>"Niveau 1"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n- Verbergen op vergrendelscherm en statusbalk \n- Onderaan de lijst met meldingen tonen \n\n"<b>"Niveau 0"</b>" \n- Alle meldingen van de app blokkeren"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Klaar"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Toepassen"</string>
diff --git a/packages/SystemUI/res/values-nl/tiles_states_strings.xml b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
index fa85b88..92332ca 100644
--- a/packages/SystemUI/res/values-nl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Uit"</item>
<item msgid="2075645297847971154">"Aan"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Niet beschikbaar"</item>
<item msgid="9103697205127645916">"Uit"</item>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 0d0cea5..334b756 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ୱର୍କ ଲକ୍ ସ୍କ୍ରୀନ୍"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"ବନ୍ଦ କରନ୍ତୁ"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"ୱାଇ-ଫାଇ ବନ୍ଦ ଅଛି।"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"ୱାଇ-ଫାଇ ଚାଲୁ ଅଛି।"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍କୁ ବନ୍ଦ କରାଯାଇଛି।"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍କୁ ଚାଲୁ କରାଯାଇଛି।"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ସମ୍ପୂର୍ଣ୍ଣ ନୀରବତା"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"କେବଳ ଆଲାର୍ମ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ।"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\"କୁ ବନ୍ଦ କରାଯାଇଛି।"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଚାଲୁ ଅଛି।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ବ୍ଲୁଟୁଥ।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"ବ୍ଲୁଟୂଥ୍ ଚାଲୁ ଅଛି।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ବ୍ଲୁ-ଟୁଥ୍କୁ ବନ୍ଦ କରିଦିଆଯାଇଛି।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"ବ୍ଲୁ-ଟୁଥ୍କୁ ଚାଲୁ କରାଯାଇଛି।"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"ଲୋକେଶନ୍ର ରିପୋର୍ଟ ବନ୍ଦ କରାଗଲା।"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"ଲୋକେଶନ୍ର ରିପୋର୍ଟ ଅନ୍ କରାଗଲା।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>ରେ ଆଲାର୍ମ ସେଟ୍ କରାଯାଇଛି।"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ଅଧିକ ସମୟ।"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"କମ୍ ସମୟ।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ବନ୍ଦ ଅଛି।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ଚାଲୁ ଅଛି।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"ରଙ୍ଗ ବିପରୀତିକରଣକୁ ବନ୍ଦ କରିଦିଆଗଲା।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"ରଙ୍ଗ ବିପରୀତିକରଣକୁ ଚାଲୁ କରିଦିଆଗଲା।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"ମୋବାଇଲ୍ ହଟସ୍ପଟ୍ ବନ୍ଦ ଅଛି।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"ମୋବାଇଲ୍ ହଟସ୍ପଟ୍ ଚାଲୁ ଅଛି।"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"ସ୍କ୍ରୀନ୍ କାଷ୍ଟ କରିବା ରହିଯାଇଛି।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ଡାଟା ସେଭର୍ ଅଫ୍ କରାଗଲା।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ଡାଟା ସେଭର୍ ଅନ୍ କରାଗଲା।"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ଡିସ୍ପ୍ଲେ ଉଜ୍ଜ୍ୱଳତା"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"ମୋବାଇଲ୍ ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ୱାଇ-ଫାଇ ସଂଯୋଜିତ ହୋଇନାହିଁ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ଉଜ୍ଜ୍ୱଳତା"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ରଙ୍ଗ ଇନଭାର୍ସନ"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ଅଧିକ ସେଟିଂସ୍"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ଉପଯୋଗକର୍ତ୍ତା ସେଟିଂସ୍"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ହୋଇଗଲା"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"ଆପଣଙ୍କ ଟାବଲେଟ୍ରେ କୀ’ବୋର୍ଡ ସଂଯୋଗ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ପ୍ରଥମେ ବ୍ଲୁଟୂଥ୍ ଅନ୍ କରିବାକୁ ହେବ।"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ଚାଲୁ କରନ୍ତୁ"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"ପାୱାର୍ ବିଜ୍ଞପ୍ତି କଣ୍ଟ୍ରୋଲ୍"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ଚାଲୁ ଅଛି - ଫେସ-ଆଧାରିତ"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"ପାୱାର୍ ବିଜ୍ଞପ୍ତି କଣ୍ଟ୍ରୋଲ୍ରେ, ଆପଣ ଏକ ଆପ୍ ବିଜ୍ଞପ୍ତି ପାଇଁ 0 ରୁ 5 ଗୁରୁତ୍ୱ ସ୍ତର ସେଟ୍ କରିହେବେ। \n\n"<b>"ସ୍ତର 5"</b>" \n- ବିଜ୍ଞପ୍ତି ତାଲିକାର ଶୀର୍ଷରେ ଦେଖାନ୍ତୁ \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ \n- ସର୍ବଦା ପିକ୍ କରନ୍ତୁ \n\n"<b>"ସ୍ତର 4"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- ସର୍ବଦା ପିକ୍ କରନ୍ତୁ \n\n"<b>"ସ୍ତର 3"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n\n"<b>"ସ୍ତର 2"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n- କଦାପି ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେଟ୍ କରନ୍ତୁ ନାହିଁ \n\n"<b>"ସ୍ତର 1"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n- କଦାପି ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେଟ୍ କରନ୍ତୁ ନାହିଁ \n- ଲକ୍ ସ୍କ୍ରୀନ୍ ଓ ଷ୍ଟାଟସ୍ ବାର୍ରୁ ଲୁଚାନ୍ତୁ \n- ବିଜ୍ଞପ୍ତି ତାଲିକାର ନିମ୍ନରେ ଦେଖାନ୍ତୁ \n\n"<b>"ସ୍ତର 0"</b>" \n- ଆପରୁ ସମସ୍ତ ବିଜ୍ଞପ୍ତି ବ୍ଲକ୍ କରନ୍ତୁ"</string>
<string name="inline_done_button" msgid="6043094985588909584">"ହୋଇଗଲା"</string>
<string name="inline_ok_button" msgid="603075490581280343">"ଲାଗୁ କରନ୍ତୁ"</string>
diff --git a/packages/SystemUI/res/values-or/tiles_states_strings.xml b/packages/SystemUI/res/values-or/tiles_states_strings.xml
index bb94e0d..94b0122 100644
--- a/packages/SystemUI/res/values-or/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-or/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ବନ୍ଦ ଅଛି"</item>
<item msgid="2075645297847971154">"ଚାଲୁ ଅଛି"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ଉପଲବ୍ଧ ନାହିଁ"</item>
<item msgid="9103697205127645916">"ବନ୍ଦ ଅଛି"</item>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 902f36c..256ed36 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">" ਲਾਕ ਸਕ੍ਰੀਨ।"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"ਕਾਰਜ-ਸਥਾਨ ਲਾਕ ਸਕ੍ਰੀਨ"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"ਬੰਦ ਕਰੋ"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi ਬੰਦ ਕੀਤਾ।"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi ਚਾਲੂ ਕੀਤਾ।"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"ਏਅਰਪਲੇਨ ਮੋਡ ਬੰਦ ਹੈ।"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"ਏਅਰਪਲੇਨ ਮੋਡ ਚਾਲੂ ਹੋਇਆ"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ਪੂਰਾ ਸ਼ਾਂਤ"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ਸਿਰਫ਼ ਅਲਾਰਮ"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ।"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ।"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ਬਲੂਟੁੱਥ।"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ਚਾਲੂ।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth ਬੰਦ ਹੈ।"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth ਚਾਲੂ ਕੀਤੀ।"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"ਟਿਕਾਣਾ ਰਿਪੋਰਟਿੰਗ ਬੰਦ ਕੀਤੀ।"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"ਟਿਕਾਣਾ ਰਿਪੋਰਟਿੰਗ ਚਾਲੂ ਕੀਤੀ।"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ਅਲਾਰਮ <xliff:g id="TIME">%s</xliff:g> ਲਈ ਸੈੱਟ ਕੀਤਾ ਗਿਆ।"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ਹੋਰ ਸਮਾਂ।"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"ਘੱਟ ਸਮਾਂ।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ਫਲੈਸ਼ਲਾਈਟ ਬੰਦ ਕੀਤਾ।"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ਫਲੈਸ਼ਲਾਈਟ ਚਾਲੂ ਕੀਤੀ।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"ਰੰਗ ਦੀ ਉਲਟੀ ਤਰਤੀਬ ਬੰਦ ਕੀਤੀ।"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"ਰੰਗ ਦੀ ਉਲਟੀ ਤਰਤੀਬ ਚਾਲੂ ਕੀਤੀ।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"ਮੋਬਾਈਲ ਹੌਟਸਪੌਟ ਬੰਦ ਕੀਤਾ।"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"ਮੋਬਾਈਲ ਹੌਟਸਪੌਟ ਚਾਲੂ ਕੀਤਾ।"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"ਸਕ੍ਰੀਨ ਜੋੜਨਾ ਬੰਦ ਹੋਇਆ।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ਡਾਟਾ ਸੇਵਰ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ਡਾਟਾ ਸੇਵਰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ।"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ਡਿਸਪਲੇ ਚਮਕ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"ਮੋਬਾਈਲ ਡਾਟਾ ਰੋਕ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">" ਡਾਟਾ ਰੁਕ ਗਿਆ ਹੈ"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ਵਾਈ-ਫਾਈ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ਚਮਕ"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"ਰੰਗ ਪਲਟਨਾ"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"ਹੋਰ ਸੈਟਿੰਗਾਂ"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"ਵਰਤੋਂਕਾਰ ਸੈਟਿੰਗਾਂ"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ਹੋ ਗਿਆ"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"ਆਪਣੇ ਟੈਬਲੈੱਟ ਨਾਲ ਆਪਣਾ ਕੀ-ਬੋਰਡ ਕਨੈਕਟ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਬਲੂਟੁੱਥ ਚਾਲੂ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ਚਾਲੂ ਕਰੋ"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"ਪਾਵਰ ਸੂਚਨਾ ਕੰਟਰੋਲ"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ਚਾਲੂ ਹੈ - ਚਿਹਰਾ-ਆਧਾਰਿਤ"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"ਪਾਵਰ ਸੂਚਨਾ ਕੰਟਰੋਲਾਂ ਨਾਲ, ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਦੀਆਂ ਸੂਚਨਾਵਾਂ ਲਈ ਮਹੱਤਤਾ ਪੱਧਰ ਨੂੰ 0 ਤੋਂ 5 ਤੱਕ ਸੈੱਟ ਕਰ ਸਕਦੇ ਹੋ। \n\n"<b>"ਪੱਧਰ 5"</b>" \n- ਸੂਚਨਾ ਸੂਚੀ ਦੇ ਸਿਖਰ \'ਤੇ ਦਿਖਾਓ \n- ਪੂਰੀ ਸਕ੍ਰੀਨ ਰੁਕਾਵਟ ਦੀ ਆਗਿਆ ਦਿਓ \n- ਹਮੇਸ਼ਾਂ ਝਲਕ ਦਿਖਾਓ \n\n"<b>"ਪੱਧਰ 4"</b>" \n- ਪੂਰੀ ਸਕ੍ਰੀਨ ਰੁਕਾਵਟ ਨੂੰ ਰੋਕੋ \n- ਹਮੇਸ਼ਾਂ ਝਲਕ ਦਿਖਾਓ \n\n"<b>"ਪੱਧਰ 3"</b>" \n- ਪੂਰੀ ਸਕ੍ਰੀਨ ਰੁਕਾਵਟ ਨੂੰ ਰੋਕੋ \n- ਕਦੇ ਝਲਕ ਨਾ ਦਿਖਾਓ \n\n"<b>"ਪੱਧਰ 2"</b>" \n- ਪੂਰੀ ਸਕ੍ਰੀਨ ਰੁਕਾਵਟ ਨੂੰ ਰੋਕੋ \n- ਕਦੇ ਝਲਕ ਨਾ ਦਿਖਾਓ \n- ਕਦੇ ਵੀ ਧੁਨੀ ਜਾਂ ਥਰਥਰਾਹਟ ਨਾ ਕਰੋ \n\n"<b>"ਪੱਧਰ 1"</b>" \n- ਪੂਰੀ ਸਕ੍ਰੀਨ ਰੁਕਾਵਟ ਨੂੰ ਰੋਕੋ \n- ਕਦੇ ਝਲਕ ਨਾ ਦਿਖਾਓ \n- ਕਦੇ ਧੁਨੀ ਜਾਂ ਥਰਥਰਾਹਟ ਨਾ ਕਰੋ \n- ਲਾਕ ਸਕ੍ਰੀਨ ਅਤੇ ਸਥਿਤੀ ਪੱਟੀ ਤੋਂ ਲੁਕਾਓ \n- ਸੂਚਨਾ ਸੂਚੀ ਦੇ ਹੇਠਾਂ ਦਿਖਾਓ \n\n"<b>"ਪੱਧਰ 0"</b>" \n- ਐਪ ਤੋਂ ਸਾਰੀਆਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬਲਾਕ ਕਰੋ"</string>
<string name="inline_done_button" msgid="6043094985588909584">"ਹੋ ਗਿਆ"</string>
<string name="inline_ok_button" msgid="603075490581280343">"ਲਾਗੂ ਕਰੋ"</string>
diff --git a/packages/SystemUI/res/values-pa/tiles_states_strings.xml b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
index 2403141c..a7fc066 100644
--- a/packages/SystemUI/res/values-pa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ਬੰਦ ਹੈ"</item>
<item msgid="2075645297847971154">"ਚਾਲੂ ਹੈ"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ਅਣਉਪਲਬਧ ਹੈ"</item>
<item msgid="9103697205127645916">"ਬੰਦ ਹੈ"</item>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 3d09c50..8f57f0e 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ekran blokady."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ekran blokady wyświetlany podczas działania"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zamknij"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi wyłączone."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi włączone."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Tryb samolotowy został wyłączony."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Tryb samolotowy został włączony."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"całkowita cisza"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"tylko alarmy"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Nie przeszkadzać."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Tryb Nie przeszkadzać został wyłączony."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Tryb Nie przeszkadzać został włączony."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth włączony."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth jest wyłączony."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth jest włączony."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Raportowanie lokalizacji zostało wyłączone."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Raportowanie lokalizacji zostało włączone."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm ustawiony na <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Więcej czasu."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Mniej czasu."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Latarka została wyłączona."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Latarka została włączona."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Odwrócenie kolorów zostało wyłączone."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Odwrócenie kolorów zostało włączone."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobilny hotspot został wyłączony."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobilny hotspot został włączony."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Zatrzymano przesyłanie ekranu."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Oszczędzanie danych jest wyłączone."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Oszczędzanie danych jest włączone."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Jasność wyświetlacza"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobilna transmisja danych jest wstrzymana"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Transmisja danych została wstrzymana"</string>
@@ -253,6 +235,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Brak połączenia z Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jasność"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Odwrócenie kolorów"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Więcej ustawień"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Ustawienia użytkownika"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Gotowe"</string>
@@ -493,6 +477,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Aby połączyć klawiaturę z tabletem, musisz najpierw włączyć Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Włącz"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Zaawansowane ustawienia powiadomień"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Włączono – na podstawie twarzy"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Dzięki zaawansowanym ustawieniom możesz określić poziom ważności powiadomień z aplikacji w skali od 0 do 5. \n\n"<b>"Poziom 5"</b>" \n– Pokazuj u góry listy powiadomień \n– Zezwalaj na powiadomienia na pełnym ekranie \n– Zawsze pokazuj podgląd \n\n"<b>"Poziom 4"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Zawsze pokazuj podgląd \n\n"<b>"Poziom 3"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n\n"<b>"Poziom 2"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n– NIgdy nie powiadamiaj dźwiękiem ani wibracjami \n\n"<b>"Poziom 1"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n– NIgdy nie powiadamiaj dźwiękiem ani wibracjami \n– Ukrywaj na ekranie blokady i pasku stanu \n– Pokazuj u dołu listy powiadomień \n\n"<b>"Poziom 0"</b>" \n– Blokuj wszystkie powiadomienia aplikacji"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Gotowe"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Zastosuj"</string>
diff --git a/packages/SystemUI/res/values-pl/tiles_states_strings.xml b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
index 30026e8..94fa858 100644
--- a/packages/SystemUI/res/values-pl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Wyłączony"</item>
<item msgid="2075645297847971154">"Włączony"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Niedostępny"</item>
<item msgid="9103697205127645916">"Wyłączony"</item>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index e166fa4..3b37834 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Tela de bloqueio."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Tela de bloqueio de trabalho"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"O Wi-Fi foi desativado."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"O Wi-Fi foi ativado."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"O modo avião foi desativado."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"O modo avião foi ativado."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silêncio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"somente alarmes"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Não perturbe."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\"Não perturbe\" desativado."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\"Não perturbe\" ativado."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ativado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"O Bluetooth foi desativado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"O Bluetooth foi ativado."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"O Relatório de localização foi desativado."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"O Relatório de localização foi ativado."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Mais tempo."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Menos tempo."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"A lanterna foi desativada."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"A lanterna foi ativada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"A inversão de cores foi desativada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"A inversão de cores foi ativada."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"O ponto de acesso móvel foi desativado."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"O ponto de acesso móvel foi ativado."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"A transmissão de tela foi interrompida."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Economia de dados desativada."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Economia de dados ativada."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Brilho da tela"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Os dados móveis estão pausados"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Os dados foram pausados"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi não conectado"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brilho"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversão de cores"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correção de cor"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Mais configurações"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Config. do usuário"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Para conectar o teclado ao tablet, é preciso primeiro ativar o Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Ativar"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controles de ativação/desativação de notificações"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Ativada (reconhecimento facial)"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Com controles de ativação de notificações, é possível definir o nível de importância de 0 a 5 para as notificações de um app. \n\n"<b>"Nível 5"</b>" \n- Exibir na parte superior da lista de notificações \n- Permitir interrupção em tela cheia \n- Sempre exibir \n\n"<b>"Nível 4"</b>" \n- Impedir interrupções em tela cheia \n- Sempre exibir \n\n"<b>"Nível 3"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n\n"<b>"Nível 2"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n- Ocultar da tela de bloqueio e barra de status \n- Exibir na parte inferior da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações do app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Concluído"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplicar"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
index f874dd4..932ddc0 100644
--- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Desativado"</item>
<item msgid="2075645297847971154">"Ativado"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Indisponível"</item>
+ <item msgid="1909756493418256167">"Desativada"</item>
+ <item msgid="4531508423703413340">"Ativada"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponível"</item>
<item msgid="9103697205127645916">"Desativada"</item>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 808dd2b..1195413 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ecrã de bloqueio."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ecrã de bloqueio de trabalho"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi desligado."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi ligado."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Modo de avião desligado."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Modo de avião ligado."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silêncio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"apenas alarmes"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Não incomodar."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Modo Não incomodar desativado."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Modo Não incomodar ativado."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ligado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth desligado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth ligado."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Relatórios de localização desligados."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Relatórios de localização ligados."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Mais tempo."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Menos tempo."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Lanterna desligada."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Lanterna ligada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversão de cores desligada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversão de cores ligada."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Zona Wi-Fi móvel desligada."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Zona Wi-Fi móvel ligada."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Transmissão do ecrã interrompida."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Poupança de dados desativada."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Poupança de dados ativada."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Brilho do visor"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Dados móveis em pausa"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Dados em pausa"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi não ligado"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brilho"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversão de cores"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correção da cor"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Mais definições"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Definições do utilizador"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Para ligar o teclado ao tablet, tem de ativar primeiro o Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Ativar"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controlos de notificações do consumo de energia"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Ativada – Com base no rosto"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Com os controlos de notificações do consumo de energia, pode definir um nível de importância de 0 a 5 para as notificações de aplicações. \n\n"<b>"Nível 5"</b>" \n- Mostrar no início da lista de notificações \n- Permitir a interrupção do ecrã inteiro \n- Aparecer rapidamente sempre \n\n"<b>"Nível 4"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Aparecer rapidamente sempre\n\n"<b>"Nível 3"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n\n"<b>"Nível 2"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n- Nunca tocar nem vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n- Nunca tocar nem vibrar \n- Ocultar do ecrã de bloqueio e da barra de estado \n- Mostrar no fim da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações da app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Concluído"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplicar"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
index 1e426e1..e6ebea8 100644
--- a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Desligado"</item>
<item msgid="2075645297847971154">"Ligado"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Indisponível"</item>
+ <item msgid="1909756493418256167">"Desativada"</item>
+ <item msgid="4531508423703413340">"Ativada"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponível"</item>
<item msgid="9103697205127645916">"Desligado"</item>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index e166fa4..3b37834 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Tela de bloqueio."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Tela de bloqueio de trabalho"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Fechar"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"O Wi-Fi foi desativado."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"O Wi-Fi foi ativado."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"O modo avião foi desativado."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"O modo avião foi ativado."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"silêncio total"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"somente alarmes"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Não perturbe."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\"Não perturbe\" desativado."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\"Não perturbe\" ativado."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth ativado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"O Bluetooth foi desativado."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"O Bluetooth foi ativado."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"O Relatório de localização foi desativado."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"O Relatório de localização foi ativado."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Mais tempo."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Menos tempo."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"A lanterna foi desativada."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"A lanterna foi ativada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"A inversão de cores foi desativada."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"A inversão de cores foi ativada."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"O ponto de acesso móvel foi desativado."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"O ponto de acesso móvel foi ativado."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"A transmissão de tela foi interrompida."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Economia de dados desativada."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Economia de dados ativada."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Brilho da tela"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Os dados móveis estão pausados"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Os dados foram pausados"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi não conectado"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brilho"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversão de cores"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Correção de cor"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Mais configurações"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Config. do usuário"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Concluído"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Para conectar o teclado ao tablet, é preciso primeiro ativar o Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Ativar"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controles de ativação/desativação de notificações"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Ativada (reconhecimento facial)"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Com controles de ativação de notificações, é possível definir o nível de importância de 0 a 5 para as notificações de um app. \n\n"<b>"Nível 5"</b>" \n- Exibir na parte superior da lista de notificações \n- Permitir interrupção em tela cheia \n- Sempre exibir \n\n"<b>"Nível 4"</b>" \n- Impedir interrupções em tela cheia \n- Sempre exibir \n\n"<b>"Nível 3"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n\n"<b>"Nível 2"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n- Ocultar da tela de bloqueio e barra de status \n- Exibir na parte inferior da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações do app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Concluído"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplicar"</string>
diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
index f874dd4..932ddc0 100644
--- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Desativado"</item>
<item msgid="2075645297847971154">"Ativado"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Indisponível"</item>
+ <item msgid="1909756493418256167">"Desativada"</item>
+ <item msgid="4531508423703413340">"Ativada"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponível"</item>
<item msgid="9103697205127645916">"Desativada"</item>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 0fdd176..f8023cf 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ecranul de blocare."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ecran de blocare pentru serviciu"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Închideți"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Conexiunea prin Wi-Fi este dezactivată."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Conexiunea prin Wi-Fi este activată."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Modul Avion este dezactivat."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Modul Avion este activat."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"niciun sunet"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"numai alarme"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Nu deranja."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Funcția Nu deranja a fost dezactivată."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Funcția Nu deranja a fost activată."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Conexiunea prin Bluetooth este activată."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Conexiunea prin Bluetooth este dezactivată."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Conexiunea prin Bluetooth este activată."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Raportarea locației este dezactivată."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Raportarea locației este activată."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmă setată pentru <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Mai mult timp."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Mai puțin timp."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Lanterna este dezactivată."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Lanterna este activată."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inversarea culorilor este dezactivată."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inversarea culorilor este activată."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Hotspotul mobil este dezactivat."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Hotspotul mobil este activat."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Transmiterea ecranului a fost oprită."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Economizorul de date a fost dezactivat."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Economizorul de date a fost activat."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Luminozitatea ecranului"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Datele mobile sunt întrerupte"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Conexiunea de date este întreruptă"</string>
@@ -252,6 +234,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Rețeaua Wi-Fi nu este conectată"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Luminozitate"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inversarea culorilor"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Mai multe setări"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Setări de utilizator"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Terminat"</string>
@@ -490,6 +474,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Pentru a conecta tastatura la tabletă, mai întâi trebuie să activați Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Activați"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Comenzi de gestionare a notificărilor"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Activată – În funcție de chip"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Folosind comenzile de gestionare a notificărilor, puteți să setați un nivel de importanță de la 0 la 5 pentru notificările unei aplicații. \n\n"<b>"Nivelul 5"</b>" \n– Se afișează la începutul listei de notificări \n– Se permite întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n"<b>"Nivelul 4"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n"<b>"Nivelul 3"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n\n"<b>"Nivelul 2"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n\n"<b>"Nivelul 1"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n– Se ascunde în ecranul de blocare și în bara de stare \n– Se afișează la finalul listei de notificări \n\n"<b>"Nivelul 0"</b>" \n– Se blochează toate notificările din aplicație"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Gata"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Aplicați"</string>
diff --git a/packages/SystemUI/res/values-ro/tiles_states_strings.xml b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
index c63e7fe..708c6f0 100644
--- a/packages/SystemUI/res/values-ro/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Dezactivat"</item>
<item msgid="2075645297847971154">"Activat"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Indisponibilă"</item>
<item msgid="9103697205127645916">"Dezactivată"</item>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 2b06d10..9f40eab 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Экран блокировки."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Заблокировано"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Закрыть"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Модуль Wi-Fi отключен."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Модуль Wi-Fi включен."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Режим полета отключен."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Режим полета включен."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"полная тишина"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"только будильник"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не беспокоить."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Режим \"Не беспокоить\" выключен."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Режим \"Не беспокоить\" включен."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Модуль Bluetooth включен."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Модуль Bluetooth отключен."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Модуль Bluetooth включен."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Отправка геоданных отключена."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Отправка геоданных включена."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Будильник установлен на <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Увеличить время."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Уменьшить время."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Фонарик отключен."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Фонарик включен."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Инверсия цвета отключена."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Инверсия цвета включена."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Точка доступа отключена."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Точка доступа включена."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Трансляция прекращена."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Режим экономии трафика отключен."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Режим экономии трафика включен."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Яркость экрана"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Передача данных остановлена"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Передача данных приостановлена"</string>
@@ -253,6 +235,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Нет подключения к сети Wi-Fi."</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яркость"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверсия цветов"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Настройки"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Пользовательские настройки"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
@@ -493,6 +477,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Чтобы подключить клавиатуру к планшету, включите Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Включить"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Расширенное управление уведомлениями"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Включить (на основе распознавания лиц)"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"С помощью этой функции вы можете устанавливать уровень важности уведомлений от 0 до 5 для каждого приложения.\n\n"<b>"Уровень 5"</b>\n"‒ Помещать уведомления в начало списка.\n‒ Показывать полноэкранные уведомления.\n‒ Показывать всплывающие уведомления.\nУровень 4\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Показывать всплывающие уведомления.\nУровень 3\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\nУровень 2\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\n‒ Не использовать звук и вибрацию.\nУровень 1\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\n‒ Не использовать звук и вибрацию.\n‒ Не показывать на экране блокировки и в строке состояния.\n‒ Помещать уведомления в конец списка.\nУровень 0\n"<b></b>\n"‒ Блокировать все уведомления приложения."</string>
<string name="inline_done_button" msgid="6043094985588909584">"Готово"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Применить"</string>
diff --git a/packages/SystemUI/res/values-ru/tiles_states_strings.xml b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
index ae31f32..3a51c2e 100644
--- a/packages/SystemUI/res/values-ru/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Откл."</item>
<item msgid="2075645297847971154">"Вкл."</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Функция недоступна"</item>
<item msgid="9103697205127645916">"Откл."</item>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index bdd41a5..ce5b126 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"අගුළු තිරය."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"කාර්යාල අගුලු තිරය"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"වසන්න"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi අක්රියයි."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi ක්රියාත්මකයි."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"අහස්යානා අකාරය අක්රියයි."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"අහස්යානා ආකාරය සක්රීයයි."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"සම්පූර්ණ නිහඬතාව"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"එලාම පමණි"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"බාධා නොකරන්න."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\'බාධා නොකරන්න\' අක්රියයි."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"බාධා නොකරන්න සක්රීයයි."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"බ්ලූටූත්."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"බ්ලූටූත් ක්රියාත්මකයි."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"බ්ලූටූත් අක්රියයි."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"බ්ලූටූත් ක්රියාත්මක කෙරිණි."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"ස්ථානය වාර්තාකරණය අක්රියයි."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"ස්ථානය වාර්තාකරණය ක්රියාත්මක කෙරිණි."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> සඳහා සීනුව සකස් කර ඇත."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"වේලාව වැඩියෙන්."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"වේලාව අඩුවෙන්."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"සැණෙළි ආලෝකය අක්රිය කරන ලදි."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"සැණෙළි ආලෝකය සක්රිය කරන ලදි."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"වර්ණ අපවර්තනය අක්රිය කරන ලදි."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"වර්ණ අපවර්තනය සක්රිය කරන ලදි."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"ජංගම හොට්ස්පොටය අක්රිය කරන ලදි."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"ජංගම හොට්ස්පොටය සක්රිය කරන ලදි."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"තිරය විකාශය කිරීම නැවත් වන ලදි."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"දත්ත සුරැකුම ක්රියාවිරහිත කරන ලදී."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"දත්ත සුරැකුම ක්රියාත්මක කරන ලදී."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"සංදර්ශක දීප්තිය"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"ජංගම දත්ත විරාම කර ඇත"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"දත්ත විරාම කර ඇත"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi සම්බන්ධ නොවීය"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"දීප්තිමත් බව"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"වර්ණ අපවර්තනය"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"තව සැකසීම්"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"පරිශීලක සැකසීම්"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"නිමයි"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"ඔබේ යතුරු පුවරුව ඔබේ ටැබ්ලට් පරිගණකයට සම්බන්ධ කිරීමට, ඔබ පළමුව බ්ලූටූත් ක්රියාත්මක කළ යුතුය."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ක්රියාත්මක කරන්න"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"බල දැනුම්දීම් පාලන"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ක්රියාත්මකයි - මුහුණ-පදනම්ව"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"බල දැනුම්දීම් පාලන සමගින්, ඔබට යෙදුමක දැනුම්දීම් සඳහා වැදගත්කම 0 සිට 5 දක්වා සැකසිය හැකිය. \n\n"<b>"5 මට්ටම"</b>" \n- දැනුම්දීම් ලැයිස්තුවේ ඉහළින්ම පෙන්වන්න \n- පූර්ණ තිර බාධාවට ඉඩ දෙන්න \n- සැම විට එබී බලන්න \n\n"<b>"4 මට්ටම"</b>" \n- පූර්ණ තිර බාධාව වළක්වන්න \n- සැම විට එබී බලන්න \n\n"<b>"3 මට්ටම"</b>" \n- පූර්ණ තිර බාධාව වළක්වන්න \n- කිසි විටක එබී නොබලන්න \n\n"<b>"2 මට්ටම"</b>" \n- පූර්ණ තිර බාධාව වළක්වන්න \n- කිසි විටක එබී නොබලන්න \n- කිසි විටක හඬ සහ කම්පනය සිදු නොකරන්න \n\n"<b>"1 මට්ටම"</b>" \n- පූර්ණ තිර බාධාව වළක්වන්න \n- කිසි විටක එබී නොබලන්න \n- කිසි විටක හඬ සහ කම්පනය සිදු නොකරන්න \n- අගුලු තිරය සහ තත්ත්ව තීරුව වෙතින් සඟවන්න \n- දැනුම්දීම් ලැයිස්තුවේ පහළින්ම පෙන්වන්න \n\n"<b>"0 මට්ටම"</b>" \n- යෙදුම වෙතින් වන සියලු දැනුම් දීම් සඟවන්න."</string>
<string name="inline_done_button" msgid="6043094985588909584">"නිමයි"</string>
<string name="inline_ok_button" msgid="603075490581280343">"යොදන්න"</string>
diff --git a/packages/SystemUI/res/values-si/tiles_states_strings.xml b/packages/SystemUI/res/values-si/tiles_states_strings.xml
index fa78ccc..909d119 100644
--- a/packages/SystemUI/res/values-si/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-si/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"අක්රියයි"</item>
<item msgid="2075645297847971154">"සක්රියයි"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"නොමැත"</item>
<item msgid="9103697205127645916">"අක්රියයි"</item>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 0838f65..209b031 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Uzamknutá obrazovka"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Uzamknutá obrazovka pracovného profilu"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zavrieť"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Pripojenie Wi‑Fi je vypnuté."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Pripojenie Wi‑Fi je zapnuté."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Režim v lietadle je vypnutý."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Režim v lietadle je zapnutý."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"úplné ticho"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"iba budíky"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Režim bez vyrušení."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Režim bez vyrušení je vypnutý"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Režim bez vyrušení je zapnutý."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Rozhranie Bluetooth je zapnuté."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Rozhranie Bluetooth je vypnuté."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Rozhranie Bluetooth je zapnuté."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Nahlasovanie polohy je vypnuté."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Nahlasovanie polohy je zapnuté."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Budík nastavený na <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Dlhší čas"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Kratší čas"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Baterka je vypnutá."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Baterka je zapnutá."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Prevrátenie farieb je vypnuté."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Prevrátenie farieb je zapnuté."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobilný hotspot je vypnutý."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobilný hotspot je zapnutý."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Prenášanie bolo zastavené."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Šetrič dát bol vypnutý."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Šetrič dát bol zapnutý."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Jas displeja"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobilné dáta sú pozastavené"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Dáta sú pozastavené"</string>
@@ -253,6 +235,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Sieť Wi‑Fi nie je pripojená"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Jas"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzia farieb"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Úprava farieb"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Ďalšie nastavenia"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Používateľské nastavenia"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Hotovo"</string>
@@ -493,6 +476,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Ak chcete klávesnicu pripojiť k tabletu, najprv musíte zapnúť Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Zapnúť"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Ovládacie prvky zobrazovania upozornení"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Zapnuté – podľa tváre"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Pomocou ovládacích prvkov zobrazovania upozornení môžete nastaviť pre upozornenia aplikácie úroveň dôležitosti od 0 do 5. \n\n"<b>"Úroveň 5"</b>" \n– Zobrazovať v hornej časti zoznamu upozornení. \n– Povoliť prerušenia na celú obrazovku. \n– Vždy zobrazovať čiastočne. \n\n"<b>"Úroveň 4"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Vždy zobrazovať čiastočne. \n\n"<b>"Úroveň 3"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n\n"<b>"Úroveň 2"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n– Nikdy nespúšťať zvuk ani vibrácie. \n\n"<b>"Úroveň 1"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n– Nikdy nespúšťať zvuk ani vibrácie. \n– Skryť na uzamknutej obrazovke a v stavovom riadku. \n– Zobraziť v dolnej časti zoznamu upozornení. \n\n"<b>"Úroveň 0"</b>" \n– Blokovať všetky upozornenia z aplikácie."</string>
<string name="inline_done_button" msgid="6043094985588909584">"Hotovo"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Použiť"</string>
diff --git a/packages/SystemUI/res/values-sk/tiles_states_strings.xml b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
index 1920f04..a8c3545 100644
--- a/packages/SystemUI/res/values-sk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Vypnuté"</item>
<item msgid="2075645297847971154">"Zapnuté"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Nedostupné"</item>
+ <item msgid="1909756493418256167">"Vypnuté"</item>
+ <item msgid="4531508423703413340">"Zapnuté"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nie je k dispozícii"</item>
<item msgid="9103697205127645916">"Vypnuté"</item>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index e497d51..26d0570 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Zaklenjen zaslon"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaklenjen zaslon delovnega profila"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Zapri"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi je izklopljen."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi je vklopljen."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Način za letalo je izklopljen."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Način za letalo je vklopljen."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"popolna tišina"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"samo alarmi"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ne moti."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Način »ne moti« je izklopljen."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Način »ne moti« je vklopljen."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth je vklopljen."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth je izklopljen."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth je vklopljen."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Poročanje o lokaciji je izklopljeno."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Poročanje o lokaciji je vklopljeno."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm je nastavljen čez: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Daljši čas."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Krajši čas."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Svetilka je izklopljena."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Svetilka je vklopljena."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Inverzija barv je izklopljena."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Inverzija barv je vklopljena."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobilna dostopna točka je izklopljena."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobilna dostopna točka je vklopljena."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Predvajanje zaslona je ustavljeno."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Varčevanje s podatki je izklopljeno."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Varčevanje s podatki je vklopljeno."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Svetlost zaslona"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Prenos podatkov v mobil. omrežju je zaustavljen"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Prenos podatkov je zaustavljen"</string>
@@ -253,6 +235,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Povezava Wi-Fi ni vzpostavljena"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Svetlost"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Inverzija barv"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Popravljanje barv"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Več nastavitev"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Uporabniške nastavitve"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Končano"</string>
@@ -493,6 +476,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Če želite povezati tipkovnico in tablični računalnik, vklopite Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Vklop"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Kontrolniki za pomembnost obvestil"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Vklopljeno – na podlagi obraza"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"S kontrolniki za pomebnost obvestila je mogoče za obvestila aplikacije nastaviti stopnjo pomembnosti od 0 do 5. \n\n"<b>"Stopnja 5"</b>" \n– Prikaz na vrhu seznama obvestil \n– Omogočanje prekinitev v celozaslonskem načinu \n– Vedno prikaži hitre predoglede \n\n"<b>"Stopnja 4"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Vedno prikaži hitre predoglede \n\n"<b>"Stopnja 3"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n\n"<b>"Stopnja 2"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n– Nikoli ne uporabi zvoka in vibriranja \n\n"<b>"Stopnja 1"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n– Nikoli ne uporabi zvoka in vibriranja \n– Skrivanje na zaklenjenem zaslonu in v vrstici stanja \n– Prikaz na dnu seznama obvestil \n\n"<b>"Stopnja 0"</b>" \n– Blokiranje vseh obvestil aplikacije"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Končano"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Uporabi"</string>
diff --git a/packages/SystemUI/res/values-sl/tiles_states_strings.xml b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
index 924ec58..c09d911 100644
--- a/packages/SystemUI/res/values-sl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Izklopljeno"</item>
<item msgid="2075645297847971154">"Vklopljeno"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Ni na voljo"</item>
+ <item msgid="1909756493418256167">"Izklopljeno"</item>
+ <item msgid="4531508423703413340">"Vklopljeno"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ni na voljo"</item>
<item msgid="9103697205127645916">"Izklopljeno"</item>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index d6d5047..703e681 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Ekrani i kyçjes."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ekrani i kyçjes së punës"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Mbylle"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi është i çaktivizuar."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi është i aktivizuar."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Modaliteti i aeroplanit është i çaktivizuar."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Modaliteti i aeroplanit është i aktivizuar."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"heshtje e plotë"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"vetëm alarmet"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Mos shqetëso."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Funksioni \"Mos shqetëso\" është çaktivizuar."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\"Mos shqetëso\" është aktivizuar."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth-i."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"\"Bluetooth-i\" është i aktivizuar."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"\"Bluetooth-i\" është i çaktivizuar."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"\"Bluetooth-i\" është i aktivizuar."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Raportimi i vendndodhjes është i aktivizuar."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Raportimi i vendndodhjes është i aktivizuar."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmi u caktua për në <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Më shumë kohë."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Më pak kohë."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Elektriku u çaktivizua."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Elektriku është i aktivizuar."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Anasjellja e ngjyrës u çaktivizua."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Anasjellja e ngjyrës u aktivizua."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Qasja në zona publike interneti është e çaktivizuar."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Zona e qasjes publike për internet është e aktivizuar."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Transmetimi i ekranit ndaloi."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Kursyesi i të dhënave është çaktivizuar."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Kursyesi i të dhënave është aktivizuar."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Ndriçimi i ekranit"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Të dhënat celulare janë ndërprerë"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Të dhënat janë ndërprerë"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi nuk është lidhur"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ndriçimi"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Anasjellja e ngjyrës"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Cilësime të tjera"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Cilësimet e përdoruesit"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"U krye"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Për të lidhur tastierën me tabletin, në fillim duhet të aktivizosh \"bluetooth-in\"."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Aktivizo"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Kontrollet e njoftimit të energjisë"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Aktiv - Në bazë të fytyrës"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Me kontrollet e njoftimit të energjisë, mund të caktosh një nivel rëndësie nga 0 në 5 për njoftimet e një aplikacioni. \n\n"<b>"Niveli 5"</b>" \n- Shfaq në krye të listës së njoftimeve \n- Lejo ndërprerjen e ekranit të plotë \n- Gjithmonë shfaq shpejt \n\n"<b>"Niveli 4"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Gijthmonë shfaq shpejt \n\n"<b>"Niveli 3"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n\n"<b>"Niveli 2"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n- Asnjëherë mos lësho tingull dhe dridhje \n\n"<b>"Niveli 1"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n- Asnjëherë mos lësho tingull ose dridhje \n- Fshih nga ekrani i kyçjes dhe shiriti i statusit \n- Shfaq në fund të listës së njoftimeve \n\n"<b>"Niveli 0"</b>" \n- Blloko të gjitha njoftimet nga aplikacioni"</string>
<string name="inline_done_button" msgid="6043094985588909584">"U krye"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Zbato"</string>
diff --git a/packages/SystemUI/res/values-sq/tiles_states_strings.xml b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
index 34879ce..461cd93 100644
--- a/packages/SystemUI/res/values-sq/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sq/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Joaktive"</item>
<item msgid="2075645297847971154">"Aktive"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Nuk ofrohet"</item>
<item msgid="9103697205127645916">"Joaktiv"</item>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index dae3070..bf325e2 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Закључан екран."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Закључан екран за посао"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Затвори"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WiFi је искључен."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WiFi је укључен."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Режим рада у авиону је искључен."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Режим рада у авиону је укључен."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"потпуна тишина"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"само аларми"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не узнемиравај."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Подешавање Не узнемиравај је искључено."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Подешавање Не узнемиравај је укључено."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth је укључен."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth је искључен."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth је укључен."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Извештавање о локацији је искључено."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Извештавање о локацији је укључено."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Аларм је подешен за <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Више времена."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Мање времена."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Батеријска лампа је искључена."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Батеријска лампа је укључена."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Инверзија боја је искључена."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Инверзија боја је укључена."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мобилни хотспот је искључен."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Мобилни хотспот је укључен."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Пребацивање екрана је заустављено."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Уштеда података је искључена."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Уштеда података је укључена."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Осветљеност екрана"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мобилни подаци су паузирани"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Подаци су паузирани"</string>
@@ -252,6 +234,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"WiFi није повезан"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Осветљеност"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Инверзија боја"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Још подешавања"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Корисничка подешавања"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
@@ -490,6 +474,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Да бисте повезали тастатуру са таблетом, прво морате да укључите Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Укључи"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Напредне контроле за обавештења"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Укључено – на основу лица"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Помоћу напредних контрола за обавештења можете да подесите ниво важности од 0. до 5. за обавештења апликације. \n\n"<b>"5. ниво"</b>" \n– Приказују се у врху листе обавештења \n- Дозволи прекид режима целог екрана \n– Увек завируј \n\n"<b>"4. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Увек завируј \n\n"<b>"3. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n\n"<b>"2. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n– Никада не производи звук или вибрацију \n\n"<b>"1. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n– Никада не производи звук или вибрацију \n– Сакриј на закључаном екрану и статусној траци \n– Приказују се у дну листе обавештења \n\n"<b>"0. ниво"</b>" \n– Блокирај сва обавештења из апликације"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Готово"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Примени"</string>
diff --git a/packages/SystemUI/res/values-sr/tiles_states_strings.xml b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
index 855b84b..ab10ca1 100644
--- a/packages/SystemUI/res/values-sr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Искључено"</item>
<item msgid="2075645297847971154">"Укључено"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Недоступно"</item>
<item msgid="9103697205127645916">"Искључено"</item>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 668e7d3..36f4ab1 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Låsskärm."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Låsskärm för arbete"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Stäng"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"wifi har inaktiverats."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"wifi har aktiverats."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Flygplansläget har inaktiverats."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Flygplansläget har aktiverats."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"helt tyst"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"endast alarm"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Stör ej."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Stör ej har inaktiverats."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Stör ej har aktiverats."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth på."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth har inaktiverats."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth har aktiverats."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Platsrapporteringen har inaktiverats."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Platsrapporteringen har aktiverats."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarmet ringer <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Längre tid."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Kortare tid."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Ficklampan har inaktiverats."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Ficklampan har aktiverats."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Färginverteringen har inaktiverats."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Färginverteringen har aktiverats."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Den mobila surfzonen har inaktiverats."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Den mobila surfzonen har aktiverats."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Castningen av skärmen har stoppats."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Databesparing har inaktiverats."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Databesparing har aktiverats."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Skärmens ljusstyrka"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobildata har pausats"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Dataanvändningen har pausats"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Ej ansluten till wifi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ljusstyrka"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Färginvertering"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Fler inställningar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Användarinställningar"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Klart"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Om du vill ansluta tangentbordet till surfplattan måste du först aktivera Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Aktivera"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Prioritetsinställningar för aviseringar"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"På – ansiktsbaserad"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Med aviseringsinställningarna kan du ange prioritetsnivå från 0 till 5 för aviseringar från en app. \n\n"<b>"Nivå 5"</b>" \n– Visa högst upp i aviseringslistan\n– Tillåt avbrott i helskärmsläge \n– Snabbvisa alltid \n\n"<b>"Nivå 4"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa alltid \n\n"<b>"Nivå 3"</b>" \n- Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n\n"<b>"Nivå 2"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n– Aldrig med ljud eller vibration \n\n"<b>"Nivå 1"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n– Aldrig med ljud eller vibration \n– Visa inte på låsskärmen och i statusfältet \n– Visa längst ned i aviseringslistan \n\n"<b>"Nivå 0"</b>" \n– Blockera alla aviseringar från appen"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Klart"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Tillämpa"</string>
diff --git a/packages/SystemUI/res/values-sv/tiles_states_strings.xml b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
index b071b91..cdcf6e6 100644
--- a/packages/SystemUI/res/values-sv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Av"</item>
<item msgid="2075645297847971154">"På"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Inte tillgängligt"</item>
<item msgid="9103697205127645916">"Av"</item>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index fad086ad..6643348 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Skrini iliyofungwa."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Skrini iliyofungwa ya kazini"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Funga"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi imezimwa."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi imewashwa."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Hali ya ndegeni imezimwa."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Hali ya ndegeni imewashwa."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"kimya kabisa"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"kengele pekee"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Usinisumbue."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Kipengee cha Usinisumbue kimezimwa."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Kipengee cha Usinisumbue kimewashwa."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth imewashwa."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth imezimwa."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth imewashwa."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Programu ya Kuonyesha mahali ulipo imezimwa."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Programu ya Kuonyesha mahali ulipo imewashwa."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Kengele imewashwa na italia <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Muda zaidi."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Muda kidogo"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Tochi imezimwa."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Tochi imewashwa."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Ugeuzaji rangi umezimwa."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Ugeuzaji rangi umewashwa."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mtandaopepe unahamishika umezimwa."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mtandaopepe unaohamishika umewashwa."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Utumaji wa skrini umesitishwa."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Kiokoa Data kimezimwa."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Kiokoa Data kimewashwa."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Ung\'aavu wa skrini"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Data ya mtandao wa simu imesitishwa"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Data imesitishwa"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi haijaunganishwa"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ung\'avu"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ugeuzaji rangi"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Mipangilio zaidi"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Mipangilio ya mtumiaji"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Nimemaliza"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Ili uunganishe Kibodi yako kwenye kompyuta yako kibao, lazima kwanza uwashe Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Washa"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Udhibiti wa arifa"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Imewashwa - Inayolenga nyuso"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Ukiwa na udhibiti wa arifa, unaweza kuweka kiwango cha umuhimu wa arifa za programu kuanzia 0 hadi 5. \n\n"<b>"Kiwango cha 5"</b>" \n- Onyesha katika sehemu ya juu ya orodha ya arifa \n- Ruhusu ukatizaji wa skrini nzima \n- Ruhusu arifa za kuchungulia kila wakati\n\n"<b>"Kiwango cha 4"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Ruhusu arifa za kuchungulia kila wakati \n\n"<b>"Kiwango cha 3"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Usiruhusu kamwe arifa za kuchungulia\n\n"<b>"Kiwango cha 2"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Usiruhusu kamwe arifa za kuchungulia \n- Usiruhusu kamwe sauti au mtetemo \n\n"<b>"Kiwango cha 1"</b>" \n- Zuia ukatizaji wa skrini nzima \n- Usiruhusu kamwe arifa za kuchungulia \n- Usiruhusu kamwe sauti na mtetemo \n- Usionyeshe skrini iliyofungwa na sehemu ya arifa \n- Onyesha katika sehemu ya chini ya orodha ya arifa \n\n"<b>"Kiwango cha 0"</b>" \n- Zuia arifa zote kutoka programu"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Nimemaliza"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Tumia"</string>
diff --git a/packages/SystemUI/res/values-sw/tiles_states_strings.xml b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
index a92c7f9..563c078 100644
--- a/packages/SystemUI/res/values-sw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Kimezimwa"</item>
<item msgid="2075645297847971154">"Kimewashwa"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Hakipatikani"</item>
<item msgid="9103697205127645916">"Kimezimwa"</item>
diff --git a/packages/SystemUI/res/values-sw720dp-land/config.xml b/packages/SystemUI/res/values-sw720dp-land/config.xml
index e0b1614..ae89ef4 100644
--- a/packages/SystemUI/res/values-sw720dp-land/config.xml
+++ b/packages/SystemUI/res/values-sw720dp-land/config.xml
@@ -31,7 +31,7 @@
<bool name="config_use_split_notification_shade">true</bool>
<!-- The number of columns in the QuickSettings -->
- <integer name="quick_settings_num_columns">2</integer>
+ <integer name="quick_settings_num_columns">3</integer>
<!-- Notifications are sized to match the width of two (of 4) qs tiles in landscape. -->
<bool name="config_skinnyNotifsInLandscape">false</bool>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 10912be..f721b98 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"லாக் ஸ்கிரீன்."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"பணி லாக் ஸ்கிரீன்"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"மூடு"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"வைஃபை முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"வைஃபை இயக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"விமானப் பயன்முறை முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"விமானப் பயன்முறை இயக்கப்பட்டது."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"முழு அமைதி"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"அலாரங்கள் மட்டும்"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"தொந்தரவு செய்ய வேண்டாம்."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"’தொந்தரவு செய்ய வேண்டாம்’ அம்சம் முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"’தொந்தரவு செய்ய வேண்டாம்’ அம்சம் இயக்கப்பட்டது."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"புளூடூத்."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"புளூடூத் இயக்கத்தில்."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"புளூடூத் முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"புளூடூத் இயக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"இருப்பிட அறிக்கையிடல் முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"இருப்பிட அறிக்கையிடல் இயக்கப்பட்டது."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> மணிக்கு அலாரம் அமைக்கப்பட்டது."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"நேரத்தை அதிகரி."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"நேரத்தைக் குறை."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ஃபிளாஷ்லைட் முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"டார்ச் லைட் எரிகிறது"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"கலர் இன்வெர்ஷன் முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"கலர் இன்வெர்ஷன் இயக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"மொபைல் ஹாட்ஸ்பாட் முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"மொபைல் ஹாட்ஸ்பாட் இயக்கப்பட்டது."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"திரையை அனுப்புதல் நிறுத்தப்பட்டது."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"டேட்டா சேமிப்பான் முடக்கப்பட்டது."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"டேட்டா சேமிப்பான் இயக்கப்பட்டது."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"திரை பிரகாசம்"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"மொபைல் டேட்டா இடைநிறுத்தப்பட்டுள்ளது"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"தரவு இடைநிறுத்தப்பட்டது"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"வைஃபை இணைக்கப்படவில்லை"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ஒளிர்வு"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"கலர் இன்வெர்ஷன்"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"அமைப்பில் மாற்று"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"பயனர் அமைப்புகள்"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"முடிந்தது"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"உங்கள் டேப்லெட்டுடன் கீபோர்டை இணைக்க, முதலில் புளூடூத்தை இயக்க வேண்டும்."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"இயக்கு"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"ஆற்றல்மிக்க அறிவிப்புக் கட்டுப்பாடுகள்"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"ஆன் - முகம் அடிப்படையிலானது"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"ஆற்றல்மிக்க அறிவிப்புக் கட்டுப்பாடுகள் மூலம், ஆப்ஸின் அறிவிப்புகளுக்கு முக்கியத்துவ நிலையை (0-5) அமைக்கலாம். \n\n"<b>"நிலை 5"</b>" \n- அறிவிப்புப் பட்டியலின் மேலே காட்டும் \n- முழுத் திரைக் குறுக்கீட்டை அனுமதிக்கும் \n- எப்போதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டும் \n\n"<b>"நிலை 4"</b>" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- எப்போதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டும் \n\n"<b>"நிலை 3"</b>" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n\n"<b>"நிலை 2"</b>" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n- ஒருபோதும் ஒலி எழுப்பாது, அதிர்வுறாது \n\n"<b>"நிலை 1"</b>" \n- முழுத் திரைக் குறுக்கீட்டைத் தடுக்கும் \n- ஒருபோதும் நடப்புத் திரையின் மேல் பகுதியில் அறிவிப்புகளைக் காட்டாது \n- ஒருபோதும் ஒலி எழுப்பாது அல்லது அதிர்வுறாது \n- லாக் ஸ்கிரீன் மற்றும் நிலைப்பட்டியிலிருந்து மறைக்கும் \n- அறிவிப்புகள் பட்டியலின் கீழே காட்டும் \n\n"<b>"நிலை 0"</b>" \n- ஆப்ஸின் எல்லா அறிவிப்புகளையும் தடுக்கும்"</string>
<string name="inline_done_button" msgid="6043094985588909584">"முடிந்தது"</string>
<string name="inline_ok_button" msgid="603075490581280343">"பயன்படுத்து"</string>
diff --git a/packages/SystemUI/res/values-ta/tiles_states_strings.xml b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
index f3ba1a1..a9e0eab 100644
--- a/packages/SystemUI/res/values-ta/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"முடக்கப்பட்டுள்ளது"</item>
<item msgid="2075645297847971154">"இயக்கப்பட்டுள்ளது"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"கிடைக்கவில்லை"</item>
<item msgid="9103697205127645916">"முடக்கப்பட்டுள்ளது"</item>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index abba928..501ee17 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"లాక్ స్క్రీన్."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"కార్యాలయ లాక్ స్క్రీన్"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"మూసివేస్తుంది"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"వైఫై ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"వైఫై ఆన్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"ఎయిర్ప్లేన్ మోడ్ ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"ఎయిర్ప్లేన్ మోడ్ ఆన్ చేయబడింది."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"మొత్తం నిశ్శబ్దం"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"అలారాలు మాత్రమే"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"అంతరాయం కలిగించవద్దు."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\'అంతరాయం కలిగించవద్దు\' ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"అంతరాయం కలిగించవద్దు ఆన్ చేయబడింది."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"బ్లూటూత్."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"బ్లూటూత్ ఆన్లో ఉంది."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"బ్లూటూత్ ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"బ్లూటూత్ ఆన్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"లొకేషన్ రిపోర్టింగ్ ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"లొకేషన్ రిపోర్టింగ్ ఆన్ చేయబడింది."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g>కి అలారం సెట్ చేయబడింది."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ఎక్కువ సమయం."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"తక్కువ సమయం."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ఫ్లాష్లైట్ ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"ఫ్లాష్లైట్ ఆన్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"రంగు విలోమం ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"రంగు విలోమం ఆన్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"మొబైల్ హాట్స్పాట్ ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"మొబైల్ హాట్స్పాట్ ఆన్ చేయబడింది."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"స్క్రీన్ ప్రసారం ఆపివేయబడింది."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"డేటా సేవర్ ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"డేటా సేవర్ ఆన్ చేయబడింది."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ప్రదర్శన ప్రకాశం"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"మొబైల్ డేటా పాజ్ చేయబడింది"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"డేటా పాజ్ చేయబడింది"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi‑Fi కనెక్ట్ కాలేదు"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ప్రకాశం"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"కలర్ మార్పిడి"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"మరిన్ని సెట్టింగ్లు"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"యూజర్ సెట్టింగ్లు"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"పూర్తయింది"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"మీ కీబోర్డ్ను మీ టాబ్లెట్తో కనెక్ట్ చేయడానికి, మీరు ముందుగా బ్లూటూత్ ఆన్ చేయాలి."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"ఆన్ చేయి"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"పవర్ నోటిఫికేషన్ నియంత్రణలు"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"\'ముఖం ఆధారం\'ను - ఆన్ చేయండి"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"పవర్ నోటిఫికేషన్ కంట్రోల్స్ సాయంతో, మీరు యాప్ నోటిఫికేషన్లకు ప్రాముఖ్యతా స్థాయిని 0 నుండి 5 వరకు సెట్ చేయవచ్చు. \n\n"<b>"స్థాయి 5"</b>" \n- నోటిఫికేషన్ లిస్ట్ పైభాగంలో చూపబడతాయి \n- ఫుల్-స్క్రీన్ అంతరాయం అనుమతించబడుతుంది \n- ఎల్లప్పుడూ క్విక్ వీక్షణ అందించబడుతుంది \n\n"<b>"స్థాయి 4"</b>\n"- ఫుల్-స్క్రీన్ అంతరాయం నిరోధించబడుతుంది \n- ఎల్లప్పుడూ క్విక్ వీక్షణ అందించబడుతుంది \n\n"<b>"స్థాయి 3"</b>" \n- ఫుల్-స్క్రీన్ అంతరాయం నిరోధించబడుతుంది \n- ఎప్పుడూ క్విక్ వీక్షణ అందించబడదు \n\n"<b>"స్థాయి 2"</b>" \n- ఫుల్-స్క్రీన్ అంతరాయం నిరోధించబడుతుంది \n- ఎప్పుడూ క్విక్ వీక్షణ అందించబడదు \n- ఎప్పుడూ శబ్దం మరియు వైబ్రేషన్ చేయవు \n\n"<b>"స్థాయి 1"</b>" \n- ఫుల్-స్క్రీన్ అంతరాయం నిరోధించబడుతుంది \n- ఎప్పుడూ క్విక్ వీక్షణ అందించబడదు \n- ఎప్పుడూ శబ్దం లేదా వైబ్రేట్ చేయవు \n- లాక్ స్క్రీన్, స్టేటస్ బార్ల నుండి దాచబడతాయి \n- నోటిఫికేషన్ లిస్ట్ దిగువ భాగంలో చూపబడతాయి \n\n"<b>"స్థాయి 0"</b>" \n- యాప్ నుండి అన్ని నోటిఫికేషన్లు బ్లాక్ చేయబడతాయి"</string>
<string name="inline_done_button" msgid="6043094985588909584">"పూర్తయింది"</string>
<string name="inline_ok_button" msgid="603075490581280343">"అప్లయి చేయి"</string>
@@ -651,7 +636,7 @@
<string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"సెట్టింగ్లను తెరవండి."</string>
<string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"శీఘ్ర సెట్టింగ్లను తెరవండి."</string>
<string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"శీఘ్ర సెట్టింగ్లను మూసివేయండి."</string>
- <string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> వలె సైన్ ఇన్ చేశారు"</string>
+ <string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> లాగా సైన్ ఇన్ చేశారు"</string>
<string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"యూజర్ను ఎంపిక చేయండి"</string>
<string name="data_connection_no_internet" msgid="691058178914184544">"ఇంటర్నెట్ లేదు"</string>
<string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"వివరాలను తెరవండి."</string>
diff --git a/packages/SystemUI/res/values-te/tiles_states_strings.xml b/packages/SystemUI/res/values-te/tiles_states_strings.xml
index bed919f..4cb7291 100644
--- a/packages/SystemUI/res/values-te/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-te/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ఆఫ్లో ఉంది"</item>
<item msgid="2075645297847971154">"ఆన్లో ఉంది"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"అందుబాటులో లేదు"</item>
<item msgid="9103697205127645916">"ఆఫ్లో ఉంది"</item>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index a586f76f..6b7c05f 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ล็อกหน้าจอ"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"หน้าจอล็อกของโปรไฟล์งาน"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"ปิด"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"ปิด Wi-Fi แล้ว"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"เปิด Wi-Fi แล้ว"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"ปิดโหมดบนเครื่องบินแล้ว"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"เปิดโหมดบนเครื่องบินแล้ว"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ปิดเสียงทั้งหมด"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"เฉพาะปลุกเท่านั้น"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ห้ามรบกวน"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"โหมดห้ามรบกวนปิดอยู่"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"เปิดโหมดห้ามรบกวนแล้ว"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"บลูทูธ"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"บลูทูธเปิดอยู่"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"ปิดบลูทูธแล้ว"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"เปิดบลูทูธแล้ว"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"ปิดการรายงานตำแหน่งแล้ว"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"เปิดการรายงานตำแหน่งแล้ว"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ตั้งเวลาปลุกไว้ที่ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"เวลามากขึ้น"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"เวลาน้อยลง"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"ปิดไฟฉายแล้ว"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"เปิดไฟฉายแล้ว"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"ปิดการกลับสีแล้ว"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"เปิดการกลับสีแล้ว"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"ปิดฮอตสปอตเคลื่อนที่แล้ว"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"เปิดฮอตสปอตเคลื่อนที่แล้ว"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"หยุดการส่งหน้าจอแล้ว"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ปิดโปรแกรมประหยัดอินเทอร์เน็ตแล้ว"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"เปิดโปรแกรมประหยัดอินเทอร์เน็ตแล้ว"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ความสว่างของหน้าจอ"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"หยุดการใช้อินเทอร์เน็ตมือถือชั่วคราว"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"หยุดการใช้ข้อมูลชั่วคราวแล้ว"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ไม่ได้เชื่อมต่อ Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ความสว่าง"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"การกลับสี"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"การตั้งค่าเพิ่มเติม"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"การตั้งค่าของผู้ใช้"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"เสร็จสิ้น"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"หากต้องการเชื่อมต่อแป้นพิมพ์กับแท็บเล็ต คุณต้องเปิดบลูทูธก่อน"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"เปิด"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"ส่วนควบคุมการแจ้งเตือนแบบเปิด/ปิด"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"เปิด - ตามใบหน้า"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"ส่วนควบคุมการแจ้งเตือนแบบเปิด/ปิดช่วยให้คุณตั้งค่าระดับความสำคัญสำหรับการแจ้งเตือนของแอปได้ตั้งแต่ระดับ 0-5 \n\n"<b>"ระดับ 5"</b>" \n- แสดงที่ด้านบนของรายการแจ้งเตือน \n- อนุญาตให้รบกวนแบบเต็มหน้าจอ \n- อนุญาตให้แสดงชั่วครู่ \n\n"<b>"ระดับ 4"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- แสดงชั่วครู่เสมอ \n\n"<b>"ระดับ 3"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n\n"<b>"ระดับ 2"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n- ไม่ส่งเสียงหรือสั่นเลย \n\n"<b>"ระดับ 1"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n- ไม่ส่งเสียงหรือสั่นเลย \n- ซ่อนจากหน้าจอล็อกและแถบสถานะ \n- แสดงที่ด้านล่างของรายการแจ้งเตือน \n\n"<b>"ระดับ 0"</b>" \n- บล็อกการแจ้งเตือนทั้งหมดจากแอป"</string>
<string name="inline_done_button" msgid="6043094985588909584">"เสร็จสิ้น"</string>
<string name="inline_ok_button" msgid="603075490581280343">"ใช้"</string>
diff --git a/packages/SystemUI/res/values-th/tiles_states_strings.xml b/packages/SystemUI/res/values-th/tiles_states_strings.xml
index d5591b2..6776873 100644
--- a/packages/SystemUI/res/values-th/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-th/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"ปิด"</item>
<item msgid="2075645297847971154">"เปิด"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ไม่พร้อมใช้งาน"</item>
<item msgid="9103697205127645916">"ปิด"</item>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 42eed44..df54658 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Lock screen."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Lock screen sa trabaho"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Isara"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Na-off ang wifi."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Na-on ang wifi."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Na-off ang Airplane mode."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Na-on ang Airplane mode."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ganap na katahimikan"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"mga alarm lang"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Huwag Istorbohin."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Na-off ang Huwag Istorbohin."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Na-on ang Huwag Istorbohin."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Naka-on ang Bluetooth."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Na-off ang Bluetooth."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Na-on ang Bluetooth."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Na-off ang pag-uulat ng lokasyon."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Na-on ang pag-uulat ng lokasyon."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Nakatakda ang alarm nang <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Higit pang oras."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Mas kaunting oras."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Na-off ang flashlight."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Na-on ang flashlight."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Na-off ang pag-invert ng kulay."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Na-on ang pag-invert ng kulay."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Na-off ang mobile hotspot."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Na-on ang mobile hotspot."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Itinigil ang pagka-cast sa screen."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Na-off ang Data Saver."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Na-on ang Data Saver."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Liwanag ng display"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Naka-pause ang mobile data"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Naka-pause ang data"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Hindi nakakonekta sa Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brightness"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Pag-invert ng kulay"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Higit pang setting"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Mga setting ng user"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Tapos na"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Upang ikonekta ang iyong keyboard sa iyong tablet, kailangan mo munang i-on ang Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"I-on"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Mga kontrol sa notification ng power"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Naka-on - Batay sa mukha"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Sa pamamagitan ng mga kontrol sa notification ng power, magagawa mong itakda ang antas ng kahalagahan ng mga notification ng isang app mula 0 hanggang 5. \n\n"<b>"Antas 5"</b>" \n- Ipakita sa itaas ng listahan ng notification \n- Payagan ang pag-istorbo kapag full screen \n- Palaging sumilip \n\n"<b>"Antas 4"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Palaging sumilip \n\n"<b>"Antas 3"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n\n"<b>"Antas 2"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n- Huwag kailanman tumunog o mag-vibrate \n\n"<b>"Antas 1"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n- Huwag kailanman tumunog o mag-vibrate \n- Itago sa lock screen at status bar \n- Ipakita sa ibaba ng listahan ng notification \n\n"<b>"Antas 0"</b>" \n- I-block ang lahat ng notification mula sa app"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Tapos na"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Ilapat"</string>
diff --git a/packages/SystemUI/res/values-tl/tiles_states_strings.xml b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
index c601d2f..62172a4 100644
--- a/packages/SystemUI/res/values-tl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Naka-off"</item>
<item msgid="2075645297847971154">"Naka-on"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Hindi available"</item>
<item msgid="9103697205127645916">"Naka-off"</item>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index f79420e..f389bf1 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Kilit ekranı"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"İş profili kilit ekranı"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Kapat"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Kablosuz kapatıldı."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Kablosuz açıldı."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Uçak modu kapatıldı."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Uçak modu açıldı."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"tamamen sessiz"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"yalnızca alarmlar"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Rahatsız Etmeyin."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Rahatsız Etmeyin ayarı kapalı."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Rahatsız Etmeyin ayarı açık."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth açık."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth kapatıldı."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth açıldı."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Konum Bildirme kapatıldı."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Konum Bildirme açıldı."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Alarm saati: <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Daha uzun süre."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Daha kısa süre."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"El feneri kapatıldı."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"El feneri açıldı."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Renkleri ters çevirme işlevi kapatıldı."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Renkleri ters çevirme işlevi açıldı."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobil hotspot kapatıldı."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobil hotspot açıldı."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Ekran yayını durduruldu."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Veri Tasarrufu kapatıldı."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Veri Tasarrufu açıldı."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Ekran parlaklığı"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobil veri duraklatıldı"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Veri kullanımı duraklatıldı"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Kablosuz ağ bağlı değil"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Parlaklık"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Rengi ters çevirme"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Diğer ayarlar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Kullanıcı ayarları"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Bitti"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Klavyenizi tabletinize bağlamak için önce Bluetooth\'u açmanız gerekir."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Aç"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Güç bildirim kontrolleri"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Açık - Yüze göre"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Güç bildirim kontrolleriyle, bir uygulamanın bildirimleri için 0 ile 5 arasında bir önem düzeyi ayarlayabilirsiniz. \n\n"<b>"5. Düzey"</b>" \n- Bildirim listesinin en üstünde gösterilsin \n- Tam ekran kesintisine izin verilsin \n- Ekranda her zaman kısaca belirsin \n\n"<b>"4. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda her zaman kısaca belirsin \n\n"<b>"3. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman kısaca belirmesin \n\n"<b>"2. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman belirmesin \n- Hiçbir zaman ses çıkarmasın ve titreştirmesin \n\n"<b>"1. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman kısaca belirmesin \n- Hiçbir zaman ses çıkarmasın veya titreştirmesin \n- Kilit ekranından ve durum çubuğundan gizlensin \n- Bildirim listesinin en altında gösterilsin \n\n"<b>"0. Düzey"</b>" \n- Uygulamadan gelen tüm bildirimler engellensin"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Bitti"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Uygula"</string>
diff --git a/packages/SystemUI/res/values-tr/tiles_states_strings.xml b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
index 17ce6b3..9f836fc 100644
--- a/packages/SystemUI/res/values-tr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Kapalı"</item>
<item msgid="2075645297847971154">"Açık"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Kullanılamıyor"</item>
<item msgid="9103697205127645916">"Kapalı"</item>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 17a3ce8..3856cc5 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Заблокований екран."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Екран блокування завдання"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Закрити"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi вимкнено."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi увімкнено."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Режим польоту вимкнено."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Режим польоту ввімкнено."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"без сигналів"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"лише будильники"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Не турбувати."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Режим \"Не турбувати\" вимкнено."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Режим \"Не турбувати\" ввімкнено."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth увімк."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth вимкнено."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth увімкнено."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Надсилання геоданих вимкнено."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Надсилання геоданих увімкнено."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Сигнал установлено на <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Більше часу."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Менше часу."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Ліхтарик вимкнено."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Ліхтарик увімкнено."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Інверсію кольорів вимкнено."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Інверсію кольорів увімкнено."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Мобільну точку доступу вимкнено."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Мобільну точку доступу ввімкнено."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Трансляцію екрана зупинено."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Заощадження трафіку вимкнено."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Заощадження трафіку ввімкнено."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Яскравість дисплея"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Мобільне передавання даних призупинено"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Передавання даних призупинено"</string>
@@ -253,6 +235,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi не під’єднано"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Яскравість"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Інверсія кольорів"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Більше налаштувань"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Налаштування користувача"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Готово"</string>
@@ -493,6 +477,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Щоб під’єднати клавіатуру до планшета, спершу потрібно ввімкнути Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Увімкнути"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Елементи керування сповіщеннями"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Увімкнути (за обличчям)"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"За допомогою елементів керування сповіщеннями ви можете налаштувати пріоритет сповіщень додатка – від 0 до 5 рівня. \n\n"<b>"Рівень 5"</b>\n"- Показувати сповіщення вгорі списку \n- Виводити на весь екран \n- Завжди показувати короткі сповіщення \n\n"<b>"Рівень 4"</b>\n"- Не виводити на весь екран \n- Завжди показувати короткі сповіщення \n\n"<b>"Рівень 3"</b>\n"- Не виводити на весь екран \n- Не показувати короткі сповіщення \n\n"<b>"Рівень 2"</b>\n"- Не виводити на весь екран \n- Не показувати короткі сповіщення \n- Вимкнути звук і вібросигнал \n\n"<b>"Рівень 1"</b>\n"- Не виводити на весь екран \n- Не показувати короткі сповіщення \n- Вимкнути звук і вібросигнал \n- Не показувати на заблокованому екрані та в рядку стану \n- Показувати сповіщення внизу списку \n\n"<b>"Рівень 0"</b>\n"- Блокувати всі сповіщення з додатка"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Готово"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Застосувати"</string>
diff --git a/packages/SystemUI/res/values-uk/tiles_states_strings.xml b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
index 6f9ef21..34c40d3 100644
--- a/packages/SystemUI/res/values-uk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Вимкнено"</item>
<item msgid="2075645297847971154">"Увімкнено"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Недоступно"</item>
<item msgid="9103697205127645916">"Вимкнено"</item>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 350aaba..dafaddf 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"مقفل اسکرین۔"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"دفتری مقفل اسکرین"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"بند کریں"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi کو آف کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi کو آن کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"ہوائی جہاز وضع کو آف کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"ہوائی جہاز وضع کو آن کر دیا گیا۔"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"مکمل خاموشی"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"صرف الارمز"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"ڈسٹرب نہ کریں۔"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"\'ڈسٹرب نہ کریں\' کو آف کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"\'ڈسٹرب نہ کریں\' کو آن کر دیا گیا۔"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"بلوٹوتھ۔"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"بلوٹوتھ آن ہے۔"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"بلوٹوتھ کو آف کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"بلوٹوتھ کو آن کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"مقام کی اطلاع دہندگی کو آف کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"مقام کی اطلاع دہندگی کو آن کر دیا گیا۔"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"الارم <xliff:g id="TIME">%s</xliff:g> کیلئے سیٹ ہے۔"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"مزید وقت۔"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"کم وقت۔"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"فلیش لائٹ کو آف کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"فلیش لائٹ کو آن کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"رنگ کی تبدیلی کو آف کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"رنگ کی تبدیلی کو آن کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"موبائل ہاٹ اسپاٹ کو آف کر دیا گیا۔"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"موبائل ہاٹ اسپاٹ کو آن کر دیا گیا۔"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"اسکرین کو کاسٹ کرنا بند کر دیا۔"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"ڈیٹا سیور آف ہو گیا۔"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"ڈیٹا سرور آن ہو گیا۔"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"ڈسپلے کی چمک"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"موبائل ڈیٹا موقوف کر دیا گیا ہے"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ڈیٹا موقوف کر دیا گیا"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi سے منسلک نہیں ہے"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"چمکیلا پن"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"رنگوں کی تقلیب"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"مزید ترتیبات"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"صارف کی ترتیبات"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"ہو گیا"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"اپنے کی بورڈ کو اپنے ٹیبلٹ کے ساتھ منسلک کرنے کیلئے پہلے آپ کو اپنا بلو ٹوتھ آن کرنا ہو گا۔"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"آن کریں"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"پاور اطلاع کے کنٹرولز"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"آن - چہرے پر مبنی"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"پاور اطلاع کنٹرولز کے ساتھ آپ کسی ایپ کی اطلاعات کیلئے 0 سے 5 تک اہمیت کی سطح سیٹ کر سکتے ہیں۔ \n\n"<b>"سطح 5"</b>\n"- اطلاعات کی فہرست کے اوپر دکھائیں \n- پوری اسکرین کی مداخلت کی اجازت دیں \n- ہمیشہ جھانکنا\n\n"<b>"سطح 4"</b>\n"- پوری اسکرین کی مداخلت کو روکیں \n- ہمیشہ جھانکنا\n\n"<b>"سطح 3"</b>\n"- پوری اسکرین کی مداخلت کو روکیں \n- کبھی نہ جھانکنا \n\n"<b>"سطح 2"</b>\n"- پوری اسکرین کی مداخلت کو روکیں \n- کبھی نہ جھانکنا \n- کبھی آواز اور ارتعاش پیدا نہ کرنا \n\n"<b>" سطح 1"</b>\n"- پوری اسکرین کی مداخلت کو روکنا \n- کبھی نہ جھانکنا \n- کبھی بھی آواز یا ارتعاش پیدا نہ کرنا\n- مقفل اسکرین اور اسٹیٹس بار سے چھپانا \n - اطلاع کی فہرست کی نیچے دکھانا \n\n"<b>"سطح 0"</b>\n"- ایپ سے تمام اطلاعات مسدود کریں"</string>
<string name="inline_done_button" msgid="6043094985588909584">"ہو گیا"</string>
<string name="inline_ok_button" msgid="603075490581280343">"لاگو کریں"</string>
diff --git a/packages/SystemUI/res/values-ur/tiles_states_strings.xml b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
index 3284fc5..02943fa 100644
--- a/packages/SystemUI/res/values-ur/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"آف ہے"</item>
<item msgid="2075645297847971154">"آن ہے"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"دستیاب نہیں ہے"</item>
<item msgid="9103697205127645916">"آف ہے"</item>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 277f1c3..13971dd 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Qulflash ekrani."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ishchi ekran qulfi"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Yopish"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi o‘chirildi."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi yoqildi."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Parvoz rejimi o‘chirildi."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Parvoz rejimi yoqildi."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"jimjitlik"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"faqat signallar"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Bezovta qilinmasin."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Bezovta qilinmasin funksiyasi faolsizlantirildi."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Bezovta qilinmasin rejimi yoqildi."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth yoqilgan."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Bluetooth o‘chirildi."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Bluetooth yoqildi."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Joylashuv ma’lumotini yuborish o‘chirildi."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Joylashuv ma’lumotini yuborish yoqildi."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Signal <xliff:g id="TIME">%s</xliff:g> da chalinadi."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Ko‘proq vaqt."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Kamroq vaqt."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Fonar o‘chirildi."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Fonar yoqildi."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Ranglarni akslantirish o‘chirildi."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Ranglarni akslantirish yoqildi."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Mobil ulanish nuqtasi o‘chirildi."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Mobil ulanish nuqtasi yoqildi."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Ekranni translatsiya qilish to‘xtadi."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Trafik tejash rejimi o‘chirib qo‘yildi."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Trafik tejash rejimi yoqildi."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Ekran yorqinligi"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Mobil internet pauza qilindi"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Internetdan foydalanish to‘xtatib qo‘yildi"</string>
@@ -251,6 +233,7 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi tarmoqqa ulanmagan"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Yorqinlik"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ranglarni akslantirish"</string>
+ <string name="quick_settings_color_correction_label" msgid="5636617913560474664">"Ranglarni tuzatish"</string>
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Boshqa sozlamalar"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Foydalanuvchi sozlamalari"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Tayyor"</string>
@@ -487,6 +470,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Klaviaturani planshetingizga ulash uchun Bluetooth xizmatini yoqishingiz kerak."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Yoqish"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Bildirishnomalar uchun kengaytirilgan boshqaruv"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Yoqish - Yuz asosida"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Bildirishnomalar uchun kengaytirilgan boshqaruv yordamida ilova bildirishnomalarining muhimlik darajasini (0-5) sozlash mumkin. \n\n"<b>"5-daraja"</b>" \n- Bildirishnomani ro‘yxatning boshida ko‘rsatish \n- To‘liq ekranli bildirishnomalarni ko‘rsatish \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatish \n\n"<b>"4-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatish \n\n"<b>"3-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n\n"<b>"2-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n- Ovoz va tebranishdan foydalanmaslik \n\n"<b>"1-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n- Ovoz va tebranishdan foydalanmaslik \n- Ekran qulfi va holat qatorida ko‘rsatmaslik \n- Bildirishnomani ro‘yxatning oxirida ko‘rsatish \n\n"<b>"0-daraja"</b>" \n- Ilovadan keladigan barcha bildirishnomalarni bloklash"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Tayyor"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Joriy qilish"</string>
diff --git a/packages/SystemUI/res/values-uz/tiles_states_strings.xml b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
index 47bcf4d..52a8b0a 100644
--- a/packages/SystemUI/res/values-uz/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
@@ -86,6 +86,11 @@
<item msgid="5715725170633593906">"Oʻchiq"</item>
<item msgid="2075645297847971154">"Yoniq"</item>
</string-array>
+ <string-array name="tile_states_color_correction">
+ <item msgid="2840507878437297682">"Ishlamaydi"</item>
+ <item msgid="1909756493418256167">"Yoqilmagan"</item>
+ <item msgid="4531508423703413340">"Yoniq"</item>
+ </string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Ishlamaydi"</item>
<item msgid="9103697205127645916">"Oʻchiq"</item>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 1c1557e..4d2c90c 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Màn hình khóa."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Màn hình khóa công việc"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Đóng"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Đã tắt Wifi."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Đã bật Wifi."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Đã tắt chế độ trên máy bay."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Đã bật chế độ trên máy bay."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"hoàn toàn tắt tiếng"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"chỉ chuông báo"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Không làm phiền."</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Đã tắt chế độ Không làm phiền."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Đã bật tính năng Không làm phiền."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"Bluetooth bật."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"Đã tắt Bluetooth."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"Đã bật Bluetooth."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Đã tắt Báo cáo vị trí."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Đã bật Báo cáo vị trí."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"Báo thức được đặt cho <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Nhiều thời gian hơn."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Ít thời gian hơn."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"Đã tắt đèn pin."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"Đã bật đèn pin."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Đã tắt đảo màu."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Đã bật đảo màu."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"Đã tắt điểm phát sóng di động."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"Đã bật điểm phát sóng di động."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Đã ngừng truyền màn hình."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Đã tắt Trình tiết kiệm dữ liệu."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Đã bật Trình tiết kiệm dữ liệu."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Độ sáng màn hình"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Dữ liệu di động đã bị tạm dừng"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Đã tạm dừng dữ liệu"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Chưa kết nối với Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Độ sáng"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Đảo màu"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Chế độ cài đặt khác"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Cài đặt người dùng"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Xong"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Để kết nối bàn phím với máy tính bảng, trước tiên, bạn phải bật Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Bật"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Điều khiển thông báo nguồn"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Đang bật – Dựa trên khuôn mặt"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Với các kiểm soát thông báo nguồn, bạn có thể đặt cấp độ quan trọng từ 0 đến 5 cho các thông báo của ứng dụng. \n\n"<b>"Cấp 5"</b>" \n- Hiển thị ở đầu danh sách thông báo \n- Cho phép gián đoạn ở chế độ toàn màn hình \n- Luôn xem nhanh \n\n"<b>"Cấp 4"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Luôn xem nhanh \n\n"<b>"Cấp 3"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n\n"<b>"Cấp 2"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n- Không bao giờ có âm báo và rung \n\n"<b>"Cấp 1"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n- Không bao giờ có âm báo và rung \n- Ẩn khỏi màn hình khóa và thanh trạng thái \n- Hiển thị ở cuối danh sách thông báo \n\n"<b>"Cấp 0"</b>" \n- Chặn tất cả các thông báo từ ứng dụng"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Xong"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Áp dụng"</string>
diff --git a/packages/SystemUI/res/values-vi/tiles_states_strings.xml b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
index ecc3223..bff64ab 100644
--- a/packages/SystemUI/res/values-vi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Đang tắt"</item>
<item msgid="2075645297847971154">"Đang bật"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Không hoạt động"</item>
<item msgid="9103697205127645916">"Đang tắt"</item>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index efd24bc..038ada0 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"锁定屏幕。"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"工作锁定屏幕"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"关闭"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WLAN已关闭。"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WLAN已开启。"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"飞行模式已关闭。"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"飞行模式已开启。"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"完全静音"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"仅限闹钟"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"勿扰。"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"勿扰模式已关闭。"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"勿扰模式已开启。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"蓝牙。"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"蓝牙开启。"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"蓝牙已关闭。"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"蓝牙已开启。"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"位置报告功能已关闭。"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"位置报告功能已开启。"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"闹钟已设置为:<xliff:g id="TIME">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"延长时间。"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"缩短时间。"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"手电筒已关闭。"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"手电筒已打开。"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"颜色反转功能已关闭。"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"颜色反转功能已开启。"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"移动热点已关闭。"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"移动热点已开启。"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"屏幕投射已停止。"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"流量节省程序已关闭。"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"流量节省程序已开启。"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"屏幕亮度"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"已暂停使用移动数据网络"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"数据网络已暂停使用"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"未连接到 WLAN 网络"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"颜色反转"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"更多设置"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"用户设置"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"要将您的键盘连接到平板电脑,您必须先开启蓝牙。"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"开启"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"高级通知设置"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"已开启 - 基于人脸"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"利用高级通知设置,您可以为应用通知设置从 0 级到 5 级的重要程度等级。\n\n"<b>"5 级"</b>" \n- 在通知列表顶部显示 \n- 允许全屏打扰 \n- 一律短暂显示通知 \n\n"<b>"4 级"</b>" \n- 禁止全屏打扰 \n- 一律短暂显示通知 \n\n"<b>"3 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n\n"<b>"2 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n- 一律不发出声音或振动 \n\n"<b>"1 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n- 一律不发出声音或振动 \n- 不在锁定屏幕和状态栏中显示 \n- 在通知列表底部显示 \n\n"<b>"0 级"</b>" \n- 屏蔽应用的所有通知"</string>
<string name="inline_done_button" msgid="6043094985588909584">"完成"</string>
<string name="inline_ok_button" msgid="603075490581280343">"应用"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
index 43de98e..0d72f61 100644
--- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"已关闭"</item>
<item msgid="2075645297847971154">"已开启"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"不可用"</item>
<item msgid="9103697205127645916">"已关闭"</item>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index e7cb583..d4406b4 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"上鎖畫面。"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"工作螢幕鎖定"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"關閉"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WiFi 已關閉。"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WiFi 已開啟。"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"飛行模式已關閉。"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"飛行模式已開啟。"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"完全靜音"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"只限鬧鐘"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"請勿騷擾。"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"閂咗「請勿騷擾」。"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"已開咗「請勿騷擾」。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"藍牙。"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"藍牙已開啟。"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"藍牙已關閉。"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"藍牙已開啟。"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"位置報告已關閉。"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"位置報告已開啟。"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"鬧鐘已設定為:<xliff:g id="TIME">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"增加時間。"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"減少時間。"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"閃光燈已關閉。"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"閃光燈已開啟。"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"色彩反轉模式已關閉。"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"色彩反轉模式已開啟。"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"流動熱點已關閉。"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"流動熱點已開啟。"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"已停止投放螢幕。"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"已關閉數據節省模式。"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"已開啟數據節省模式。"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"顯示光暗度"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"已暫停使用流動數據"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"已暫停使用數據"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"未連線至 Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"色彩反轉"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"更多設定"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"使用者設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"如要將鍵盤連接至平板電腦,請先開啟藍牙。"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"開啟"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"通知控制項"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"已開啟 - 根據面孔偵測"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"通知控制項讓您設定應用程式通知的重要性 (0 至 5 級)。\n\n"<b>"第 5 級"</b>" \n- 在通知清單頂部顯示 \n- 允許全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 4 級"</b>" \n- 阻止全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 3 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n\n"<b>"第 2 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n\n"<b>"第 1 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n- 從上鎖畫面和狀態列中隱藏 \n- 在通知清單底部顯示 \n\n"<b>"第 0 級"</b>" \n- 封鎖所有應用程式通知"</string>
<string name="inline_done_button" msgid="6043094985588909584">"完成"</string>
<string name="inline_ok_button" msgid="603075490581280343">"套用"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
index 637fb4c..571cfba 100644
--- a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"已關閉"</item>
<item msgid="2075645297847971154">"已開啟"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"無法使用"</item>
<item msgid="9103697205127645916">"已關閉"</item>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 11e4ac6..83623d4 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"螢幕鎖定。"</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Work 螢幕鎖定"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"關閉"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WiFi 已關閉。"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WiFi 已開啟。"</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"飛航模式已關閉。"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"飛航模式已開啟。"</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"完全靜音"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"僅限鬧鐘"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"零打擾。"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"「零打擾」設定已關閉。"</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"「零打擾」設定已開啟。"</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"藍牙。"</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"藍牙已開啟。"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"藍牙已關閉。"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"藍牙已開啟。"</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"位置回報設定已關閉。"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"位置回報設定已開啟。"</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"鬧鐘已設定為:<xliff:g id="TIME">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"增加時間。"</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"減少時間。"</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"閃光燈已關閉。"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"閃光燈已開啟。"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"色彩反轉模式已關閉。"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"色彩反轉模式已開啟。"</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"可攜式無線基地台已關閉。"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"可攜式無線基地台已開啟。"</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"已停止投放螢幕。"</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"數據節省模式已關閉。"</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"數據節省模式已開啟。"</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"螢幕亮度"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"行動數據已暫停使用"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"已暫停數據連線"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"未連線至 Wi-Fi"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"亮度"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"色彩反轉"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"更多設定"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"使用者設定"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"完成"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"如要將鍵盤連線到平板電腦,你必須先開啟藍牙。"</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"開啟"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"電源通知控制項"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"已開啟 - 依臉部方向旋轉"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"只要使用電源通知控制項,你就能為應用程式通知設定從 0 到 5 的重要性等級。\n\n"<b>"等級 5"</b>" \n- 顯示在通知清單頂端 \n- 允許全螢幕通知 \n- 一律允許短暫顯示通知 \n\n"<b>"等級 4"</b>" \n- 禁止全螢幕通知 \n- 一律允許短暫顯示通知 \n\n"<b>"等級 3"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n\n"<b>"等級 2"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n\n"<b>"等級 1"</b>" \n- 禁止全螢幕通知 \n- 一律不允許短暫顯示通知 \n- 一律不發出音效或震動 \n- 在鎖定畫面和狀態列中隱藏 \n- 顯示在通知清單底端 \n\n"<b>"等級 0"</b>" \n- 封鎖應用程式的所有通知"</string>
<string name="inline_done_button" msgid="6043094985588909584">"完成"</string>
<string name="inline_ok_button" msgid="603075490581280343">"套用"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
index 266cf5d..4889657 100644
--- a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"已關閉"</item>
<item msgid="2075645297847971154">"已開啟"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"無法使用"</item>
<item msgid="9103697205127645916">"已關閉"</item>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 8c7f030..fa200dc 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -175,33 +175,15 @@
<string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Khiya isikrini."</string>
<string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Ukukhiya isikrini somsebenzi"</string>
<string name="accessibility_desc_close" msgid="8293708213442107755">"Vala"</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"I-Wifi ivaliwe."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"I-Wifi ivuliwe."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"Imodi yendiza ivaliwe."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"Imodi yendiza ivuliwe."</string>
<string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ukuthula okuphelele"</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ama-alamu kuphela"</string>
<string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"Ungaphazamisi"</string>
- <string name="accessibility_quick_settings_dnd_changed_off" msgid="1457150026842505799">"Ukungaphazamisi kuvaliwe."</string>
- <string name="accessibility_quick_settings_dnd_changed_on" msgid="186315911607486129">"Ukungaphazamisi kuvuliwe."</string>
<string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"I-Bluetooth."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="3819082137684078013">"I-Bluetooth ivuliwe."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="3344226652293797283">"I-Bluetooth ivaliwe."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="1263282011749437549">"I-Bluetooth ivuliwe."</string>
- <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"Ukubikwa kwendawo kuvaliwe."</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"Ukubikwa kwendawo kuvuliwe."</string>
<string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"I-alamu isethiwe ngo-<xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"Isikhathi esiningi."</string>
<string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"Isikhathi esincane."</string>
- <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3782375441381402599">"I-Flashlight ivaliwe."</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"I-Flashlight ivuliwe."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"Ukufakwa kombhala kuvaliwe."</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"Ukufakwa kombhala kuvuliwe."</string>
- <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"I-hotspot ivaliwe."</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"I-hotspot ivuliwe."</string>
<string name="accessibility_casting_turned_off" msgid="1387906158563374962">"Ukusakaza kwesikrini kumisiwe."</string>
- <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"Iseva yedatha ivaliwe."</string>
- <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"Iseva yedatha ivuliwe."</string>
<string name="accessibility_brightness" msgid="5391187016177823721">"Bonisa ukukhanya"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"Idatha yeselula imisiwe"</string>
<string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"Idatha imisiwe"</string>
@@ -251,6 +233,8 @@
<string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"I-Wi-Fi ayixhunyiwe"</string>
<string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Ukugqama"</string>
<string name="quick_settings_inversion_label" msgid="3501527749494755688">"Ukuguqulwa kombala"</string>
+ <!-- no translation found for quick_settings_color_correction_label (5636617913560474664) -->
+ <skip />
<string name="quick_settings_more_settings" msgid="2878235926753776694">"Izilungiselelo eziningi"</string>
<string name="quick_settings_more_user_settings" msgid="1064187451100861954">"Amasethingi womsebenzisi"</string>
<string name="quick_settings_done" msgid="2163641301648855793">"Kwenziwe"</string>
@@ -487,6 +471,7 @@
<string name="enable_bluetooth_message" msgid="6740938333772779717">"Ukuze uxhume ikhibhodi yakho nethebhulethi yakho, kufanele uqale ngokuvula i-Bluetooth."</string>
<string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Vula"</string>
<string name="tuner_full_importance_settings" msgid="1388025816553459059">"Izilawuli zesaziso zamandla"</string>
+ <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Vuliwe - Kususelwe kubuso"</string>
<string name="power_notification_controls_description" msgid="1334963837572708952">"Ngezilawuli zesaziso zamandla, ungasetha ileveli ebalulekile kusuka ku-0 kuya ku-5 kusuka kuzaziso zohlelo lokusebenza. \n\n"<b>"Ileveli 5"</b>" \n- Ibonisa phezulu kuhlu lwesaziso \n- Vumela ukuphazamiseka kwesikrini esigcwele \n- Ukuhlola njalo \n\n"<b>"Ileveli 4"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukuhlola njalo \n\n"<b>"Ileveli 3"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n\n"<b>"Ileveli 2"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n- Ungenzi umsindo nokudlidliza \n\n"<b>"Ileveli 1"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n- Ungenzi umsindo noma ukudlidliza \n- Fihla kusuka kusikrini sokukhiya nebha yesimo \n- Bonisa phansi kohlu lwesaziso \n\n"<b>"Ileveli 0"</b>" \n- Vimbela zonke izaziso kusuka kuhlelo lokusebenza"</string>
<string name="inline_done_button" msgid="6043094985588909584">"Kwenziwe"</string>
<string name="inline_ok_button" msgid="603075490581280343">"Faka"</string>
diff --git a/packages/SystemUI/res/values-zu/tiles_states_strings.xml b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
index 9cac4ae..ea40faf 100644
--- a/packages/SystemUI/res/values-zu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
@@ -86,6 +86,9 @@
<item msgid="5715725170633593906">"Valiwe"</item>
<item msgid="2075645297847971154">"Vuliwe"</item>
</string-array>
+ <!-- no translation found for tile_states_color_correction:0 (2840507878437297682) -->
+ <!-- no translation found for tile_states_color_correction:1 (1909756493418256167) -->
+ <!-- no translation found for tile_states_color_correction:2 (4531508423703413340) -->
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"Akutholakali"</item>
<item msgid="9103697205127645916">"Valiwe"</item>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 7b8f349..56517cc 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -294,6 +294,7 @@
<string-array name="config_systemUIServiceComponents" translatable="false">
<item>com.android.systemui.util.NotificationChannels</item>
<item>com.android.systemui.keyguard.KeyguardViewMediator</item>
+ <item>com.android.keyguard.KeyguardBiometricLockoutLogger</item>
<item>com.android.systemui.recents.Recents</item>
<item>com.android.systemui.volume.VolumeUI</item>
<item>com.android.systemui.statusbar.phone.StatusBar</item>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 2bf121d2e..7600eb1 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1165,10 +1165,10 @@
<string name="wallet_lockscreen_settings_label">Lock screen settings</string>
<!-- QR Code Scanner label, title [CHAR LIMIT=32] -->
- <string name="qr_code_scanner_title">Scan QR</string>
+ <string name="qr_code_scanner_title">QR code</string>
<!-- QR Code Scanner description [CHAR LIMIT=NONE] -->
- <string name="qr_code_scanner_description">Click to scan a QR code</string>
+ <string name="qr_code_scanner_description">Tap to scan</string>
<!-- Name of the work status bar icon. -->
<string name="status_bar_work">Work profile</string>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt
index 24e93ef..953b0e0 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt
+++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt
@@ -21,24 +21,24 @@
import android.hardware.SensorManager
import android.hardware.devicestate.DeviceStateManager
import android.os.Handler
-import com.android.systemui.unfold.updates.screen.ScreenStatusProvider
import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig
import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.progress.FixedTimingTransitionProgressProvider
import com.android.systemui.unfold.progress.PhysicsBasedUnfoldTransitionProgressProvider
-import com.android.systemui.unfold.util.ScaleAwareTransitionProgressProvider
import com.android.systemui.unfold.updates.DeviceFoldStateProvider
+import com.android.systemui.unfold.updates.FoldStateProvider
import com.android.systemui.unfold.updates.hinge.EmptyHingeAngleProvider
import com.android.systemui.unfold.updates.hinge.HingeSensorAngleProvider
+import com.android.systemui.unfold.updates.screen.ScreenStatusProvider
import com.android.systemui.unfold.util.ATraceLoggerTransitionProgressListener
-import java.lang.IllegalStateException
+import com.android.systemui.unfold.util.ScaleAwareTransitionProgressProvider
import java.util.concurrent.Executor
/**
* Factory for [UnfoldTransitionProgressProvider].
*
- * This is needed as Launcher has to create the object manually.
- * Sysui create it using dagger (see [UnfoldTransitionModule]).
+ * This is needed as Launcher has to create the object manually. Sysui create it using dagger (see
+ * [UnfoldTransitionModule]).
*/
fun createUnfoldTransitionProgressProvider(
context: Context,
@@ -52,10 +52,45 @@
): UnfoldTransitionProgressProvider {
if (!config.isEnabled) {
- throw IllegalStateException("Trying to create " +
- "UnfoldTransitionProgressProvider when the transition is disabled")
+ throw IllegalStateException(
+ "Trying to create " +
+ "UnfoldTransitionProgressProvider when the transition is disabled")
}
+ val foldStateProvider =
+ createFoldStateProvider(
+ context,
+ config,
+ screenStatusProvider,
+ deviceStateManager,
+ sensorManager,
+ mainHandler,
+ mainExecutor)
+
+ val unfoldTransitionProgressProvider =
+ if (config.isHingeAngleEnabled) {
+ PhysicsBasedUnfoldTransitionProgressProvider(foldStateProvider)
+ } else {
+ FixedTimingTransitionProgressProvider(foldStateProvider)
+ }
+
+ return ScaleAwareTransitionProgressProvider(
+ unfoldTransitionProgressProvider, context.contentResolver)
+ .apply {
+ // Always present callback that logs animation beginning and end.
+ addCallback(ATraceLoggerTransitionProgressListener(tracingTagPrefix))
+ }
+}
+
+fun createFoldStateProvider(
+ context: Context,
+ config: UnfoldTransitionConfig,
+ screenStatusProvider: ScreenStatusProvider,
+ deviceStateManager: DeviceStateManager,
+ sensorManager: SensorManager,
+ mainHandler: Handler,
+ mainExecutor: Executor
+): FoldStateProvider {
val hingeAngleProvider =
if (config.isHingeAngleEnabled) {
HingeSensorAngleProvider(sensorManager)
@@ -63,28 +98,13 @@
EmptyHingeAngleProvider()
}
- val foldStateProvider = DeviceFoldStateProvider(
+ return DeviceFoldStateProvider(
context,
hingeAngleProvider,
screenStatusProvider,
deviceStateManager,
mainExecutor,
- mainHandler
- )
-
- val unfoldTransitionProgressProvider = if (config.isHingeAngleEnabled) {
- PhysicsBasedUnfoldTransitionProgressProvider(foldStateProvider)
- } else {
- FixedTimingTransitionProgressProvider(foldStateProvider)
- }
- return ScaleAwareTransitionProgressProvider(
- unfoldTransitionProgressProvider,
- context.contentResolver
- ).apply {
- // Always present callback that logs animation beginning and end.
- addCallback(ATraceLoggerTransitionProgressListener(tracingTagPrefix))
- }
+ mainHandler)
}
-fun createConfig(context: Context): UnfoldTransitionConfig =
- ResourceUnfoldTransitionConfig(context)
+fun createConfig(context: Context): UnfoldTransitionConfig = ResourceUnfoldTransitionConfig(context)
diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProvider.kt
index 22698a8..a274b74 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProvider.kt
+++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/util/ScopedUnfoldTransitionProgressProvider.kt
@@ -89,6 +89,7 @@
override fun destroy() {
source?.removeCallback(this)
+ source?.destroy()
}
override fun onTransitionStarted() {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt
new file mode 100644
index 0000000..214b284
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardBiometricLockoutLogger.kt
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.keyguard
+
+import android.content.Context
+import android.hardware.biometrics.BiometricSourceType
+import com.android.internal.annotations.VisibleForTesting
+import com.android.internal.logging.UiEvent
+import com.android.internal.logging.UiEventLogger
+import com.android.internal.widget.LockPatternUtils
+import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT
+import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT
+import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE
+import com.android.keyguard.KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+import com.android.systemui.CoreStartable
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dump.DumpManager
+import java.io.FileDescriptor
+import java.io.PrintWriter
+import javax.inject.Inject
+
+/**
+ * Logs events when primary authentication requirements change. Primary authentication is considered
+ * authentication using pin/pattern/password input.
+ *
+ * See [PrimaryAuthRequiredEvent] for all the events and their descriptions.
+ */
+@SysUISingleton
+class KeyguardBiometricLockoutLogger @Inject constructor(
+ context: Context?,
+ private val uiEventLogger: UiEventLogger,
+ private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
+ private val dumpManager: DumpManager
+) : CoreStartable(context) {
+ private var fingerprintLockedOut = false
+ private var faceLockedOut = false
+ private var encryptedOrLockdown = false
+ private var unattendedUpdate = false
+ private var timeout = false
+
+ override fun start() {
+ dumpManager.registerDumpable(this)
+ mKeyguardUpdateMonitorCallback.onStrongAuthStateChanged(
+ KeyguardUpdateMonitor.getCurrentUser())
+ keyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback)
+ }
+
+ private val mKeyguardUpdateMonitorCallback: KeyguardUpdateMonitorCallback =
+ object : KeyguardUpdateMonitorCallback() {
+ override fun onLockedOutStateChanged(biometricSourceType: BiometricSourceType) {
+ if (biometricSourceType == BiometricSourceType.FINGERPRINT) {
+ val lockedOut = keyguardUpdateMonitor.isFingerprintLockedOut
+ if (lockedOut && !fingerprintLockedOut) {
+ uiEventLogger.log(
+ PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT)
+ } else if (!lockedOut && fingerprintLockedOut) {
+ uiEventLogger.log(
+ PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET)
+ }
+ fingerprintLockedOut = lockedOut
+ } else if (biometricSourceType == BiometricSourceType.FACE) {
+ val lockedOut = keyguardUpdateMonitor.isFaceLockedOut
+ if (lockedOut && !faceLockedOut) {
+ uiEventLogger.log(
+ PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT)
+ } else if (!lockedOut && faceLockedOut) {
+ uiEventLogger.log(
+ PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET)
+ }
+ faceLockedOut = lockedOut
+ }
+ }
+
+ override fun onStrongAuthStateChanged(userId: Int) {
+ if (userId != KeyguardUpdateMonitor.getCurrentUser()) {
+ return
+ }
+ val strongAuthFlags = keyguardUpdateMonitor.strongAuthTracker
+ .getStrongAuthForUser(userId)
+
+ val newEncryptedOrLockdown = keyguardUpdateMonitor.isEncryptedOrLockdown(userId)
+ if (newEncryptedOrLockdown && !encryptedOrLockdown) {
+ uiEventLogger.log(
+ PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN)
+ }
+ encryptedOrLockdown = newEncryptedOrLockdown
+
+ val newUnattendedUpdate = isUnattendedUpdate(strongAuthFlags)
+ if (newUnattendedUpdate && !unattendedUpdate) {
+ uiEventLogger.log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE)
+ }
+ unattendedUpdate = newUnattendedUpdate
+
+ val newTimeout = isStrongAuthTimeout(strongAuthFlags)
+ if (newTimeout && !timeout) {
+ uiEventLogger.log(PrimaryAuthRequiredEvent.PRIMARY_AUTH_REQUIRED_TIMEOUT)
+ }
+ timeout = newTimeout
+ }
+ }
+
+ private fun isUnattendedUpdate(
+ @LockPatternUtils.StrongAuthTracker.StrongAuthFlags flags: Int
+ ) = containsFlag(flags, STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE)
+
+ private fun isStrongAuthTimeout(
+ @LockPatternUtils.StrongAuthTracker.StrongAuthFlags flags: Int
+ ) = containsFlag(flags, STRONG_AUTH_REQUIRED_AFTER_TIMEOUT) ||
+ containsFlag(flags, STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT)
+
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<String>) {
+ pw.println(" mFingerprintLockedOut=$fingerprintLockedOut")
+ pw.println(" mFaceLockedOut=$faceLockedOut")
+ pw.println(" mIsEncryptedOrLockdown=$encryptedOrLockdown")
+ pw.println(" mIsUnattendedUpdate=$unattendedUpdate")
+ pw.println(" mIsTimeout=$timeout")
+ }
+
+ /**
+ * Events pertaining to whether primary authentication (pin/pattern/password input) is required
+ * for device entry.
+ */
+ @VisibleForTesting
+ enum class PrimaryAuthRequiredEvent(private val mId: Int) : UiEventLogger.UiEventEnum {
+ @UiEvent(doc = "Fingerprint cannot be used to authenticate for device entry. This" +
+ "can persist until the next primary auth or may timeout.")
+ PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT(924),
+
+ @UiEvent(doc = "Fingerprint can be used to authenticate for device entry.")
+ PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET(925),
+
+ @UiEvent(doc = "Face cannot be used to authenticate for device entry.")
+ PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT(926),
+
+ @UiEvent(doc = "Face can be used to authenticate for device entry.")
+ PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET(927),
+
+ @UiEvent(doc = "Device is encrypted (ie: after reboot) or device is locked down by DPM " +
+ "or a manual user lockdown.")
+ PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN(928),
+
+ @UiEvent(doc = "Primary authentication is required because it hasn't been used for a " +
+ "time required by a device admin or because primary auth hasn't been used for a " +
+ "time after a non-strong biometric (weak or convenience) is used to unlock the " +
+ "device.")
+ PRIMARY_AUTH_REQUIRED_TIMEOUT(929),
+
+ @UiEvent(doc = "Strong authentication is required to prepare for unattended upgrade.")
+ PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE(931);
+
+ override fun getId(): Int {
+ return mId
+ }
+ }
+
+ companion object {
+ private fun containsFlag(strongAuthFlags: Int, flagCheck: Int): Boolean {
+ return strongAuthFlags and flagCheck != 0
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index b5ea498..3fab724 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -616,9 +616,13 @@
final View view = getChildAt(i);
if (view.getVisibility() != GONE) {
int updatedWidthMeasureSpec = mViewMode.getChildWidthMeasureSpec(widthMeasureSpec);
+ final LayoutParams lp = (LayoutParams) view.getLayoutParams();
+
+ // When using EXACTLY spec, measure will use the layout width if > 0. Set before
+ // measuring the child
+ lp.width = MeasureSpec.getSize(updatedWidthMeasureSpec);
measureChildWithMargins(view, updatedWidthMeasureSpec, 0, heightMeasureSpec, 0);
- final LayoutParams lp = (LayoutParams) view.getLayoutParams();
maxWidth = Math.max(maxWidth,
view.getMeasuredWidth() + lp.leftMargin + lp.rightMargin);
maxHeight = Math.max(maxHeight,
@@ -969,7 +973,7 @@
public int getChildWidthMeasureSpec(int parentWidthMeasureSpec) {
return MeasureSpec.makeMeasureSpec(
MeasureSpec.getSize(parentWidthMeasureSpec) / 2,
- MeasureSpec.getMode(parentWidthMeasureSpec));
+ MeasureSpec.EXACTLY);
}
@Override
@@ -1026,7 +1030,7 @@
public int getChildWidthMeasureSpec(int parentWidthMeasureSpec) {
return MeasureSpec.makeMeasureSpec(
MeasureSpec.getSize(parentWidthMeasureSpec) / 2,
- MeasureSpec.getMode(parentWidthMeasureSpec));
+ MeasureSpec.EXACTLY);
}
private void updateSecurityViewGravity() {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
index 2fb2211..49a8022 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainerController.java
@@ -51,6 +51,8 @@
import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingCollector;
+import com.android.systemui.flags.FeatureFlags;
+import com.android.systemui.flags.Flags;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -83,6 +85,7 @@
private final FalsingManager mFalsingManager;
private final UserSwitcherController mUserSwitcherController;
private final GlobalSettings mGlobalSettings;
+ private final FeatureFlags mFeatureFlags;
private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED;
@@ -238,6 +241,7 @@
FalsingCollector falsingCollector,
FalsingManager falsingManager,
UserSwitcherController userSwitcherController,
+ FeatureFlags featureFlags,
GlobalSettings globalSettings) {
super(view);
mLockPatternUtils = lockPatternUtils;
@@ -255,6 +259,7 @@
mFalsingCollector = falsingCollector;
mFalsingManager = falsingManager;
mUserSwitcherController = userSwitcherController;
+ mFeatureFlags = featureFlags;
mGlobalSettings = globalSettings;
}
@@ -510,7 +515,7 @@
}
private boolean canDisplayUserSwitcher() {
- return getResources().getBoolean(R.bool.bouncer_display_user_switcher);
+ return mFeatureFlags.isEnabled(Flags.BOUNCER_USER_SWITCHER);
}
private void configureMode() {
@@ -615,6 +620,7 @@
private final FalsingCollector mFalsingCollector;
private final FalsingManager mFalsingManager;
private final GlobalSettings mGlobalSettings;
+ private final FeatureFlags mFeatureFlags;
private final UserSwitcherController mUserSwitcherController;
@Inject
@@ -632,6 +638,7 @@
FalsingCollector falsingCollector,
FalsingManager falsingManager,
UserSwitcherController userSwitcherController,
+ FeatureFlags featureFlags,
GlobalSettings globalSettings) {
mView = view;
mAdminSecondaryLockScreenControllerFactory = adminSecondaryLockScreenControllerFactory;
@@ -645,6 +652,7 @@
mConfigurationController = configurationController;
mFalsingCollector = falsingCollector;
mFalsingManager = falsingManager;
+ mFeatureFlags = featureFlags;
mGlobalSettings = globalSettings;
mUserSwitcherController = userSwitcherController;
}
@@ -656,8 +664,7 @@
mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger,
mKeyguardStateController, securityCallback, mSecurityViewFlipperController,
mConfigurationController, mFalsingCollector, mFalsingManager,
- mUserSwitcherController, mGlobalSettings);
+ mUserSwitcherController, mFeatureFlags, mGlobalSettings);
}
-
}
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 98721fd..042d945 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -183,7 +183,6 @@
private static final int MSG_USER_STOPPED = 340;
private static final int MSG_USER_REMOVED = 341;
private static final int MSG_KEYGUARD_GOING_AWAY = 342;
- private static final int MSG_LOCK_SCREEN_MODE = 343;
private static final int MSG_TIME_FORMAT_UPDATE = 344;
private static final int MSG_REQUIRE_NFC_UNLOCK = 345;
@@ -221,7 +220,6 @@
private static final int BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED = -1;
public static final int BIOMETRIC_HELP_FACE_NOT_RECOGNIZED = -2;
- private static final int DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT = 5000000;
/**
* If no cancel signal has been received after this amount of time, set the biometric running
* state to stopped to allow Keyguard to retry authentication.
@@ -231,7 +229,6 @@
private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName(
"com.android.settings", "com.android.settings.FallbackHome");
-
/**
* If true, the system is in the half-boot-to-decryption-screen state.
* Prudently disable lockscreen.
@@ -1250,7 +1247,11 @@
STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN);
}
- private boolean isEncryptedOrLockdown(int userId) {
+ /**
+ * Returns true if primary authentication is required for the given user due to lockdown
+ * or encryption after reboot.
+ */
+ public boolean isEncryptedOrLockdown(int userId) {
final int strongAuth = mStrongAuthTracker.getStrongAuthForUser(userId);
final boolean isLockDown =
containsFlag(strongAuth, STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW)
@@ -2514,6 +2515,10 @@
return mFingerprintLockedOut || mFingerprintLockedOutPermanent;
}
+ public boolean isFaceLockedOut() {
+ return mFaceLockedOutPermanent;
+ }
+
/**
* If biometrics hardware is available, not disabled, and user has enrolled templates.
* This does NOT check if the device is encrypted or in lockdown.
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index fd7ae32..d208441 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -53,6 +53,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.LatencyTracker;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeReceiver;
@@ -130,6 +131,7 @@
// Currently the UdfpsController supports a single UDFPS sensor. If devices have multiple
// sensors, this, in addition to a lot of the code here, will be updated.
@VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps;
+ @NonNull private final ActivityLaunchAnimator mActivityLaunchAnimator;
// Tracks the velocity of a touch to help filter out the touches that move too fast.
@Nullable private VelocityTracker mVelocityTracker;
@@ -198,7 +200,8 @@
mLockscreenShadeTransitionController, mConfigurationController,
mSystemClock, mKeyguardStateController,
mUnlockedScreenOffAnimationController, mSensorProps, mHbmProvider,
- reason, callback, UdfpsController.this::onTouch)));
+ reason, callback, UdfpsController.this::onTouch,
+ mActivityLaunchAnimator)));
}
@Override
@@ -487,7 +490,8 @@
@NonNull SystemClock systemClock,
@NonNull UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
@NonNull SystemUIDialogManager dialogManager,
- @NonNull LatencyTracker latencyTracker) {
+ @NonNull LatencyTracker latencyTracker,
+ @NonNull ActivityLaunchAnimator activityLaunchAnimator) {
mContext = context;
mExecution = execution;
mVibrator = vibrator;
@@ -516,6 +520,7 @@
mSystemClock = systemClock;
mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
mLatencyTracker = latencyTracker;
+ mActivityLaunchAnimator = activityLaunchAnimator;
mSensorProps = findFirstUdfps();
// At least one UDFPS sensor exists
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
index e091250..590963b 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
@@ -41,6 +41,7 @@
import androidx.annotation.LayoutRes
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.R
+import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.LockscreenShadeTransitionController
@@ -81,7 +82,8 @@
private var hbmProvider: UdfpsHbmProvider,
@ShowReason val requestReason: Int,
private val controllerCallback: IUdfpsOverlayControllerCallback,
- private val onTouch: (View, MotionEvent, Boolean) -> Boolean
+ private val onTouch: (View, MotionEvent, Boolean) -> Boolean,
+ private val activityLaunchAnimator: ActivityLaunchAnimator
) {
/** The view, when [isShowing], or null. */
var overlayView: UdfpsView? = null
@@ -200,7 +202,8 @@
keyguardStateController,
unlockedScreenOffAnimationController,
dialogManager,
- controller
+ controller,
+ activityLaunchAnimator
)
}
BiometricOverlayConstants.REASON_AUTH_BP -> {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
index d90a746..8b7aa09 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java
@@ -25,6 +25,7 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
@@ -55,6 +56,7 @@
@NonNull private final UdfpsController mUdfpsController;
@NonNull private final UnlockedScreenOffAnimationController
mUnlockedScreenOffAnimationController;
+ @NonNull private final ActivityLaunchAnimator mActivityLaunchAnimator;
private boolean mShowingUdfpsBouncer;
private boolean mUdfpsRequested;
@@ -66,6 +68,8 @@
private long mLastUdfpsBouncerShowTime = -1;
private float mStatusBarExpansion;
private boolean mLaunchTransitionFadingAway;
+ private boolean mIsLaunchingActivity;
+ private float mActivityLaunchProgress;
/**
* hidden amount of pin/pattern/password bouncer
@@ -88,7 +92,8 @@
@NonNull KeyguardStateController keyguardStateController,
@NonNull UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
@NonNull SystemUIDialogManager systemUIDialogManager,
- @NonNull UdfpsController udfpsController) {
+ @NonNull UdfpsController udfpsController,
+ @NonNull ActivityLaunchAnimator activityLaunchAnimator) {
super(view, statusBarStateController, panelExpansionStateManager, systemUIDialogManager,
dumpManager);
mKeyguardViewManager = statusBarKeyguardViewManager;
@@ -99,6 +104,7 @@
mKeyguardStateController = keyguardStateController;
mUdfpsController = udfpsController;
mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
+ mActivityLaunchAnimator = activityLaunchAnimator;
}
@Override
@@ -136,6 +142,7 @@
mKeyguardViewManager.setAlternateAuthInterceptor(mAlternateAuthInterceptor);
mLockScreenShadeTransitionController.setUdfpsKeyguardViewController(this);
mUnlockedScreenOffAnimationController.addCallback(mUnlockedScreenOffCallback);
+ mActivityLaunchAnimator.addListener(mActivityLaunchAnimatorListener);
}
@Override
@@ -153,6 +160,7 @@
mLockScreenShadeTransitionController.setUdfpsKeyguardViewController(null);
}
mUnlockedScreenOffAnimationController.removeCallback(mUnlockedScreenOffCallback);
+ mActivityLaunchAnimator.removeListener(mActivityLaunchAnimatorListener);
}
@Override
@@ -294,6 +302,12 @@
0f, 255f);
if (!mShowingUdfpsBouncer) {
alpha *= (1.0f - mTransitionToFullShadeProgress);
+
+ // Fade out the icon if we are animating an activity launch over the lockscreen and the
+ // activity didn't request the UDFPS.
+ if (mIsLaunchingActivity && !mUdfpsRequested) {
+ alpha *= (1.0f - mActivityLaunchProgress);
+ }
}
mView.setUnpausedAlpha(alpha);
}
@@ -426,4 +440,26 @@
private final UnlockedScreenOffAnimationController.Callback mUnlockedScreenOffCallback =
(linear, eased) -> mStateListener.onDozeAmountChanged(linear, eased);
+
+ private final ActivityLaunchAnimator.Listener mActivityLaunchAnimatorListener =
+ new ActivityLaunchAnimator.Listener() {
+ @Override
+ public void onLaunchAnimationStart() {
+ mIsLaunchingActivity = true;
+ mActivityLaunchProgress = 0f;
+ updateAlpha();
+ }
+
+ @Override
+ public void onLaunchAnimationEnd() {
+ mIsLaunchingActivity = false;
+ updateAlpha();
+ }
+
+ @Override
+ public void onLaunchAnimationProgress(float linearProgress) {
+ mActivityLaunchProgress = linearProgress;
+ updateAlpha();
+ }
+ };
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
index 9dddbb1..c0da57f 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java
@@ -16,6 +16,7 @@
package com.android.systemui.dagger;
+import com.android.keyguard.KeyguardBiometricLockoutLogger;
import com.android.systemui.CoreStartable;
import com.android.systemui.LatencyTester;
import com.android.systemui.ScreenDecorations;
@@ -90,6 +91,13 @@
@ClassKey(KeyguardViewMediator.class)
public abstract CoreStartable bindKeyguardViewMediator(KeyguardViewMediator sysui);
+ /** Inject into KeyguardBiometricLockoutLogger. */
+ @Binds
+ @IntoMap
+ @ClassKey(KeyguardBiometricLockoutLogger.class)
+ public abstract CoreStartable bindKeyguardBiometricLockoutLogger(
+ KeyguardBiometricLockoutLogger sysui);
+
/** Inject into LatencyTests. */
@Binds
@IntoMap
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index c4a58db..9bc3f17 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -59,6 +59,7 @@
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
import com.android.systemui.statusbar.notification.people.PeopleHubModule;
@@ -208,6 +209,7 @@
NotificationInterruptStateProvider interruptionStateProvider,
ZenModeController zenModeController, NotificationLockscreenUserManager notifUserManager,
NotificationGroupManagerLegacy groupManager, NotificationEntryManager entryManager,
+ CommonNotifCollection notifCollection,
NotifPipeline notifPipeline, SysUiState sysUiState,
NotifPipelineFlags notifPipelineFlags, DumpManager dumpManager,
@Main Executor sysuiMainExecutor) {
@@ -216,7 +218,7 @@
configurationController, statusBarService, notificationManager,
visibilityProvider,
interruptionStateProvider, zenModeController, notifUserManager,
- groupManager, entryManager, notifPipeline, sysUiState, notifPipelineFlags,
- dumpManager, sysuiMainExecutor));
+ groupManager, entryManager, notifCollection, notifPipeline, sysUiState,
+ notifPipelineFlags, dumpManager, sysuiMainExecutor));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.java b/packages/SystemUI/src/com/android/systemui/flags/Flags.java
index 726f865..4be819a 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.java
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.java
@@ -57,8 +57,10 @@
/***************************************/
// 200 - keyguard/lockscreen
- public static final BooleanFlag KEYGUARD_LAYOUT =
- new BooleanFlag(200, true);
+
+ // ** Flag retired **
+ // public static final BooleanFlag KEYGUARD_LAYOUT =
+ // new BooleanFlag(200, true);
public static final BooleanFlag LOCKSCREEN_ANIMATIONS =
new BooleanFlag(201, true);
@@ -69,6 +71,9 @@
public static final ResourceBooleanFlag CHARGING_RIPPLE =
new ResourceBooleanFlag(203, R.bool.flag_charging_ripple);
+ public static final ResourceBooleanFlag BOUNCER_USER_SWITCHER =
+ new ResourceBooleanFlag(204, R.bool.config_enableBouncerUserSwitcher);
+
/***************************************/
// 300 - power menu
public static final BooleanFlag POWER_MENU_LITE =
@@ -123,7 +128,8 @@
/***************************************/
// 900 - media
public static final BooleanFlag MEDIA_TAP_TO_TRANSFER = new BooleanFlag(900, false);
- public static final BooleanFlag MEDIA_SESSION_ACTIONS = new BooleanFlag(901, false);
+ public static final BooleanFlag MEDIA_SESSION_ACTIONS = new BooleanFlag(901, true);
+ public static final BooleanFlag MEDIA_SESSION_LAYOUT = new BooleanFlag(902, false);
// Pay no attention to the reflection behind the curtain.
// ========================== Curtain ==========================
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 4658a74..094b192 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -100,6 +100,7 @@
import com.android.keyguard.ViewMediatorCallback;
import com.android.keyguard.mediator.ScreenOnCoordinator;
import com.android.systemui.CoreStartable;
+import com.android.systemui.DejankUtils;
import com.android.systemui.Dumpable;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.broadcast.BroadcastDispatcher;
@@ -2345,16 +2346,20 @@
// Block the panel from expanding, in case we were doing a swipe to dismiss gesture.
mKeyguardViewControllerLazy.get().blockPanelExpansionFromCurrentTouch();
final boolean wasShowing = mShowing;
- onKeyguardExitFinished();
-
- if (mKeyguardStateController.isDismissingFromSwipe() || wasShowing) {
- mKeyguardUnlockAnimationControllerLazy.get().hideKeyguardViewAfterRemoteAnimation();
- }
-
- finishSurfaceBehindRemoteAnimation(cancelled);
- mSurfaceBehindRemoteAnimationRequested = false;
- mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation();
InteractionJankMonitor.getInstance().end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION);
+
+ // Post layout changes to the next frame, so we don't hang at the end of the animation.
+ DejankUtils.postAfterTraversal(() -> {
+ onKeyguardExitFinished();
+
+ if (mKeyguardStateController.isDismissingFromSwipe() || wasShowing) {
+ mKeyguardUnlockAnimationControllerLazy.get().hideKeyguardViewAfterRemoteAnimation();
+ }
+
+ finishSurfaceBehindRemoteAnimation(cancelled);
+ mSurfaceBehindRemoteAnimationRequested = false;
+ mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation();
+ });
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java
new file mode 100644
index 0000000..08d969b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.log.dagger;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.android.systemui.log.LogBuffer;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+
+import javax.inject.Qualifier;
+
+/** A {@link LogBuffer} for lockscreen to shade transition events. */
+@Qualifier
+@Documented
+@Retention(RUNTIME)
+public @interface LSShadeTransitionLog {
+}
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
index 1f953d7..b323586 100644
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
@@ -61,6 +61,14 @@
return factory.create("NotifHeadsUpLog", 1000);
}
+ /** Provides a logging buffer for all logs for lockscreen to shade transition events. */
+ @Provides
+ @SysUISingleton
+ @LSShadeTransitionLog
+ public static LogBuffer provideLSShadeTransitionControllerBuffer(LogBufferFactory factory) {
+ return factory.create("LSShadeTransitionLog", 50);
+ }
+
/** Provides a logging buffer for all logs related to managing notification sections. */
@Provides
@SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/media/KeyguardMediaController.kt b/packages/SystemUI/src/com/android/systemui/media/KeyguardMediaController.kt
index 5ff624d..44727f2 100644
--- a/packages/SystemUI/src/com/android/systemui/media/KeyguardMediaController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/KeyguardMediaController.kt
@@ -27,7 +27,7 @@
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
-import com.android.systemui.statusbar.notification.stack.MediaHeaderView
+import com.android.systemui.statusbar.notification.stack.MediaContainerView
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.Utils
@@ -96,14 +96,14 @@
/**
* single pane media container placed at the top of the notifications list
*/
- var singlePaneContainer: MediaHeaderView? = null
+ var singlePaneContainer: MediaContainerView? = null
private set
private var splitShadeContainer: ViewGroup? = null
/**
* Attaches media container in single pane mode, situated at the top of the notifications list
*/
- fun attachSinglePaneContainer(mediaView: MediaHeaderView?) {
+ fun attachSinglePaneContainer(mediaView: MediaContainerView?) {
val needsListener = singlePaneContainer == null
singlePaneContainer = mediaView
if (needsListener) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
index ce3b443..c404f7a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt
@@ -418,7 +418,7 @@
.elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
if (existingPlayer == null) {
var newPlayer = mediaControlPanelFactory.get()
- if (mediaFlags.areMediaSessionActionsEnabled()) {
+ if (mediaFlags.useMediaSessionLayout()) {
newPlayer.attachPlayer(
PlayerSessionViewHolder.create(LayoutInflater.from(context), mediaContent),
MediaViewController.TYPE.PLAYER_SESSION)
@@ -865,6 +865,10 @@
println("playerKeys: ${MediaPlayerData.playerKeys()}")
println("smartspaceMediaData: ${MediaPlayerData.smartspaceMediaData}")
println("shouldPrioritizeSs: ${MediaPlayerData.shouldPrioritizeSs}")
+ println("current size: $currentCarouselWidth x $currentCarouselHeight")
+ println("location: $desiredLocation")
+ println("state: ${desiredHostState?.expansion}, " +
+ "only active ${desiredHostState?.showsOnlyActiveMedia}")
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 3c23722..69a7ec3 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -61,6 +61,7 @@
import com.android.systemui.util.time.SystemClock;
import java.net.URISyntaxException;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
@@ -480,6 +481,24 @@
List<MediaAction> actionIcons = data.getActions();
List<Integer> actionsWhenCollapsed = data.getActionsToShowInCompact();
+ // If the session actions flag is enabled, but we're still using the regular layout, use
+ // the session actions anyways
+ if (mMediaFlags.areMediaSessionActionsEnabled() && data.getSemanticActions() != null) {
+ MediaButton semanticActions = data.getSemanticActions();
+
+ actionIcons = new ArrayList<MediaAction>();
+ actionIcons.add(semanticActions.getStartCustom());
+ actionIcons.add(semanticActions.getPrevOrCustom());
+ actionIcons.add(semanticActions.getPlayOrPause());
+ actionIcons.add(semanticActions.getNextOrCustom());
+ actionIcons.add(semanticActions.getEndCustom());
+
+ actionsWhenCollapsed = new ArrayList<Integer>();
+ actionsWhenCollapsed.add(1);
+ actionsWhenCollapsed.add(2);
+ actionsWhenCollapsed.add(3);
+ }
+
int i = 0;
for (; i < actionIcons.size() && i < ACTION_IDS.length; i++) {
int actionId = ACTION_IDS[i];
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt b/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
index b4a4b42..b9795f1 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaFlags.kt
@@ -29,4 +29,12 @@
fun areMediaSessionActionsEnabled(): Boolean {
return featureFlags.isEnabled(Flags.MEDIA_SESSION_ACTIONS)
}
+
+ /**
+ * Check whether media controls should use the new session-based layout
+ */
+ fun useMediaSessionLayout(): Boolean {
+ return featureFlags.isEnabled(Flags.MEDIA_SESSION_ACTIONS) &&
+ featureFlags.isEnabled(Flags.MEDIA_SESSION_LAYOUT)
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 9c4227e..d190dcb 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -227,6 +227,7 @@
private @Behavior int mBehavior;
private boolean mTransientShown;
+ private boolean mTransientShownFromGestureOnSystemBar;
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
private LightBarController mLightBarController;
private final LightBarController mMainLightBarController;
@@ -871,6 +872,9 @@
+ windowStateToString(mNavigationBarWindowState));
pw.println(" mNavigationBarMode="
+ BarTransitions.modeToString(mNavigationBarMode));
+ pw.println(" mTransientShown=" + mTransientShown);
+ pw.println(" mTransientShownFromGestureOnSystemBar="
+ + mTransientShownFromGestureOnSystemBar);
dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions());
mNavigationBarView.dump(pw);
}
@@ -989,7 +993,8 @@
}
@Override
- public void showTransient(int displayId, @InternalInsetsType int[] types) {
+ public void showTransient(int displayId, @InternalInsetsType int[] types,
+ boolean isGestureOnSystemBar) {
if (displayId != mDisplayId) {
return;
}
@@ -998,6 +1003,7 @@
}
if (!mTransientShown) {
mTransientShown = true;
+ mTransientShownFromGestureOnSystemBar = isGestureOnSystemBar;
handleTransientChanged();
}
}
@@ -1016,12 +1022,14 @@
private void clearTransient() {
if (mTransientShown) {
mTransientShown = false;
+ mTransientShownFromGestureOnSystemBar = false;
handleTransientChanged();
}
}
private void handleTransientChanged() {
- mNavigationBarView.onTransientStateChanged(mTransientShown);
+ mNavigationBarView.onTransientStateChanged(mTransientShown,
+ mTransientShownFromGestureOnSystemBar);
final int barMode = barMode(mTransientShown, mAppearance);
if (updateBarMode(barMode) && mLightBarController != null) {
mLightBarController.onNavigationBarModeChanged(barMode);
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index 7adb7ac..5fbdd88 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -447,12 +447,17 @@
mRegionSamplingHelper.setWindowHasBlurs(hasBlurs);
}
- void onTransientStateChanged(boolean isTransient) {
+ void onTransientStateChanged(boolean isTransient, boolean isGestureOnSystemBar) {
mEdgeBackGestureHandler.onNavBarTransientStateChanged(isTransient);
// The visibility of the navigation bar buttons is dependent on the transient state of
// the navigation bar.
if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) {
+ // Always allow the overlay if in non-gestural nav mode, otherwise, only allow showing
+ // the overlay if the user is swiping directly over a system bar
+ boolean allowNavBarOverlay = !QuickStepContract.isGesturalMode(mNavBarMode)
+ || isGestureOnSystemBar;
+ isTransient = isTransient && allowNavBarOverlay;
mNavBarOverlayController.setButtonState(isTransient, /* force */ false);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
index cabb4b4..002dd10 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
@@ -369,7 +369,7 @@
}
@Override
- public void showTransient(int displayId, int[] types) {
+ public void showTransient(int displayId, int[] types, boolean isGestureOnSystemBar) {
if (displayId != mDisplayId) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/AutoSizingList.java b/packages/SystemUI/src/com/android/systemui/qs/AutoSizingList.java
index 1195184..18d28bf 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/AutoSizingList.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/AutoSizingList.java
@@ -36,6 +36,7 @@
private final int mItemSize;
private final Handler mHandler;
+ @Nullable
private ListAdapter mAdapter;
private int mCount;
private boolean mEnableAutoSizing;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index 6d1f8f7..d20141b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -19,6 +19,7 @@
import android.view.animation.OvershootInterpolator;
import android.widget.Scroller;
+import androidx.annotation.Nullable;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
@@ -51,14 +52,17 @@
private final ArrayList<TileRecord> mTiles = new ArrayList<>();
private final ArrayList<TileLayout> mPages = new ArrayList<>();
+ @Nullable
private PageIndicator mPageIndicator;
private float mPageIndicatorPosition;
+ @Nullable
private PageListener mPageListener;
private boolean mListening;
private Scroller mScroller;
+ @Nullable
private AnimatorSet mBounceAnimatorSet;
private float mLastExpansion;
private boolean mDistributeTiles = false;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index 6c7d6e0..e06b768 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -26,6 +26,8 @@
import android.view.View.OnAttachStateChangeListener;
import android.view.View.OnLayoutChangeListener;
+import androidx.annotation.Nullable;
+
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.qs.QSTile;
@@ -88,6 +90,7 @@
private final View mQSFooterActions;
private final View mQQSFooterActions;
+ @Nullable
private PagedTileLayout mPagedLayout;
private boolean mOnFirstPage = true;
@@ -95,6 +98,7 @@
private final QSExpansionPathInterpolator mQSExpansionPathInterpolator;
// Animator for elements in the first page, including secondary labels and qqs brightness
// slider, as well as animating the alpha of the QS tile layout (as we are tracking QQS tiles)
+ @Nullable
private TouchAnimator mFirstPageAnimator;
// TranslationX animator for QQS/QS tiles
private TouchAnimator mTranslationXAnimator;
@@ -109,13 +113,16 @@
// This animates fading of SecurityFooter and media divider
private TouchAnimator mAllPagesDelayedAnimator;
// Animator for brightness slider(s)
+ @Nullable
private TouchAnimator mBrightnessAnimator;
// Animator for Footer actions in QQS
private TouchAnimator mQQSFooterActionsAnimator;
// Height animator for QQS tiles (height changing from QQS size to QS size)
+ @Nullable
private HeightExpansionAnimator mQQSTileHeightAnimator;
// Height animator for QS tile in first page but not in QQS, to present the illusion that they
// are expanding alongside the QQS tiles
+ @Nullable
private HeightExpansionAnimator mOtherFirstPageTilesHeightAnimator;
// Pair of animators for each non first page. The creation is delayed until the user first
// scrolls to that page, in order to get the proper measures and layout.
@@ -215,7 +222,7 @@
}
@Override
- public void onViewAttachedToWindow(View v) {
+ public void onViewAttachedToWindow(@Nullable View v) {
mTunerService.addTunable(this, ALLOW_FANCY_ANIMATION,
MOVE_FULL_ROWS);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
index d43404b..04e2252 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
@@ -64,15 +64,18 @@
protected TextView mDetailDoneButton;
@VisibleForTesting
QSDetailClipper mClipper;
+ @Nullable
private DetailAdapter mDetailAdapter;
private QSPanelController mQsPanelController;
protected View mQsDetailHeader;
protected TextView mQsDetailHeaderTitle;
private ViewStub mQsDetailHeaderSwitchStub;
+ @Nullable
private Switch mQsDetailHeaderSwitch;
protected ImageView mQsDetailHeaderProgress;
+ @Nullable
protected QSTileHost mHost;
private boolean mScanState;
@@ -87,6 +90,7 @@
private boolean mSwitchState;
private QSFooter mFooter;
+ @Nullable
private QSContainerController mQsContainerController;
public QSDetail(Context context, @Nullable AttributeSet attrs) {
@@ -183,12 +187,14 @@
}
public interface Callback {
- void onShowingDetail(DetailAdapter detail, int x, int y);
+ /** Handle an event of showing detail. */
+ void onShowingDetail(@Nullable DetailAdapter detail, int x, int y);
void onToggleStateChanged(boolean state);
void onScanStateChanged(boolean state);
}
- public void handleShowingDetail(final DetailAdapter adapter, int x, int y,
+ /** Handle an event of showing detail. */
+ public void handleShowingDetail(final @Nullable DetailAdapter adapter, int x, int y,
boolean toggleQs) {
final boolean showingDetail = adapter != null;
final boolean wasShowingDetail = mDetailAdapter != null;
@@ -378,7 +384,8 @@
}
@Override
- public void onShowingDetail(final DetailAdapter detail, final int x, final int y) {
+ public void onShowingDetail(
+ final @Nullable DetailAdapter detail, final int x, final int y) {
post(new Runnable() {
@Override
public void run() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java
index 63cedd0..43136d3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java
@@ -23,12 +23,15 @@
import android.view.View;
import android.view.ViewAnimationUtils;
+import androidx.annotation.Nullable;
+
/** Helper for quick settings detail panel clip animations. **/
public class QSDetailClipper {
private final View mDetail;
private final TransitionDrawable mBackground;
+ @Nullable
private Animator mAnimator;
public QSDetailClipper(View detail) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetailDisplayer.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetailDisplayer.java
index b50af00..afd4f0f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetailDisplayer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetailDisplayer.java
@@ -16,6 +16,8 @@
package com.android.systemui.qs;
+import androidx.annotation.Nullable;
+
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.qs.DetailAdapter;
@@ -26,13 +28,14 @@
*/
@SysUISingleton
public class QSDetailDisplayer {
+ @Nullable
private QSPanelController mQsPanelController;
@Inject
public QSDetailDisplayer() {
}
- public void setQsPanelController(QSPanelController qsPanelController) {
+ public void setQsPanelController(@Nullable QSPanelController qsPanelController) {
mQsPanelController = qsPanelController;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java
index e93c349..eb3247b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetailItems.java
@@ -33,6 +33,8 @@
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.annotation.Nullable;
+
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
import com.android.systemui.plugins.qs.QSTile;
@@ -50,6 +52,7 @@
private final Adapter mAdapter = new Adapter();
private String mTag;
+ @Nullable
private Callback mCallback;
private boolean mItemsVisible = true;
private AutoSizingList mItemList;
@@ -130,7 +133,8 @@
mHandler.obtainMessage(H.SET_CALLBACK, callback).sendToTarget();
}
- public void setItems(Item[] items) {
+ /** Set items. */
+ public void setItems(@Nullable Item[] items) {
mHandler.removeMessages(H.SET_ITEMS);
mHandler.obtainMessage(H.SET_ITEMS, items).sendToTarget();
}
@@ -266,9 +270,12 @@
}
public int iconResId;
+ @Nullable
public QSTile.Icon icon;
+ @Nullable
public Drawable overlay;
public CharSequence line1;
+ @Nullable
public CharSequence line2;
public Object tag;
public boolean canDisconnect;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
index 4d23958..066a286 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
@@ -48,6 +48,7 @@
private TextView mBuildText;
private View mActionsContainer;
+ @Nullable
protected TouchAnimator mFooterAnimator;
private boolean mQsDisabled;
@@ -56,6 +57,7 @@
private boolean mShouldShowBuildText;
+ @Nullable
private OnClickListener mExpandClickListener;
private final ContentObserver mDeveloperSettingsObserver = new ContentObserver(
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index bb8a1e8..41dced6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -117,6 +117,7 @@
private QSPanelController mQSPanelController;
private QuickQSPanelController mQuickQSPanelController;
private QSCustomizerController mQSCustomizerController;
+ @Nullable
private ScrollListener mScrollListener;
/**
* When true, QS will translate from outside the screen. It will be clipped with parallax
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
index ff9790c..d4d6da8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java
@@ -401,6 +401,9 @@
pw.print(" "); pw.println(record.tileView.toString());
}
}
+ if (mMediaHost != null) {
+ pw.println(" media bounds: " + mMediaHost.getCurrentBounds());
+ }
}
public QSPanel.QSTileLayout getTileLayout() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
index 7f19d0e..878f753 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java
@@ -48,6 +48,7 @@
import android.widget.ImageView;
import android.widget.TextView;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
@@ -85,8 +86,10 @@
protected H mHandler;
private boolean mIsVisible;
+ @Nullable
private CharSequence mFooterTextContent = null;
private int mFooterIconId;
+ @Nullable
private Drawable mPrimaryFooterIconDrawable;
@Inject
@@ -240,6 +243,7 @@
mMainHandler.post(mUpdateDisplayState);
}
+ @Nullable
protected CharSequence getFooterText(boolean isDeviceManaged, boolean hasWorkProfile,
boolean hasCACerts, boolean hasCACertsInWorkProfile, boolean isNetworkLoggingEnabled,
String vpnName, String vpnNameWorkProfile, CharSequence organizationName,
@@ -497,6 +501,7 @@
return mContext.getString(R.string.ok);
}
+ @Nullable
private String getNegativeButton() {
if (mSecurityController.isParentalControlsEnabled()) {
return mContext.getString(R.string.monitoring_button_view_controls);
@@ -504,6 +509,7 @@
return null;
}
+ @Nullable
protected CharSequence getManagementMessage(boolean isDeviceManaged,
CharSequence organizationName) {
if (!isDeviceManaged) {
@@ -521,6 +527,7 @@
return mContext.getString(R.string.monitoring_description_management);
}
+ @Nullable
protected CharSequence getCaCertsMessage(boolean isDeviceManaged, boolean hasCACerts,
boolean hasCACertsInWorkProfile) {
if (!(hasCACerts || hasCACertsInWorkProfile)) return null;
@@ -534,6 +541,7 @@
return mContext.getString(R.string.monitoring_description_ca_certificate);
}
+ @Nullable
protected CharSequence getNetworkLoggingMessage(boolean isDeviceManaged,
boolean isNetworkLoggingEnabled) {
if (!isNetworkLoggingEnabled) return null;
@@ -545,6 +553,7 @@
}
}
+ @Nullable
protected CharSequence getVpnMessage(boolean isDeviceManaged, boolean hasWorkProfile,
String vpnName, String vpnNameWorkProfile) {
if (vpnName == null && vpnNameWorkProfile == null) return null;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index 1030c21..cca4913 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -29,6 +29,8 @@
import android.util.ArraySet;
import android.util.Log;
+import androidx.annotation.Nullable;
+
import com.android.internal.logging.InstanceId;
import com.android.internal.logging.InstanceIdSequence;
import com.android.internal.logging.UiEventLogger;
@@ -98,6 +100,7 @@
private final CustomTileStatePersister mCustomTileStatePersister;
private final List<Callback> mCallbacks = new ArrayList<>();
+ @Nullable
private AutoTileManager mAutoTiles;
private final StatusBarIconController mIconController;
private final ArrayList<QSFactory> mQsFactories = new ArrayList<>();
@@ -472,6 +475,8 @@
saveTilesToSettings(newTiles);
}
+ /** Create a {@link QSTile} of a {@code tileSpec} type. */
+ @Nullable
public QSTile createTile(String tileSpec) {
for (int i = 0; i < mQsFactories.size(); i++) {
QSTile t = mQsFactories.get(i).createTile(tileSpec);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index 8b94983..866b1b8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -33,6 +33,7 @@
import android.widget.Space;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.android.internal.policy.SystemBarUtils;
import com.android.settingslib.Utils;
@@ -44,7 +45,6 @@
import com.android.systemui.statusbar.phone.StatusIconContainer;
import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.policy.VariableDateView;
-import com.android.systemui.statusbar.window.StatusBarWindowView;
import java.util.List;
@@ -57,8 +57,11 @@
private boolean mExpanded;
private boolean mQsDisabled;
+ @Nullable
private TouchAnimator mAlphaAnimator;
+ @Nullable
private TouchAnimator mTranslationAnimator;
+ @Nullable
private TouchAnimator mIconsAlphaAnimator;
private TouchAnimator mIconsAlphaAnimatorFixed;
@@ -85,7 +88,9 @@
private StatusIconContainer mIconContainer;
private View mPrivacyChip;
+ @Nullable
private TintedIconManager mTintedIconManager;
+ @Nullable
private QSExpansionPathInterpolator mQSExpansionPathInterpolator;
private StatusBarContentInsetsProvider mInsetsProvider;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/QuickTileLayout.java
index bb2340c..130bcab 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickTileLayout.java
@@ -7,13 +7,15 @@
import android.view.ViewGroup;
import android.widget.LinearLayout;
+import androidx.annotation.Nullable;
+
public class QuickTileLayout extends LinearLayout {
public QuickTileLayout(Context context) {
this(context, null);
}
- public QuickTileLayout(Context context, AttributeSet attrs) {
+ public QuickTileLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setGravity(Gravity.CENTER);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java
index a9b2376..9011853 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/SlashDrawable.java
@@ -60,7 +60,9 @@
private final RectF mSlashRect = new RectF(0, 0, 0, 0);
private float mRotation;
private boolean mSlashed;
+ @Nullable
private Mode mTintMode;
+ @Nullable
private ColorStateList mTintList;
private boolean mAnimationEnabled = true;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
index bff318a..da82d2c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
@@ -9,6 +9,8 @@
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.Nullable;
+
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.R;
import com.android.systemui.qs.QSPanel.QSTileLayout;
@@ -49,7 +51,7 @@
this(context, null);
}
- public TileLayout(Context context, AttributeSet attrs) {
+ public TileLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setFocusableInTouchMode(true);
mLessRows = ((Settings.System.getInt(context.getContentResolver(), "qs_less_rows", 0) != 0)
@@ -67,7 +69,7 @@
}
@Override
- public void setListening(boolean listening, UiEventLogger uiEventLogger) {
+ public void setListening(boolean listening, @Nullable UiEventLogger uiEventLogger) {
if (mListening == listening) return;
mListening = listening;
for (TileRecord record : mRecords) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
index ca8f681..bc62416 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
@@ -20,6 +20,8 @@
import android.view.View;
import android.view.animation.Interpolator;
+import androidx.annotation.Nullable;
+
import java.util.ArrayList;
import java.util.List;
@@ -37,12 +39,19 @@
private final float mStartDelay;
private final float mEndDelay;
private final float mSpan;
+ @Nullable
private final Interpolator mInterpolator;
+ @Nullable
private final Listener mListener;
private float mLastT = -1;
- private TouchAnimator(Object[] targets, KeyframeSet[] keyframeSets,
- float startDelay, float endDelay, Interpolator interpolator, Listener listener) {
+ private TouchAnimator(
+ Object[] targets,
+ KeyframeSet[] keyframeSets,
+ float startDelay,
+ float endDelay,
+ @Nullable Interpolator interpolator,
+ @Nullable Listener listener) {
mTargets = targets;
mKeyframeSets = keyframeSets;
mStartDelay = startDelay;
@@ -126,7 +135,9 @@
private float mStartDelay;
private float mEndDelay;
+ @Nullable
private Interpolator mInterpolator;
+ @Nullable
private Listener mListener;
public Builder addFloat(Object target, String property, float... values) {
@@ -183,7 +194,8 @@
return this;
}
- public Builder setInterpolator(Interpolator intepolator) {
+ /** Sets interpolator. */
+ public Builder setInterpolator(@Nullable Interpolator intepolator) {
mInterpolator = intepolator;
return this;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java
index 32ac733..2959c3b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java
@@ -25,6 +25,7 @@
import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.settingslib.Utils;
@@ -40,6 +41,7 @@
private ImageView mMobileSignal;
private ImageView mMobileRoaming;
private View mSpacer;
+ @Nullable
private CellSignalState mLastSignalState;
private boolean mProviderModelInitialized = false;
private boolean mIsSingleCarrier;
@@ -125,7 +127,7 @@
return true;
}
- private boolean hasValidTypeContentDescription(String typeContentDescription) {
+ private boolean hasValidTypeContentDescription(@Nullable String typeContentDescription) {
return TextUtils.equals(typeContentDescription,
mContext.getString(R.string.data_connection_no_internet))
|| TextUtils.equals(typeContentDescription,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index 9ebdb1c..b59c0cc 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -28,6 +28,7 @@
import android.widget.LinearLayout;
import android.widget.Toolbar;
+import androidx.annotation.Nullable;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.RecyclerView;
@@ -107,7 +108,7 @@
mQsContainerController = controller;
}
- public void setQs(QS qs) {
+ public void setQs(@Nullable QS qs) {
mQs = qs;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
index 618a429..9739011 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java
@@ -28,6 +28,7 @@
import android.widget.Toolbar;
import android.widget.Toolbar.OnMenuItemClickListener;
+import androidx.annotation.Nullable;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -198,7 +199,7 @@
}
/** */
- public void setQs(QSFragment qsFragment) {
+ public void setQs(@Nullable QSFragment qsFragment) {
mView.setQs(qsFragment);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
index eae2565..b29687f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
@@ -31,6 +31,8 @@
import android.util.ArraySet;
import android.widget.Button;
+import androidx.annotation.Nullable;
+
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
@@ -79,7 +81,7 @@
mUserTracker = userTracker;
}
- public void setListener(TileStateListener listener) {
+ public void setListener(@Nullable TileStateListener listener) {
mListener = listener;
}
@@ -269,6 +271,7 @@
});
}
+ @Nullable
private State getState(Collection<QSTile> tiles, String spec) {
for (QSTile tile : tiles) {
if (spec.equals(tile.getTileSpec())) {
@@ -278,7 +281,8 @@
return null;
}
- private void addTile(String spec, CharSequence appLabel, State state, boolean isSystem) {
+ private void addTile(
+ String spec, @Nullable CharSequence appLabel, State state, boolean isSystem) {
if (mSpecs.contains(spec)) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
index 10efec3..4f15351 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -89,7 +89,9 @@
private final TileServiceManager mServiceManager;
private final int mUser;
private final CustomTileStatePersister mCustomTileStatePersister;
+ @Nullable
private android.graphics.drawable.Icon mDefaultIcon;
+ @Nullable
private CharSequence mDefaultLabel;
private final Context mUserContext;
@@ -197,8 +199,8 @@
/**
* Compare two icons, only works for resources.
*/
- private boolean iconEquals(android.graphics.drawable.Icon icon1,
- android.graphics.drawable.Icon icon2) {
+ private boolean iconEquals(@Nullable android.graphics.drawable.Icon icon1,
+ @Nullable android.graphics.drawable.Icon icon2) {
if (icon1 == icon2) {
return true;
}
@@ -372,6 +374,7 @@
Uri.fromParts("package", mComponent.getPackageName(), null));
}
+ @Nullable
private Intent resolveIntent(Intent i) {
ResolveInfo result = mContext.getPackageManager().resolveActivityAsUser(i, 0, mUser);
return result != null ? new Intent(TileService.ACTION_QS_TILE_PREFERENCES)
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
index e6612fe..17ae7ff 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -36,6 +36,7 @@
import android.util.ArraySet;
import android.util.Log;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.systemui.broadcast.BroadcastDispatcher;
@@ -85,6 +86,7 @@
private final BroadcastDispatcher mBroadcastDispatcher;
private Set<Integer> mQueuedMessages = new ArraySet<>();
+ @Nullable
private QSTileServiceWrapper mWrapper;
private boolean mListening;
private IBinder mClickBinder;
@@ -95,6 +97,7 @@
private AtomicBoolean mPackageReceiverRegistered = new AtomicBoolean(false);
private AtomicBoolean mUserReceiverRegistered = new AtomicBoolean(false);
private boolean mUnbindImmediate;
+ @Nullable
private TileChangeListener mChangeListener;
// Return value from bindServiceAsUser, determines whether safe to call unbind.
private boolean mIsBound;
@@ -466,6 +469,7 @@
}
}
+ @Nullable
@Override
public IBinder asBinder() {
return mWrapper != null ? mWrapper.asBinder() : null;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt b/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt
index 11c4949..bd2f64b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileRequestDialog.kt
@@ -59,6 +59,7 @@
R.dimen.qs_tile_service_request_tile_width),
context.resources.getDimensionPixelSize(R.dimen.qs_quick_tile_size)
)
+ isSelected = true
}
val spacing = 0
setView(ll, spacing, spacing, spacing, spacing / 2)
@@ -68,12 +69,17 @@
val tile = QSTileViewImpl(context, QSIconViewImpl(context), true)
val state = QSTile.BooleanState().apply {
label = tileData.label
+ handlesLongClick = false
icon = tileData.icon?.loadDrawable(context)?.let {
QSTileImpl.DrawableIcon(it)
} ?: ResourceIcon.get(R.drawable.android)
}
tile.onStateChanged(state)
- tile.isSelected = true
+ tile.post {
+ tile.stateDescription = ""
+ tile.isClickable = false
+ tile.isSelected = true
+ }
return tile
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index bfa2aaa4..0a3c17c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -35,6 +35,8 @@
import android.util.ArrayMap;
import android.util.Log;
+import androidx.annotation.Nullable;
+
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.Dependency;
import com.android.systemui.broadcast.BroadcastDispatcher;
@@ -297,6 +299,7 @@
}
}
+ @Nullable
@Override
public Tile getTile(IBinder token) {
CustomTile customTile = getTileForToken(token);
@@ -330,12 +333,14 @@
return keyguardStateController.isMethodSecure() && keyguardStateController.isShowing();
}
+ @Nullable
private CustomTile getTileForToken(IBinder token) {
synchronized (mServices) {
return mTokenMap.get(token);
}
}
+ @Nullable
private CustomTile getTileForComponent(ComponentName component) {
synchronized (mServices) {
return mTiles.get(component);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
index 76950d1..5e68f61 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
@@ -18,6 +18,8 @@
import android.os.Build;
import android.util.Log;
+import androidx.annotation.Nullable;
+
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.qs.QSFactory;
import com.android.systemui.plugins.qs.QSIconView;
@@ -173,6 +175,8 @@
mColorCorrectionTileProvider = colorCorrectionTileProvider;
}
+ /** Creates a tile with a type based on {@code tileSpec} */
+ @Nullable
public final QSTile createTile(String tileSpec) {
QSTileImpl tile = createTileInternal(tileSpec);
if (tile != null) {
@@ -182,6 +186,7 @@
return tile;
}
+ @Nullable
protected QSTileImpl createTileInternal(String tileSpec) {
// Stock tiles.
switch (tileSpec) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index b5f07d1..6d9d5b1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -116,6 +116,7 @@
private boolean mAnnounceNextStateChange;
private String mTileSpec;
+ @Nullable
private EnforcedAdmin mEnforcedAdmin;
private boolean mShowingDetail;
private int mIsFullQs;
@@ -260,6 +261,8 @@
return new QSIconViewImpl(context);
}
+ /** Returns corresponding DetailAdapter. */
+ @Nullable
public DetailAdapter getDetailAdapter() {
return null; // optional
}
@@ -342,7 +345,7 @@
refreshState(null);
}
- protected final void refreshState(Object arg) {
+ protected final void refreshState(@Nullable Object arg) {
mHandler.obtainMessage(H.REFRESH_STATE, arg).sendToTarget();
}
@@ -432,9 +435,10 @@
*
* @return the intent to launch
*/
+ @Nullable
public abstract Intent getLongClickIntent();
- protected void handleRefreshState(Object arg) {
+ protected void handleRefreshState(@Nullable Object arg) {
handleUpdateState(mTmpState, arg);
boolean changed = mTmpState.copyTo(mState);
if (mReadyState == READY_STATE_READYING) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
index 72c68ce..f1e82b6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/SlashImageView.java
@@ -27,6 +27,7 @@
public class SlashImageView extends ImageView {
+ @Nullable
@VisibleForTesting
protected SlashDrawable mSlash;
private boolean mAnimationEnabled = true;
@@ -35,6 +36,7 @@
super(context);
}
+ @Nullable
protected SlashDrawable getSlash() {
return mSlash;
}
@@ -52,7 +54,7 @@
}
@Override
- public void setImageDrawable(Drawable drawable) {
+ public void setImageDrawable(@Nullable Drawable drawable) {
if (drawable == null) {
mSlash = null;
super.setImageDrawable(null);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
index 5552105..754f8e2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -320,6 +320,7 @@
// We probably won't ever have space in the UI for more than 20 devices, so don't
// get info for them.
private static final int MAX_DEVICES = 20;
+ @Nullable
private QSDetailItems mItems;
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index e5601f2..698a253 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -257,7 +257,9 @@
private static final class CallbackInfo {
boolean airplaneModeEnabled;
+ @Nullable
CharSequence dataSubscriptionName;
+ @Nullable
CharSequence dataContentDescription;
boolean activityIn;
boolean activityOut;
@@ -320,6 +322,7 @@
return mContext.getString(R.string.quick_settings_cellular_detail_title);
}
+ @Nullable
@Override
public Boolean getToggleState() {
return mDataController.isMobileDataSupported()
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 49c548d..a06dc8b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -360,6 +360,7 @@
private final class DndDetailAdapter implements DetailAdapter, OnAttachStateChangeListener {
+ @Nullable
private ZenModePanel mZenPanel;
private boolean mAuto;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
index cd81b4a..9df942d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
@@ -145,13 +145,15 @@
&& mHost.getUserContext().getUserId() == UserHandle.USER_SYSTEM);
}
- private CharSequence getSecondaryLabel(boolean isTransient, String statusLabel) {
+ @Nullable
+ private CharSequence getSecondaryLabel(boolean isTransient, @Nullable String statusLabel) {
return isTransient
? mContext.getString(R.string.quick_settings_wifi_secondary_label_transient)
: statusLabel;
}
- private static String removeDoubleQuotes(String string) {
+ @Nullable
+ private static String removeDoubleQuotes(@Nullable String string) {
if (string == null) return null;
final int length = string.length();
if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
@@ -163,6 +165,7 @@
private static final class EthernetCallbackInfo {
boolean mConnected;
int mEthernetSignalIconId;
+ @Nullable
String mEthernetContentDescription;
@Override
@@ -180,11 +183,14 @@
boolean mEnabled;
boolean mConnected;
int mWifiSignalIconId;
+ @Nullable
String mSsid;
boolean mActivityIn;
boolean mActivityOut;
+ @Nullable
String mWifiSignalContentDescription;
boolean mIsTransient;
+ @Nullable
public String mStatusLabel;
boolean mNoDefaultNetwork;
boolean mNoValidatedNetwork;
@@ -211,7 +217,9 @@
private static final class CellularCallbackInfo {
boolean mAirplaneModeEnabled;
+ @Nullable
CharSequence mDataSubscriptionName;
+ @Nullable
CharSequence mDataContentDescription;
int mMobileSignalIconId;
int mQsTypeIcon;
@@ -540,7 +548,8 @@
}
}
- private CharSequence appendMobileDataType(CharSequence current, CharSequence dataType) {
+ private CharSequence appendMobileDataType(
+ @Nullable CharSequence current, @Nullable CharSequence dataType) {
if (TextUtils.isEmpty(dataType)) {
return Html.fromHtml((current == null ? "" : current.toString()), 0);
}
@@ -551,6 +560,7 @@
return Html.fromHtml(concat, 0);
}
+ @Nullable
private CharSequence getMobileDataContentName(CellularCallbackInfo cb) {
if (cb.mRoaming && !TextUtils.isEmpty(cb.mDataContentDescription)) {
String roaming = mContext.getString(R.string.data_connection_roaming);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
index 0886b46..a61f0ce 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java
@@ -54,6 +54,7 @@
private static final String NFC = "nfc";
private final Icon mIcon = ResourceIcon.get(R.drawable.ic_qs_nfc);
+ @Nullable
private NfcAdapter mAdapter;
private BroadcastDispatcher mBroadcastDispatcher;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QRCodeScannerTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QRCodeScannerTile.java
index 9996ecd..b658025 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QRCodeScannerTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QRCodeScannerTile.java
@@ -131,6 +131,7 @@
return mQRCodeScannerController.isCameraAvailable();
}
+ @Nullable
@Override
public Intent getLongClickIntent() {
return null;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
index d9919bd..247f02b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java
@@ -72,8 +72,10 @@
private final SecureSettings mSecureSettings;
private final QuickAccessWalletController mController;
+ @Nullable
private WalletCard mSelectedCard;
private boolean mIsWalletUpdating = true;
+ @Nullable
@VisibleForTesting Drawable mCardViewDrawable;
@Inject
@@ -200,6 +202,7 @@
&& mSecureSettings.getString(NFC_PAYMENT_DEFAULT_COMPONENT) != null;
}
+ @Nullable
@Override
public Intent getLongClickIntent() {
return null;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
index 8ff75cb..45e43ee 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java
@@ -136,6 +136,7 @@
return 0;
}
+ @Nullable
@Override
public Intent getLongClickIntent() {
return null;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
index b0a1b18..0be0619 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java
@@ -134,6 +134,7 @@
return new Intent(Settings.ACTION_PRIVACY_SETTINGS);
}
+ @Nullable
@Override
public DetailAdapter getDetailAdapter() {
return super.getDetailAdapter();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java
index 6ca550c..076ef35 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailItemView.java
@@ -28,6 +28,8 @@
import android.widget.LinearLayout;
import android.widget.TextView;
+import androidx.annotation.Nullable;
+
import com.android.internal.util.ArrayUtils;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
@@ -50,15 +52,15 @@
this(context, null);
}
- public UserDetailItemView(Context context, AttributeSet attrs) {
+ public UserDetailItemView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
- public UserDetailItemView(Context context, AttributeSet attrs, int defStyleAttr) {
+ public UserDetailItemView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
- public UserDetailItemView(Context context, AttributeSet attrs, int defStyleAttr,
+ public UserDetailItemView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
index f793a50..ce6aaae 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
@@ -77,6 +77,7 @@
private final Context mContext;
protected UserSwitcherController mController;
+ @Nullable
private View mCurrentUserView;
private final UiEventLogger mUiEventLogger;
private final FalsingManager mFalsingManager;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
index e110a64..db1b6e6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserTile.java
@@ -48,6 +48,7 @@
private final UserSwitcherController mUserSwitcherController;
private final UserInfoController mUserInfoController;
+ @Nullable
private Pair<String, Drawable> mLastUpdate;
@Inject
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 1608248..c82ff34 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -258,6 +258,7 @@
return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI);
}
+ @Nullable
private static String removeDoubleQuotes(String string) {
if (string == null) return null;
final int length = string.length();
@@ -271,11 +272,14 @@
boolean enabled;
boolean connected;
int wifiSignalIconId;
+ @Nullable
String ssid;
boolean activityIn;
boolean activityOut;
+ @Nullable
String wifiSignalContentDescription;
boolean isTransient;
+ @Nullable
public String statusLabel;
@Override
@@ -321,7 +325,9 @@
protected class WifiDetailAdapter implements DetailAdapter,
AccessPointController.AccessPointCallback, QSDetailItems.Callback {
+ @Nullable
private QSDetailItems mItems;
+ @Nullable
private WifiEntry[] mAccessPoints;
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java
index 544246e..4fe155c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java
@@ -52,6 +52,7 @@
private static final String EXTRA_CONNECT_FOR_CALLER = "connect_for_caller";
private final InternetDialogController mInternetDialogController;
+ @Nullable
private List<WifiEntry> mWifiEntries;
@VisibleForTesting
protected int mWifiEntriesCount;
@@ -189,6 +190,7 @@
mWifiSummaryText.setText(summary);
}
+ @Nullable
Drawable getWifiDrawable(int level, boolean hasNoInternet) {
// If the Wi-Fi level is equal to WIFI_LEVEL_UNREACHABLE(-1), then a null drawable
// will be returned.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
index e7982bf..8e01942 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java
@@ -42,7 +42,6 @@
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
-import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
@@ -98,6 +97,7 @@
private InternetDialogFactory mInternetDialogFactory;
private SubscriptionManager mSubscriptionManager;
private TelephonyManager mTelephonyManager;
+ @Nullable
private AlertDialog mAlertDialog;
private UiEventLogger mUiEventLogger;
private Context mContext;
@@ -130,12 +130,14 @@
private Button mDoneButton;
private Button mAirplaneModeButton;
private Drawable mBackgroundOn;
+ @Nullable
private Drawable mBackgroundOff = null;
private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private boolean mCanConfigMobileData;
// Wi-Fi entries
private int mWifiNetworkHeight;
+ @Nullable
@VisibleForTesting
protected WifiEntry mConnectedWifiEntry;
@VisibleForTesting
@@ -536,6 +538,7 @@
return mInternetDialogController.getDialogTitleText();
}
+ @Nullable
CharSequence getSubtitleText() {
return mInternetDialogController.getSubtitleText(
mIsProgressBarVisible && !mIsSearchingHidden);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
index 3189d2f..f89b7a3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java
@@ -303,6 +303,7 @@
return new Intent(ACTION_NETWORK_PROVIDER_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
+ @Nullable
protected Intent getWifiDetailsSettingsIntent(String key) {
if (TextUtils.isEmpty(key)) {
if (DEBUG) {
@@ -320,6 +321,7 @@
return mContext.getText(R.string.quick_settings_internet_label);
}
+ @Nullable
CharSequence getSubtitleText(boolean isProgressBarVisible) {
if (mCanConfigWifi && !mWifiManager.isWifiEnabled()) {
// When Wi-Fi is disabled.
@@ -391,6 +393,7 @@
return null;
}
+ @Nullable
Drawable getInternetWifiDrawable(@NonNull WifiEntry wifiEntry) {
if (wifiEntry.getLevel() == WifiEntry.WIFI_LEVEL_UNREACHABLE) {
return null;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
index f380911..84e21e4 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
@@ -113,7 +113,8 @@
@Override
public IBinder onBind(@NonNull Intent intent) {
- registerReceiver(mCloseSystemDialogs, new IntentFilter(ACTION_CLOSE_SYSTEM_DIALOGS));
+ registerReceiver(mCloseSystemDialogs, new IntentFilter(ACTION_CLOSE_SYSTEM_DIALOGS),
+ Context.RECEIVER_EXPORTED);
final Messenger m = new Messenger(mHandler);
if (DEBUG_SERVICE) {
Log.d(TAG, "onBind: returning connection: " + m);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
index 7cf0583..2a21f42 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AlertingNotificationManager.java
@@ -238,7 +238,7 @@
* @param key the key to check if removable
* @return true if the alert entry can be removed
*/
- protected boolean canRemoveImmediately(String key) {
+ public boolean canRemoveImmediately(String key) {
AlertEntry alertEntry = mAlertEntries.get(key);
return alertEntry == null || alertEntry.wasShownLongEnough()
|| alertEntry.mEntry.isRowDismissed();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 3cecbb7..597e424 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -348,11 +348,19 @@
String packageName) { }
/**
- * @see IStatusBar#showTransient(int, int[]).
+ * @see IStatusBar#showTransient(int, int[], boolean).
*/
default void showTransient(int displayId, @InternalInsetsType int[] types) { }
/**
+ * @see IStatusBar#showTransient(int, int[], boolean).
+ */
+ default void showTransient(int displayId, @InternalInsetsType int[] types,
+ boolean isGestureOnSystemBar) {
+ showTransient(displayId, types);
+ }
+
+ /**
* @see IStatusBar#abortTransient(int, int[]).
*/
default void abortTransient(int displayId, @InternalInsetsType int[] types) { }
@@ -1038,9 +1046,10 @@
}
@Override
- public void showTransient(int displayId, int[] types) {
+ public void showTransient(int displayId, int[] types, boolean isGestureOnSystemBar) {
synchronized (mLock) {
- mHandler.obtainMessage(MSG_SHOW_TRANSIENT, displayId, 0, types).sendToTarget();
+ mHandler.obtainMessage(MSG_SHOW_TRANSIENT, displayId, isGestureOnSystemBar ? 1 : 0,
+ types).sendToTarget();
}
}
@@ -1444,8 +1453,9 @@
case MSG_SHOW_TRANSIENT: {
final int displayId = msg.arg1;
final int[] types = (int[]) msg.obj;
+ final boolean isGestureOnSystemBar = msg.arg2 != 0;
for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).showTransient(displayId, types);
+ mCallbacks.get(i).showTransient(displayId, types, isGestureOnSystemBar);
}
break;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DisableFlagsLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/DisableFlagsLogger.kt
index 4272bb1..66591b3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DisableFlagsLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DisableFlagsLogger.kt
@@ -74,9 +74,12 @@
* Returns a string representing the, old, new, and new-after-modification disable flag states,
* as well as the differences between each of the states.
*
- * Example:
- * Old: EnaiHbcRso.qINgr | New: EnaihBcRso.qiNGR (hB.iGR) | New after local modification:
- * EnaihBcRso.qInGR (.n)
+ * Example if [old], [new], and [newAfterLocalModification] are all different:
+ * Old: EnaiHbcRso.qINgr | New: EnaihBcRso.qiNGR (changed: hB.iGR) | New after local
+ * modification: EnaihBcRso.qInGR (changed: .n)
+ *
+ * Example if [old] and [new] are the same:
+ * EnaihBcRso.qiNGR (unchanged)
*
* A capital character signifies the flag is set and a lowercase character signifies that the
* flag isn't set. The flag states will be logged in the same order as the passed-in lists.
@@ -96,54 +99,51 @@
new: DisableState,
newAfterLocalModification: DisableState? = null
): String {
- val builder = StringBuilder("Received new disable state. ")
+ val builder = StringBuilder("Received new disable state: ")
- old?.let {
+ // This if/else has slightly repetitive code but is easier to read.
+ if (old != null && old != new) {
builder.append("Old: ")
builder.append(getFlagsString(old))
builder.append(" | ")
- }
-
- builder.append("New: ")
- if (old != null && old != new) {
- builder.append(getFlagsStringWithDiff(old, new))
- } else {
+ builder.append("New: ")
builder.append(getFlagsString(new))
+ builder.append(" ")
+ builder.append(getDiffString(old, new))
+ } else if (old != null && old == new) {
+ // If old and new are the same, we only need to print one of them.
+ builder.append(getFlagsString(new))
+ builder.append(" ")
+ builder.append(getDiffString(old, new))
+ } else { // old == null
+ builder.append(getFlagsString(new))
+ // Don't get a diff string because we have no [old] to compare with.
}
if (newAfterLocalModification != null && new != newAfterLocalModification) {
builder.append(" | New after local modification: ")
- builder.append(getFlagsStringWithDiff(new, newAfterLocalModification))
+ builder.append(getFlagsString(newAfterLocalModification))
+ builder.append(" ")
+ builder.append(getDiffString(new, newAfterLocalModification))
}
return builder.toString()
}
/**
- * Returns a string representing [new] state, as well as the difference from [old] to [new]
- * (if there is one).
- */
- private fun getFlagsStringWithDiff(old: DisableState, new: DisableState): String {
- val builder = StringBuilder()
- builder.append(getFlagsString(new))
- builder.append(" ")
- builder.append(getDiffString(old, new))
- return builder.toString()
- }
-
- /**
- * Returns a string representing the difference between [old] and [new], or an empty string if
- * there is no difference.
+ * Returns a string representing the difference between [old] and [new].
*
- * For example, if old was "abc.DE" and new was "aBC.De", the difference returned would be
- * "(BC.e)".
+ * - If [old] was "abc.DE" and [new] was "aBC.De", the difference returned would be
+ * "(changed: BC.e)".
+ * - If [old] and [new] are the same, the difference returned would be "(unchanged)".
*/
private fun getDiffString(old: DisableState, new: DisableState): String {
if (old == new) {
- return ""
+ return "(unchanged)"
}
val builder = StringBuilder("(")
+ builder.append("changed: ")
disable1FlagsList.forEach {
val newSymbol = it.getFlagStatus(new.disable1)
if (it.getFlagStatus(old.disable1) != newSymbol) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 8ce73d7..cd4b745 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -133,7 +133,7 @@
private final DockManager mDockManager;
private final DevicePolicyManager mDevicePolicyManager;
private final UserManager mUserManager;
- private final @Main DelayableExecutor mExecutor;
+ protected final @Main DelayableExecutor mExecutor;
private final LockPatternUtils mLockPatternUtils;
private final IActivityManager mIActivityManager;
private final FalsingManager mFalsingManager;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
index 491a175..648e14c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt
@@ -8,12 +8,13 @@
import android.content.res.Configuration
import android.os.SystemClock
import android.util.DisplayMetrics
+import android.util.IndentingPrintWriter
import android.util.MathUtils
import android.view.MotionEvent
import android.view.View
import android.view.ViewConfiguration
import androidx.annotation.VisibleForTesting
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent
+import com.android.systemui.Dumpable
import com.android.systemui.ExpandHelper
import com.android.systemui.Gefingerpoken
import com.android.systemui.R
@@ -22,23 +23,26 @@
import com.android.systemui.classifier.Classifier
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dump.DumpManager
import com.android.systemui.media.MediaHierarchyManager
import com.android.systemui.plugins.ActivityStarter.OnDismissAction
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.qs.QS
+import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.row.ExpandableView
import com.android.systemui.statusbar.notification.stack.AmbientState
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.statusbar.phone.LockscreenGestureLogger
-import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent
+import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.phone.StatusBar
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.Utils
+import java.io.FileDescriptor
+import java.io.PrintWriter
import javax.inject.Inject
private const val SPRING_BACK_ANIMATION_LENGTH_MS = 375L
@@ -51,19 +55,19 @@
@SysUISingleton
class LockscreenShadeTransitionController @Inject constructor(
private val statusBarStateController: SysuiStatusBarStateController,
- private val lockscreenGestureLogger: LockscreenGestureLogger,
+ private val logger: LSShadeTransitionLogger,
private val keyguardBypassController: KeyguardBypassController,
private val lockScreenUserManager: NotificationLockscreenUserManager,
private val falsingCollector: FalsingCollector,
private val ambientState: AmbientState,
- private val displayMetrics: DisplayMetrics,
private val mediaHierarchyManager: MediaHierarchyManager,
private val scrimController: ScrimController,
private val depthController: NotificationShadeDepthController,
private val context: Context,
configurationController: ConfigurationController,
- falsingManager: FalsingManager
-) {
+ falsingManager: FalsingManager,
+ dumpManager: DumpManager,
+) : Dumpable {
private var pulseHeight: Float = 0f
private var useSplitShade: Boolean = false
private lateinit var nsslController: NotificationStackScrollLayoutController
@@ -139,6 +143,23 @@
touchHelper.updateResources(context)
}
})
+ dumpManager.registerDumpable(this)
+ statusBarStateController.addCallback(object : StatusBarStateController.StateListener {
+ override fun onExpandedChanged(isExpanded: Boolean) {
+ // safeguard: When the panel is fully collapsed, let's make sure to reset.
+ // See b/198098523
+ if (!isExpanded) {
+ if (dragDownAmount != 0f && dragDownAnimator?.isRunning != true) {
+ logger.logDragDownAmountResetWhenFullyCollapsed()
+ dragDownAmount = 0f
+ }
+ if (pulseHeight != 0f && pulseHeightAnimator?.isRunning != true) {
+ logger.logPulseHeightNotResetWhenFullyCollapsed()
+ setPulseHeight(0f, animate = false)
+ }
+ }
+ }
+ })
}
private fun updateResources() {
@@ -182,19 +203,19 @@
*/
internal fun onDraggedDown(startingChild: View?, dragLengthY: Int) {
if (canDragDown()) {
+ val cancelRunnable = Runnable {
+ logger.logGoingToLockedShadeAborted()
+ setDragDownAmountAnimated(0f)
+ }
if (nsslController.isInLockedDownShade()) {
+ logger.logDraggedDownLockDownShade(startingChild)
statusBarStateController.setLeaveOpenOnKeyguardHide(true)
statusbar.dismissKeyguardThenExecute(OnDismissAction {
nextHideKeyguardNeedsNoAnimation = true
false
- },
- null /* cancelRunnable */, false /* afterKeyguardGone */)
+ }, cancelRunnable, false /* afterKeyguardGone */)
} else {
- lockscreenGestureLogger.write(
- MetricsEvent.ACTION_LS_SHADE,
- (dragLengthY / displayMetrics.density).toInt(),
- 0 /* velocityDp */)
- lockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_PULL_SHADE_OPEN)
+ logger.logDraggedDown(startingChild, dragLengthY)
if (!ambientState.isDozing() || startingChild != null) {
// go to locked shade while animating the drag down amount from its current
// value
@@ -216,11 +237,11 @@
dragDownAmount = 0f
forceApplyAmount = false
}
- val cancelRunnable = Runnable { setDragDownAmountAnimated(0f) }
goToLockedShadeInternal(startingChild, animationHandler, cancelRunnable)
}
}
} else {
+ logger.logUnSuccessfulDragDown(startingChild)
setDragDownAmountAnimated(0f)
}
}
@@ -229,6 +250,7 @@
* Called by the touch helper when the drag down was aborted and should be reset.
*/
internal fun onDragDownReset() {
+ logger.logDragDownAborted()
nsslController.setDimmed(true /* dimmed */, true /* animated */)
nsslController.resetScrollPosition()
nsslController.resetCheckSnoozeLeavebehind()
@@ -246,10 +268,16 @@
/**
* Called by the touch helper when the drag down was started
*/
- internal fun onDragDownStarted() {
+ internal fun onDragDownStarted(startingChild: ExpandableView?) {
+ logger.logDragDownStarted(startingChild)
nsslController.cancelLongPress()
nsslController.checkSnoozeLeavebehind()
- dragDownAnimator?.cancel()
+ dragDownAnimator?.apply {
+ if (isRunning) {
+ logger.logAnimationCancelled(isPulse = false)
+ cancel()
+ }
+ }
}
/**
@@ -294,12 +322,12 @@
set(value) {
if (field != value || forceApplyAmount) {
field = value
- if (!nsslController.isInLockedDownShade() || forceApplyAmount) {
+ if (!nsslController.isInLockedDownShade() || field == 0f || forceApplyAmount) {
nsslController.setTransitionToFullShadeAmount(field)
notificationPanelController.setTransitionToFullShadeAmount(field,
false /* animate */, 0 /* delay */)
- dragProgress = MathUtils.saturate(dragDownAmount / scrimTransitionDistance)
- qS.setTransitionToFullShadeAmount(field, dragProgress)
+ qSDragProgress = MathUtils.saturate(dragDownAmount / scrimTransitionDistance)
+ qS.setTransitionToFullShadeAmount(field, qSDragProgress)
// TODO: appear media also in split shade
val mediaAmount = if (useSplitShade) 0f else field
mediaHierarchyManager.setTransitionToFullShadeAmount(mediaAmount)
@@ -308,7 +336,10 @@
}
}
- var dragProgress = 0f
+ /**
+ * The drag progress of the quick settings drag down amount
+ */
+ var qSDragProgress = 0f
private set
private fun transitionToShadeAmountCommon(dragDownAmount: Float) {
@@ -325,6 +356,7 @@
delay: Long = 0,
endlistener: (() -> Unit)? = null
) {
+ logger.logDragDownAnimation(target)
val dragDownAnimator = ValueAnimator.ofFloat(dragDownAmount, target)
dragDownAnimator.interpolator = Interpolators.FAST_OUT_SLOW_IN
dragDownAnimator.duration = SPRING_BACK_ANIMATION_LENGTH_MS
@@ -380,7 +412,9 @@
*/
@JvmOverloads
fun goToLockedShade(expandedView: View?, needsQSAnimation: Boolean = true) {
- if (statusBarStateController.state == StatusBarState.KEYGUARD) {
+ val isKeyguard = statusBarStateController.state == StatusBarState.KEYGUARD
+ logger.logTryGoToLockedShade(isKeyguard)
+ if (isKeyguard) {
val animationHandler: ((Long) -> Unit)?
if (needsQSAnimation) {
// Let's use the default animation
@@ -416,6 +450,7 @@
) {
if (statusbar.isShadeDisabled) {
cancelAction?.run()
+ logger.logShadeDisabledOnGoToLockedShade()
return
}
var userId: Int = lockScreenUserManager.getCurrentUserId()
@@ -454,9 +489,11 @@
}
cancelAction?.run()
}
+ logger.logShowBouncerOnGoToLockedShade()
statusbar.showBouncerWithDimissAndCancelIfKeyguard(onDismissAction, cancelHandler)
draggedDownEntry = entry
} else {
+ logger.logGoingToLockedShade(animationHandler != null)
statusBarStateController.setState(StatusBarState.SHADE_LOCKED)
// This call needs to be after updating the shade state since otherwise
// the scrimstate resets too early
@@ -476,6 +513,7 @@
* @param previousState which state were we in when we hid the keyguard?
*/
fun onHideKeyguard(delay: Long, previousState: Int) {
+ logger.logOnHideKeyguard()
if (animationHandlerOnKeyguardDismiss != null) {
animationHandlerOnKeyguardDismiss!!.invoke(delay)
animationHandlerOnKeyguardDismiss = null
@@ -498,6 +536,7 @@
* not triggered by gestures, e.g. when clicking on the shelf or expand button.
*/
private fun performDefaultGoToFullShadeAnimation(delay: Long) {
+ logger.logDefaultGoToFullShadeAnimation(delay)
notificationPanelController.animateToFullShade(delay)
animateAppear(delay)
}
@@ -534,6 +573,7 @@
* @param cancelled was the interaction cancelled and this is a reset?
*/
fun finishPulseAnimation(cancelled: Boolean) {
+ logger.logPulseExpansionFinished(cancelled)
if (cancelled) {
setPulseHeight(0f, animate = true)
} else {
@@ -546,7 +586,28 @@
* Notify this class that a pulse expansion is starting
*/
fun onPulseExpansionStarted() {
- pulseHeightAnimator?.cancel()
+ logger.logPulseExpansionStarted()
+ pulseHeightAnimator?.apply {
+ if (isRunning) {
+ logger.logAnimationCancelled(isPulse = true)
+ cancel()
+ }
+ }
+ }
+
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
+ IndentingPrintWriter(pw, " ").let {
+ it.println("LSShadeTransitionController:")
+ it.increaseIndent()
+ it.println("pulseHeight: $pulseHeight")
+ it.println("useSplitShade: $useSplitShade")
+ it.println("dragDownAmount: $dragDownAmount")
+ it.println("qSDragProgress: $qSDragProgress")
+ it.println("isDragDownAnywhereEnabled: $isDragDownAnywhereEnabled")
+ it.println("isFalsingCheckNeeded: $isFalsingCheckNeeded")
+ it.println("hasPendingHandlerOnKeyguardDismiss: " +
+ "${animationHandlerOnKeyguardDismiss != null}")
+ }
}
}
@@ -626,7 +687,7 @@
captureStartingChild(initialTouchX, initialTouchY)
initialTouchY = y
initialTouchX = x
- dragDownCallback.onDragDownStarted()
+ dragDownCallback.onDragDownStarted(startingChild)
dragDownAmountOnStart = dragDownCallback.dragDownAmount
return startingChild != null || dragDownCallback.isDragDownAnywhereEnabled
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
index 761a203..ea51bd8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt
@@ -24,15 +24,18 @@
import android.os.PowerManager
import android.os.PowerManager.WAKE_REASON_GESTURE
import android.os.SystemClock
+import android.util.IndentingPrintWriter
import android.view.MotionEvent
import android.view.VelocityTracker
import android.view.ViewConfiguration
+import com.android.systemui.Dumpable
import com.android.systemui.Gefingerpoken
import com.android.systemui.R
import com.android.systemui.animation.Interpolators
import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator
@@ -43,6 +46,8 @@
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController
+import java.io.FileDescriptor
+import java.io.PrintWriter
import javax.inject.Inject
import kotlin.math.max
@@ -61,8 +66,9 @@
private val statusBarStateController: StatusBarStateController,
private val falsingManager: FalsingManager,
private val lockscreenShadeTransitionController: LockscreenShadeTransitionController,
- private val falsingCollector: FalsingCollector
-) : Gefingerpoken {
+ private val falsingCollector: FalsingCollector,
+ dumpManager: DumpManager
+) : Gefingerpoken, Dumpable {
companion object {
private val SPRING_BACK_ANIMATION_LENGTH_MS = 375
}
@@ -120,6 +126,7 @@
}
})
mPowerManager = context.getSystemService(PowerManager::class.java)
+ dumpManager.registerDumpable(this)
}
private fun initResources(context: Context) {
@@ -329,4 +336,17 @@
fun onStartedWakingUp() {
isWakingToShadeLocked = false
}
+
+ override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
+ IndentingPrintWriter(pw, " ").let {
+ it.println("PulseExpansionHandler:")
+ it.increaseIndent()
+ it.println("isExpanding: $isExpanding")
+ it.println("leavingLockscreen: $leavingLockscreen")
+ it.println("mPulsing: $mPulsing")
+ it.println("isWakingToShadeLocked: $isWakingToShadeLocked")
+ it.println("qsExpanded: $qsExpanded")
+ it.println("bouncerShowing: $bouncerShowing")
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/DwellRippleShader.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/DwellRippleShader.kt
index 73d3e2a..8dc01f0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/DwellRippleShader.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/DwellRippleShader.kt
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.charging
-import android.graphics.Color
import android.graphics.PointF
import android.graphics.RuntimeShader
import android.util.MathUtils
@@ -40,7 +39,7 @@
uniform float in_time;
uniform float in_radius;
uniform float in_blur;
- uniform vec4 in_color;
+ layout(color) uniform vec4 in_color;
uniform float in_phase1;
uniform float in_phase2;
uniform float in_distortion_strength;"""
@@ -98,7 +97,7 @@
var origin: PointF = PointF()
set(value) {
field = value
- setUniform("in_origin", floatArrayOf(value.x, value.y))
+ setFloatUniform("in_origin", value.x, value.y)
}
/**
@@ -107,9 +106,9 @@
var progress: Float = 0.0f
set(value) {
field = value
- setUniform("in_radius",
+ setFloatUniform("in_radius",
(1 - (1 - value) * (1 - value) * (1 - value))* maxRadius)
- setUniform("in_blur", MathUtils.lerp(1f, 0.7f, value))
+ setFloatUniform("in_blur", MathUtils.lerp(1f, 0.7f, value))
}
/**
@@ -118,7 +117,7 @@
var distortionStrength: Float = 0.0f
set(value) {
field = value
- setUniform("in_distortion_strength", value)
+ setFloatUniform("in_distortion_strength", value)
}
/**
@@ -127,9 +126,9 @@
var time: Float = 0.0f
set(value) {
field = value * 0.001f
- setUniform("in_time", field)
- setUniform("in_phase1", field * 3f + 0.367f)
- setUniform("in_phase2", field * 7.2f * 1.531f)
+ setFloatUniform("in_time", field)
+ setFloatUniform("in_phase1", field * 3f + 0.367f)
+ setFloatUniform("in_phase2", field * 7.2f * 1.531f)
}
/**
@@ -138,8 +137,6 @@
var color: Int = 0xffffff.toInt()
set(value) {
field = value
- val color = Color.valueOf(value)
- setUniform("in_color", floatArrayOf(color.red(),
- color.green(), color.blue(), color.alpha()))
+ setColorUniform("in_color", value)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt b/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt
index 5175977..22fbf91 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/charging/RippleShader.kt
@@ -15,7 +15,6 @@
*/
package com.android.systemui.statusbar.charging
-import android.graphics.Color
import android.graphics.PointF
import android.graphics.RuntimeShader
import android.util.MathUtils
@@ -43,7 +42,7 @@
uniform float in_fadeRing;
uniform float in_blur;
uniform float in_pixelDensity;
- uniform vec4 in_color;
+ layout(color) uniform vec4 in_color;
uniform float in_sparkle_strength;"""
private const val SHADER_LIB = """float triangleNoise(vec2 n) {
n = fract(n * vec2(5.3987, 5.4421));
@@ -122,7 +121,7 @@
var radius: Float = 0.0f
set(value) {
field = value
- setUniform("in_maxRadius", value)
+ setFloatUniform("in_maxRadius", value)
}
/**
@@ -131,7 +130,7 @@
var origin: PointF = PointF()
set(value) {
field = value
- setUniform("in_origin", floatArrayOf(value.x, value.y))
+ setFloatUniform("in_origin", value.x, value.y)
}
/**
@@ -140,10 +139,10 @@
var progress: Float = 0.0f
set(value) {
field = value
- setUniform("in_progress", value)
- setUniform("in_radius",
+ setFloatUniform("in_progress", value)
+ setFloatUniform("in_radius",
(1 - (1 - value) * (1 - value) * (1 - value))* radius)
- setUniform("in_blur", MathUtils.lerp(1.25f, 0.5f, value))
+ setFloatUniform("in_blur", MathUtils.lerp(1.25f, 0.5f, value))
val fadeIn = subProgress(0f, 0.1f, value)
val fadeOutNoise = subProgress(0.4f, 1f, value)
@@ -153,9 +152,9 @@
fadeCircle = subProgress(0f, 0.2f, value)
fadeOutRipple = subProgress(0.3f, 1f, value)
}
- setUniform("in_fadeSparkle", Math.min(fadeIn, 1 - fadeOutNoise))
- setUniform("in_fadeCircle", 1 - fadeCircle)
- setUniform("in_fadeRing", Math.min(fadeIn, 1 - fadeOutRipple))
+ setFloatUniform("in_fadeSparkle", Math.min(fadeIn, 1 - fadeOutNoise))
+ setFloatUniform("in_fadeCircle", 1 - fadeCircle)
+ setFloatUniform("in_fadeRing", Math.min(fadeIn, 1 - fadeOutRipple))
}
/**
@@ -164,7 +163,7 @@
var time: Float = 0.0f
set(value) {
field = value
- setUniform("in_time", value)
+ setFloatUniform("in_time", value)
}
/**
@@ -173,9 +172,7 @@
var color: Int = 0xffffff.toInt()
set(value) {
field = value
- val color = Color.valueOf(value)
- setUniform("in_color", floatArrayOf(color.red(),
- color.green(), color.blue(), color.alpha()))
+ setColorUniform("in_color", value)
}
/**
@@ -186,7 +183,7 @@
var sparkleStrength: Float = 0.0f
set(value) {
field = value
- setUniform("in_sparkle_strength", value)
+ setFloatUniform("in_sparkle_strength", value)
}
/**
@@ -195,14 +192,14 @@
var distortionStrength: Float = 0.0f
set(value) {
field = value
- setUniform("in_distort_radial", 75 * progress * value)
- setUniform("in_distort_xy", 75 * value)
+ setFloatUniform("in_distort_radial", 75 * progress * value)
+ setFloatUniform("in_distort_xy", 75 * value)
}
var pixelDensity: Float = 1.0f
set(value) {
field = value
- setUniform("in_pixelDensity", value)
+ setFloatUniform("in_pixelDensity", value)
}
var shouldFadeOutRipple: Boolean = true
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index 4717b3a..09c608d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -626,7 +626,6 @@
entry = new NotificationEntry(
notification,
ranking,
- mFgsFeatureController.isForegroundServiceDismissalEnabled(),
SystemClock.uptimeMillis());
mAllNotifications.add(entry);
mLeakDetector.trackInstance(entry);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt
index cd8897e..bd9383d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManager.kt
@@ -21,6 +21,7 @@
import com.android.internal.annotations.VisibleForTesting
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NOTIFICATIONS_USE_PEOPLE_FILTERING
+import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING
import com.android.systemui.statusbar.notification.stack.BUCKET_FOREGROUND_SERVICE
import com.android.systemui.statusbar.notification.stack.BUCKET_HEADS_UP
@@ -37,6 +38,7 @@
/**
* Feature controller for the NOTIFICATIONS_USE_PEOPLE_FILTERING config.
*/
+@SysUISingleton
class NotificationSectionsFeatureManager @Inject constructor(
val proxy: DeviceConfigProxy,
val context: Context
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
index b6b9c3f..bf81ea5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
@@ -56,10 +56,12 @@
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
import android.util.Pair;
+import android.util.Slog;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
@@ -240,6 +242,10 @@
Assert.isMainThread();
checkForReentrantCall();
+ // TODO (b/206842750): This method is called from (silent) clear all and non-clear all
+ // contexts and should be checking the NO_CLEAR flag, rather than depending on NSSL
+ // to pass in a properly filtered list of notifications
+
final List<NotificationEntry> entriesToLocallyDismiss = new ArrayList<>();
for (int i = 0; i < entriesToDismiss.size(); i++) {
NotificationEntry entry = entriesToDismiss.get(i).first;
@@ -742,12 +748,13 @@
*
* See NotificationManager.cancelGroupChildrenByListLocked() for corresponding code.
*/
- private static boolean shouldAutoDismissChildren(
+ @VisibleForTesting
+ static boolean shouldAutoDismissChildren(
NotificationEntry entry,
String dismissedGroupKey) {
return entry.getSbn().getGroupKey().equals(dismissedGroupKey)
&& !entry.getSbn().getNotification().isGroupSummary()
- && !hasFlag(entry, Notification.FLAG_FOREGROUND_SERVICE)
+ && !hasFlag(entry, Notification.FLAG_ONGOING_EVENT)
&& !hasFlag(entry, Notification.FLAG_BUBBLE)
&& entry.getDismissState() != DISMISSED;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
index d56938a..f22acb7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java
@@ -174,7 +174,6 @@
private boolean mAutoHeadsUp;
private boolean mPulseSupressed;
- private boolean mAllowFgsDismissal;
private int mBucket = BUCKET_ALERTING;
@Nullable private Long mPendingAnimationDuration;
private boolean mIsMarkedForUserTriggeredMovement;
@@ -192,14 +191,6 @@
public NotificationEntry(
@NonNull StatusBarNotification sbn,
@NonNull Ranking ranking,
- long creationTime) {
- this(sbn, ranking, false, creationTime);
- }
-
- public NotificationEntry(
- @NonNull StatusBarNotification sbn,
- @NonNull Ranking ranking,
- boolean allowFgsDismissal,
long creationTime
) {
super(requireNonNull(requireNonNull(sbn).getKey()), creationTime);
@@ -209,8 +200,6 @@
mKey = sbn.getKey();
setSbn(sbn);
setRanking(ranking);
-
- mAllowFgsDismissal = allowFgsDismissal;
}
@Override
@@ -743,13 +732,11 @@
/**
* @return Can the underlying notification be cleared? This can be different from whether the
* notification can be dismissed in case notifications are sensitive on the lockscreen.
- * @see #canViewBeDismissed()
*/
- // TOOD: This logic doesn't belong on NotificationEntry. It should be moved to the
- // ForegroundsServiceDismissalFeatureController or some other controller that can be added
- // as a dependency to any class that needs to answer this question.
+ // TODO: This logic doesn't belong on NotificationEntry. It should be moved to a controller
+ // that can be added as a dependency to any class that needs to answer this question.
public boolean isClearable() {
- if (!isDismissable()) {
+ if (!mSbn.isClearable()) {
return false;
}
@@ -757,7 +744,7 @@
if (children != null && children.size() > 0) {
for (int i = 0; i < children.size(); i++) {
NotificationEntry child = children.get(i);
- if (!child.isDismissable()) {
+ if (!child.getSbn().isClearable()) {
return false;
}
}
@@ -766,28 +753,25 @@
}
/**
- * Notifications might have any combination of flags:
- * - FLAG_ONGOING_EVENT
- * - FLAG_NO_CLEAR
- * - FLAG_FOREGROUND_SERVICE
- *
- * We want to allow dismissal of notifications that represent foreground services, which may
- * have all 3 flags set. If we only find NO_CLEAR though, we don't want to allow dismissal
+ * @return Can the underlying notification be individually dismissed?
+ * @see #canViewBeDismissed()
*/
- private boolean isDismissable() {
- boolean ongoing = ((mSbn.getNotification().flags & Notification.FLAG_ONGOING_EVENT) != 0);
- boolean noclear = ((mSbn.getNotification().flags & Notification.FLAG_NO_CLEAR) != 0);
- boolean fgs = ((mSbn.getNotification().flags & FLAG_FOREGROUND_SERVICE) != 0);
-
- if (mAllowFgsDismissal) {
- if (noclear && !ongoing && !fgs) {
- return false;
- }
- return true;
- } else {
- return mSbn.isClearable();
+ // TODO: This logic doesn't belong on NotificationEntry. It should be moved to a controller
+ // that can be added as a dependency to any class that needs to answer this question.
+ public boolean isDismissable() {
+ if (mSbn.isOngoing()) {
+ return false;
}
-
+ List<NotificationEntry> children = getAttachedNotifChildren();
+ if (children != null && children.size() > 0) {
+ for (int i = 0; i < children.size(); i++) {
+ NotificationEntry child = children.get(i);
+ if (child.getSbn().isOngoing()) {
+ return false;
+ }
+ }
+ }
+ return true;
}
public boolean canViewBeDismissed() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
index ed9663e..f9f0b9d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.java
@@ -179,23 +179,26 @@
@Override
public boolean shouldExtendLifetime(@NonNull NotificationEntry entry, int reason) {
- boolean isShowingHun = isCurrentlyShowingHun(entry);
- if (isShowingHun) {
+ boolean extend = !mHeadsUpManager.canRemoveImmediately(entry.getKey());
+ if (extend) {
if (isSticky(entry)) {
long removeAfterMillis = mHeadsUpManager.getEarliestRemovalTime(entry.getKey());
- if (removeAfterMillis <= 0) return false;
mExecutor.executeDelayed(() -> {
- // make sure that the entry was not updated
- long removeAfterMillis2 =
- mHeadsUpManager.getEarliestRemovalTime(entry.getKey());
- if (mNotifsExtendingLifetime.contains(entry) && removeAfterMillis2 <= 0) {
- mHeadsUpManager.removeNotification(entry.getKey(), true);
+ if (mNotifsExtendingLifetime.contains(entry)
+ && mHeadsUpManager.canRemoveImmediately(entry.getKey())) {
+ mHeadsUpManager.removeNotification(
+ entry.getKey(), /* releaseImmediately */ true);
}
}, removeAfterMillis);
+ } else {
+ // remove as early as possible
+ mExecutor.execute(
+ () -> mHeadsUpManager.removeNotification(
+ entry.getKey(), /* releaseImmediately */ false));
}
mNotifsExtendingLifetime.add(entry);
}
- return isShowingHun;
+ return extend;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/OnUserInteractionCallbackImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/OnUserInteractionCallbackImpl.java
index f50038c..3bd91b5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/OnUserInteractionCallbackImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/inflation/OnUserInteractionCallbackImpl.java
@@ -111,7 +111,7 @@
String group = entry.getSbn().getGroup();
if (mNotifCollection.isOnlyChildInGroup(entry)) {
NotificationEntry summary = mNotifCollection.getGroupSummary(group);
- if (summary != null && summary.isClearable()) return summary;
+ if (summary != null && summary.isDismissable()) return summary;
}
return null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/OnUserInteractionCallbackImplLegacy.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/OnUserInteractionCallbackImplLegacy.java
index 3b114bb..8daf8be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/OnUserInteractionCallbackImplLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/OnUserInteractionCallbackImplLegacy.java
@@ -111,7 +111,7 @@
public NotificationEntry getGroupSummaryToDismiss(NotificationEntry entry) {
if (mGroupMembershipManager.isOnlyChildInGroup(entry)) {
NotificationEntry groupSummary = mGroupMembershipManager.getLogicalGroupSummary(entry);
- return groupSummary.isClearable() ? groupSummary : null;
+ return groupSummary.isDismissable() ? groupSummary : null;
}
return null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/MediaContainerController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/MediaContainerController.kt
new file mode 100644
index 0000000..f949af0
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/MediaContainerController.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.collection.render
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.android.systemui.R
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.statusbar.notification.stack.MediaContainerView
+import javax.inject.Inject
+
+@SysUISingleton
+class MediaContainerController @Inject constructor(
+ private val layoutInflater: LayoutInflater
+) : NodeController {
+
+ override val nodeLabel = "MediaContainer"
+ var mediaContainerView: MediaContainerView? = null
+ private set
+
+ fun reinflateView(parent: ViewGroup) {
+ var oldPos = -1
+ mediaContainerView?.let { _view ->
+ _view.removeFromTransientContainer()
+ if (_view.parent === parent) {
+ oldPos = parent.indexOfChild(_view)
+ parent.removeView(_view)
+ }
+ }
+ val inflated = layoutInflater.inflate(
+ R.layout.keyguard_media_container,
+ parent,
+ false /* attachToRoot */)
+ as MediaContainerView
+ if (oldPos != -1) {
+ parent.addView(inflated, oldPos)
+ }
+ mediaContainerView = inflated
+ }
+
+ override val view: View
+ get() = mediaContainerView!!
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilder.kt
index f59e4ab..f13470e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilder.kt
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.notification.collection.render
+import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry
@@ -32,6 +33,8 @@
* need to present in the shade, notably the section headers.
*/
class NodeSpecBuilder(
+ private val mediaContainerController: MediaContainerController,
+ private val sectionsFeatureManager: NotificationSectionsFeatureManager,
private val viewBarn: NotifViewBarn
) {
fun buildNodeSpec(
@@ -39,6 +42,13 @@
notifList: List<ListEntry>
): NodeSpec = traceSection("NodeSpecBuilder.buildNodeSpec") {
val root = NodeSpecImpl(null, rootController)
+
+ // The media container should be added as the first child of the root node
+ // TODO: Perhaps the node spec building process should be more of a pipeline of its own?
+ if (sectionsFeatureManager.isMediaControlsEnabled()) {
+ root.children.add(NodeSpecImpl(root, mediaContainerController))
+ }
+
var currentSection: NotifSection? = null
val prevSections = mutableSetOf<NotifSection?>()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
index 8c15647..4e9017e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt
@@ -60,7 +60,7 @@
override fun reinflateView(parent: ViewGroup) {
var oldPos = -1
_view?.let { _view ->
- _view.transientContainer?.removeView(_view)
+ _view.removeFromTransientContainer()
if (_view.parent === parent) {
oldPos = parent.indexOfChild(_view)
parent.removeView(_view)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt
index 1a8d720..ad97392 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/ShadeViewManager.kt
@@ -18,28 +18,33 @@
import android.content.Context
import android.view.View
+import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
import com.android.systemui.util.traceSection
-import javax.inject.Inject
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
/**
* Responsible for building and applying the "shade node spec": the list (tree) of things that
* currently populate the notification shade.
*/
-class ShadeViewManager constructor(
+class ShadeViewManager @AssistedInject constructor(
context: Context,
- listContainer: NotificationListContainer,
- private val stackController: NotifStackController,
+ @Assisted listContainer: NotificationListContainer,
+ @Assisted private val stackController: NotifStackController,
+ mediaContainerController: MediaContainerController,
+ featureManager: NotificationSectionsFeatureManager,
logger: ShadeViewDifferLogger,
private val viewBarn: NotifViewBarn
) {
// We pass a shim view here because the listContainer may not actually have a view associated
// with it and the differ never actually cares about the root node's view.
private val rootController = RootNodeController(listContainer, View(context))
- private val specBuilder = NodeSpecBuilder(viewBarn)
+ private val specBuilder = NodeSpecBuilder(mediaContainerController, featureManager, viewBarn)
private val viewDiffer = ShadeViewDiffer(rootController, logger)
/** Method for attaching this manager to the pipeline. */
@@ -65,16 +70,10 @@
}
}
-class ShadeViewManagerFactory @Inject constructor(
- private val context: Context,
- private val logger: ShadeViewDifferLogger,
- private val viewBarn: NotifViewBarn
-) {
- fun create(listContainer: NotificationListContainer, stackController: NotifStackController) =
- ShadeViewManager(
- context,
- listContainer,
- stackController,
- logger,
- viewBarn)
+@AssistedFactory
+interface ShadeViewManagerFactory {
+ fun create(
+ listContainer: NotificationListContainer,
+ stackController: NotifStackController
+ ): ShadeViewManager
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index f898470..08a230b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -1462,7 +1462,7 @@
public void performDismiss(boolean fromAccessibility) {
Dependency.get(MetricsLogger.class).count(NotificationCounters.NOTIFICATION_DISMISSED, 1);
dismiss(fromAccessibility);
- if (mEntry.isClearable()) {
+ if (mEntry.isDismissable()) {
if (mOnUserInteractionCallback != null) {
mOnUserInteractionCallback.onDismiss(mEntry, REASON_CANCEL,
mOnUserInteractionCallback.getGroupSummaryToDismiss(mEntry));
@@ -2673,9 +2673,18 @@
/**
* @return Whether this view is allowed to be dismissed. Only valid for visible notifications as
* otherwise some state might not be updated. To request about the general clearability
- * see {@link NotificationEntry#isClearable()}.
+ * see {@link NotificationEntry#isDismissable()}.
*/
public boolean canViewBeDismissed() {
+ return mEntry.isDismissable() && (!shouldShowPublic() || !mSensitiveHiddenInGeneral);
+ }
+
+ /**
+ * @return Whether this view is allowed to be cleared with clear all. Only valid for visible
+ * notifications as otherwise some state might not be updated. To request about the general
+ * clearability see {@link NotificationEntry#isClearable()}.
+ */
+ public boolean canViewBeCleared() {
return mEntry.isClearable() && (!shouldShowPublic() || !mSensitiveHiddenInGeneral);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
index 6218c77..624e741 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
@@ -550,41 +550,32 @@
public void removeFromTransientContainerForAdditionTo(ViewGroup newParent) {
final ViewParent parent = getParent();
final ViewGroup transientContainer = getTransientContainer();
- if (parent == null) {
- // If this view has no parent, the add will succeed, so just make sure the tracked
- // transient container is in sync with the lack of a parent.
- if (transientContainer != null) {
+ if (parent == null || parent == newParent) {
+ // If this view's current parent is null or the same as the new parent, the add will
+ // succeed, so just make sure the tracked transient container is in sync with the
+ // current parent.
+ if (transientContainer != null && transientContainer != parent) {
Log.w(TAG, "Expandable view " + this
+ " has transient container " + transientContainer
- + " but no parent");
+ + " but different parent" + parent);
setTransientContainer(null);
}
return;
}
if (transientContainer == null) {
- throw new IllegalStateException(
- "Can't add view " + this + " to container " + newParent + "; current parent "
- + parent + " is not a transient container");
+ throw new IllegalStateException("Can't add view " + this + " to container " + newParent
+ + "; current parent " + parent + " is not a transient container");
}
if (transientContainer != parent) {
- String transientContainerOutOfSyncError = "Expandable view " + this
+ // Crash with details before addView() crashes without any; the view is being added
+ // to a different parent, and the transient container isn't the parent, so we can't
+ // even (safely) clean that up.
+ throw new IllegalStateException("Expandable view " + this
+ " has transient container " + transientContainer
- + " but different parent " + parent;
- if (parent != newParent) {
- // Crash with details before addView() crashes without any; the view is being added
- // to a different parent, and the transient container isn't the parent, so we can't
- // even (safely) clean that up.
- throw new IllegalStateException(transientContainerOutOfSyncError);
- } else {
- Log.w(TAG, transientContainerOutOfSyncError);
- setTransientContainer(null);
- return;
- }
+ + " but different parent " + parent);
}
- if (parent != newParent) {
- Log.w(TAG, "Moving view " + this + " from transient container "
- + transientContainer + " to parent " + newParent);
- }
+ Log.w(TAG, "Removing view " + this + " from transient container "
+ + transientContainer + " in preparation for moving to parent " + newParent);
transientContainer.removeTransientView(this);
setTransientContainer(null);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
index e8e6e31..0b6d759 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/FooterView.java
@@ -32,7 +32,7 @@
import java.io.PrintWriter;
public class FooterView extends StackScrollerDecorView {
- private FooterViewButton mDismissButton;
+ private FooterViewButton mClearAllButton;
private FooterViewButton mManageButton;
private boolean mShowHistory;
@@ -57,16 +57,16 @@
pw.println("visibility: " + DumpUtilsKt.visibilityString(getVisibility()));
pw.println("manageButton showHistory: " + mShowHistory);
pw.println("manageButton visibility: "
- + DumpUtilsKt.visibilityString(mDismissButton.getVisibility()));
+ + DumpUtilsKt.visibilityString(mClearAllButton.getVisibility()));
pw.println("dismissButton visibility: "
- + DumpUtilsKt.visibilityString(mDismissButton.getVisibility()));
+ + DumpUtilsKt.visibilityString(mClearAllButton.getVisibility()));
});
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mDismissButton = (FooterViewButton) findSecondaryView();
+ mClearAllButton = (FooterViewButton) findSecondaryView();
mManageButton = findViewById(R.id.manage_text);
}
@@ -74,8 +74,8 @@
mManageButton.setOnClickListener(listener);
}
- public void setDismissButtonClickListener(OnClickListener listener) {
- mDismissButton.setOnClickListener(listener);
+ public void setClearAllButtonClickListener(OnClickListener listener) {
+ mClearAllButton.setOnClickListener(listener);
}
public boolean isOnEmptySpace(float touchX, float touchY) {
@@ -106,8 +106,8 @@
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
updateColors();
- mDismissButton.setText(R.string.clear_all_notifications_text);
- mDismissButton.setContentDescription(
+ mClearAllButton.setText(R.string.clear_all_notifications_text);
+ mClearAllButton.setContentDescription(
mContext.getString(R.string.accessibility_clear_all));
showHistory(mShowHistory);
}
@@ -118,8 +118,8 @@
public void updateColors() {
Resources.Theme theme = mContext.getTheme();
int textColor = getResources().getColor(R.color.notif_pill_text, theme);
- mDismissButton.setBackground(theme.getDrawable(R.drawable.notif_footer_btn_background));
- mDismissButton.setTextColor(textColor);
+ mClearAllButton.setBackground(theme.getDrawable(R.drawable.notif_footer_btn_background));
+ mClearAllButton.setTextColor(textColor);
mManageButton.setBackground(theme.getDrawable(R.drawable.notif_footer_btn_background));
mManageButton.setTextColor(textColor);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
index e658468..7dc2e19 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java
@@ -57,7 +57,7 @@
private int mTopPadding;
private boolean mShadeExpanded;
private float mMaxHeadsUpTranslation;
- private boolean mDismissAllInProgress;
+ private boolean mClearAllInProgress;
private int mLayoutMinHeight;
private int mLayoutMaxHeight;
private NotificationShelf mShelf;
@@ -384,12 +384,12 @@
return mMaxHeadsUpTranslation;
}
- public void setDismissAllInProgress(boolean dismissAllInProgress) {
- mDismissAllInProgress = dismissAllInProgress;
+ public void setClearAllInProgress(boolean clearAllInProgress) {
+ mClearAllInProgress = clearAllInProgress;
}
- public boolean isDismissAllInProgress() {
- return mDismissAllInProgress;
+ public boolean isClearAllInProgress() {
+ return mClearAllInProgress;
}
public void setLayoutMinHeight(int layoutMinHeight) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaContainerView.java
similarity index 91%
rename from packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaContainerView.java
index 0247a99..c9a0f6c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaContainerView.java
@@ -25,9 +25,9 @@
/**
* Root view to insert Lock screen media controls into the notification stack.
*/
-public class MediaHeaderView extends ExpandableView {
+public class MediaContainerView extends ExpandableView {
- public MediaHeaderView(Context context, AttributeSet attrs) {
+ public MediaContainerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
index 464fd06..b589d9a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java
@@ -45,7 +45,7 @@
private ExpandableNotificationRow mTrackedHeadsUp;
private float mAppearFraction;
private boolean mRoundForPulsingViews;
- private boolean mIsDismissAllInProgress;
+ private boolean mIsClearAllInProgress;
private ExpandableView mSwipedView = null;
private ExpandableView mViewBeforeSwipedView = null;
@@ -156,8 +156,8 @@
}
}
- void setDismissAllInProgress(boolean isClearingAll) {
- mIsDismissAllInProgress = isClearingAll;
+ void setClearAllInProgress(boolean isClearingAll) {
+ mIsClearAllInProgress = isClearingAll;
}
private float getRoundnessFraction(ExpandableView view, boolean top) {
@@ -170,8 +170,8 @@
return 1f;
}
if (view instanceof ExpandableNotificationRow
- && ((ExpandableNotificationRow) view).canViewBeDismissed()
- && mIsDismissAllInProgress) {
+ && ((ExpandableNotificationRow) view).canViewBeCleared()
+ && mIsClearAllInProgress) {
return 1.0f;
}
if ((view.isPinned()
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
index 1d90780..b02dc0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.kt
@@ -16,17 +16,15 @@
package com.android.systemui.statusbar.notification.stack
import android.annotation.ColorInt
-import android.annotation.LayoutRes
import android.util.Log
-import android.view.LayoutInflater
import android.view.View
import com.android.internal.annotations.VisibleForTesting
-import com.android.systemui.R
import com.android.systemui.media.KeyguardMediaController
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.notification.NotifPipelineFlags
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
+import com.android.systemui.statusbar.notification.collection.render.MediaContainerController
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController
import com.android.systemui.statusbar.notification.collection.render.ShadeViewManager
import com.android.systemui.statusbar.notification.dagger.AlertingHeader
@@ -60,6 +58,7 @@
private val sectionsFeatureManager: NotificationSectionsFeatureManager,
private val logger: NotificationSectionsLogger,
private val notifPipelineFlags: NotifPipelineFlags,
+ private val mediaContainerController: MediaContainerController,
@IncomingHeader private val incomingHeaderController: SectionHeaderController,
@PeopleHeader private val peopleHeaderController: SectionHeaderController,
@AlertingHeader private val alertingHeaderController: SectionHeaderController,
@@ -68,7 +67,7 @@
private val configurationListener = object : ConfigurationController.ConfigurationListener {
override fun onLocaleListChanged() {
- reinflateViews(LayoutInflater.from(parent.context))
+ reinflateViews()
}
}
@@ -91,39 +90,19 @@
val peopleHeaderView: SectionHeaderView?
get() = peopleHeaderController.headerView
- @get:VisibleForTesting
- var mediaControlsView: MediaHeaderView? = null
- private set
+ @VisibleForTesting
+ val mediaControlsView: MediaContainerView?
+ get() = mediaContainerController.mediaContainerView
/** Must be called before use. */
- fun initialize(parent: NotificationStackScrollLayout, layoutInflater: LayoutInflater) {
+ fun initialize(parent: NotificationStackScrollLayout) {
check(!initialized) { "NotificationSectionsManager already initialized" }
initialized = true
this.parent = parent
- reinflateViews(layoutInflater)
+ reinflateViews()
configurationController.addCallback(configurationListener)
}
- private fun <T : ExpandableView> reinflateView(
- view: T?,
- layoutInflater: LayoutInflater,
- @LayoutRes layoutResId: Int
- ): T {
- var oldPos = -1
- view?.let {
- view.transientContainer?.removeView(view)
- if (view.parent === parent) {
- oldPos = parent.indexOfChild(view)
- parent.removeView(view)
- }
- }
- val inflated = layoutInflater.inflate(layoutResId, parent, false) as T
- if (oldPos != -1) {
- parent.addView(inflated, oldPos)
- }
- return inflated
- }
-
fun createSectionsForBuckets(): Array<NotificationSection> =
sectionsFeatureManager.getNotificationBuckets()
.map { NotificationSection(parent, it) }
@@ -132,13 +111,12 @@
/**
* Reinflates the entire notification header, including all decoration views.
*/
- fun reinflateViews(layoutInflater: LayoutInflater) {
+ fun reinflateViews() {
silentHeaderController.reinflateView(parent)
alertingHeaderController.reinflateView(parent)
peopleHeaderController.reinflateView(parent)
incomingHeaderController.reinflateView(parent)
- mediaControlsView =
- reinflateView(mediaControlsView, layoutInflater, R.layout.keyguard_media_header)
+ mediaContainerController.reinflateView(parent)
keyguardMediaController.attachSinglePaneContainer(mediaControlsView)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 943f05f..915a85d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -255,8 +255,8 @@
private boolean mIsCurrentUserSetup;
protected FooterView mFooterView;
protected EmptyShadeView mEmptyShadeView;
- private boolean mDismissAllInProgress;
- private FooterDismissListener mFooterDismissListener;
+ private boolean mClearAllInProgress;
+ private FooterClearAllListener mFooterClearAllListener;
private boolean mFlingAfterUpEvent;
/**
@@ -439,8 +439,8 @@
private int mQsScrollBoundaryPosition;
private HeadsUpAppearanceController mHeadsUpAppearanceController;
private final Rect mTmpRect = new Rect();
- private DismissListener mDismissListener;
- private DismissAllAnimationListener mDismissAllAnimationListener;
+ private ClearAllListener mClearAllListener;
+ private ClearAllAnimationListener mClearAllAnimationListener;
private ShadeController mShadeController;
private Consumer<Boolean> mOnStackYChanged;
@@ -574,7 +574,7 @@
mScreenOffAnimationController =
Dependency.get(ScreenOffAnimationController.class);
updateSplitNotificationShade();
- mSectionsManager.initialize(this, LayoutInflater.from(context));
+ mSectionsManager.initialize(this);
mSections = mSectionsManager.createSectionsForBuckets();
mAmbientState = Dependency.get(AmbientState.class);
@@ -665,7 +665,7 @@
inflateFooterView();
inflateEmptyShadeView();
updateFooter();
- mSectionsManager.reinflateViews(LayoutInflater.from(mContext));
+ mSectionsManager.reinflateViews();
}
public void setIsRemoteInputActive(boolean isActive) {
@@ -1207,7 +1207,7 @@
@ShadeViewRefactor(RefactorComponent.COORDINATOR)
private void clampScrollPosition() {
int scrollRange = getScrollRange();
- if (scrollRange < mOwnScrollY && !mAmbientState.isDismissAllInProgress()) {
+ if (scrollRange < mOwnScrollY && !mAmbientState.isClearAllInProgress()) {
boolean animateStackY = false;
if (scrollRange < getScrollAmountToScrollBoundary()
&& mAnimateStackYForContentHeightChange) {
@@ -1729,7 +1729,7 @@
return;
}
mSwipeHelper.dismissChild(child, 0, endRunnable, delay, true, duration,
- true /* isDismissAll */);
+ true /* isClearAll */);
}
@ShadeViewRefactor(RefactorComponent.STATE_RESOLVER)
@@ -2228,7 +2228,7 @@
height += viewHeight;
numShownItems++;
- if (viewHeight > 0 || !(expandableView instanceof MediaHeaderView)) {
+ if (viewHeight > 0 || !(expandableView instanceof MediaContainerView)) {
// Only count the media as a notification if it has a positive height.
numShownNotifs++;
}
@@ -3202,7 +3202,7 @@
ignoreChildren = false;
}
childWasSwipedOut |= isFullySwipedOut(row);
- } else if (child instanceof MediaHeaderView) {
+ } else if (child instanceof MediaContainerView) {
childWasSwipedOut = true;
}
if (!childWasSwipedOut) {
@@ -4071,8 +4071,8 @@
clearTransient();
clearHeadsUpDisappearRunning();
- if (mAmbientState.isDismissAllInProgress()) {
- setDismissAllInProgress(false);
+ if (mAmbientState.isClearAllInProgress()) {
+ setClearAllInProgress(false);
if (mShadeNeedsToClose) {
mShadeNeedsToClose = false;
postDelayed(
@@ -4446,19 +4446,19 @@
}
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
- public void setDismissAllInProgress(boolean dismissAllInProgress) {
- mDismissAllInProgress = dismissAllInProgress;
- mAmbientState.setDismissAllInProgress(dismissAllInProgress);
- mController.getNoticationRoundessManager().setDismissAllInProgress(dismissAllInProgress);
- handleDismissAllClipping();
+ public void setClearAllInProgress(boolean clearAllInProgress) {
+ mClearAllInProgress = clearAllInProgress;
+ mAmbientState.setClearAllInProgress(clearAllInProgress);
+ mController.getNoticationRoundessManager().setClearAllInProgress(clearAllInProgress);
+ handleClearAllClipping();
}
- boolean getDismissAllInProgress() {
- return mDismissAllInProgress;
+ boolean getClearAllInProgress() {
+ return mClearAllInProgress;
}
@ShadeViewRefactor(RefactorComponent.ADAPTER)
- private void handleDismissAllClipping() {
+ private void handleClearAllClipping() {
final int count = getChildCount();
boolean previousChildWillBeDismissed = false;
for (int i = 0; i < count; i++) {
@@ -4466,12 +4466,12 @@
if (child.getVisibility() == GONE) {
continue;
}
- if (mDismissAllInProgress && previousChildWillBeDismissed) {
+ if (mClearAllInProgress && previousChildWillBeDismissed) {
child.setMinClipTopAmount(child.getClipTopAmount());
} else {
child.setMinClipTopAmount(0);
}
- previousChildWillBeDismissed = canChildBeDismissed(child);
+ previousChildWillBeDismissed = canChildBeCleared(child);
}
}
@@ -5022,7 +5022,7 @@
}
if (view instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) view;
- if (isVisible(row) && includeChildInDismissAll(row, selection)) {
+ if (isVisible(row) && includeChildInClearAll(row, selection)) {
return true;
}
}
@@ -5052,7 +5052,7 @@
if (isChildrenVisible(parent)) {
for (ExpandableNotificationRow child : parent.getAttachedChildren()) {
- if (isVisible(child) && includeChildInDismissAll(child, selection)) {
+ if (isVisible(child) && includeChildInClearAll(child, selection)) {
viewsToHide.add(child);
}
}
@@ -5073,13 +5073,13 @@
continue;
}
ExpandableNotificationRow parent = (ExpandableNotificationRow) view;
- if (includeChildInDismissAll(parent, selection)) {
+ if (includeChildInClearAll(parent, selection)) {
viewsToRemove.add(parent);
}
List<ExpandableNotificationRow> children = parent.getAttachedChildren();
if (isVisible(parent) && children != null) {
for (ExpandableNotificationRow child : children) {
- if (includeChildInDismissAll(parent, selection)) {
+ if (includeChildInClearAll(parent, selection)) {
viewsToRemove.add(child);
}
}
@@ -5090,7 +5090,7 @@
/**
* Collects a list of visible rows, and animates them away in a staggered fashion as if they
- * were dismissed. Notifications are dismissed in the backend via onDismissAllAnimationsEnd.
+ * were dismissed. Notifications are dismissed in the backend via onClearAllAnimationsEnd.
*/
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
@VisibleForTesting
@@ -5099,18 +5099,18 @@
final ArrayList<View> viewsToAnimateAway = getVisibleViewsToAnimateAway(selection);
final ArrayList<ExpandableNotificationRow> rowsToDismissInBackend =
getRowsToDismissInBackend(selection);
- if (mDismissListener != null) {
- mDismissListener.onDismiss(selection);
+ if (mClearAllListener != null) {
+ mClearAllListener.onClearAll(selection);
}
final Runnable dismissInBackend = () -> {
- onDismissAllAnimationsEnd(rowsToDismissInBackend, selection);
+ onClearAllAnimationsEnd(rowsToDismissInBackend, selection);
};
if (viewsToAnimateAway.isEmpty()) {
dismissInBackend.run();
return;
}
// Disable normal animations
- setDismissAllInProgress(true);
+ setClearAllInProgress(true);
mShadeNeedsToClose = closeShade;
// Decrease the delay for every row we animate to give the sense of
@@ -5131,10 +5131,10 @@
}
}
- private boolean includeChildInDismissAll(
+ private boolean includeChildInClearAll(
ExpandableNotificationRow row,
@SelectedRows int selection) {
- return canChildBeDismissed(row) && matchesSelection(row, selection);
+ return canChildBeCleared(row) && matchesSelection(row, selection);
}
/** Register a {@link View.OnClickListener} to be invoked when the Manage button is clicked. */
@@ -5150,9 +5150,9 @@
protected void inflateFooterView() {
FooterView footerView = (FooterView) LayoutInflater.from(mContext).inflate(
R.layout.status_bar_notification_footer, this, false);
- footerView.setDismissButtonClickListener(v -> {
- if (mFooterDismissListener != null) {
- mFooterDismissListener.onDismiss();
+ footerView.setClearAllButtonClickListener(v -> {
+ if (mFooterClearAllListener != null) {
+ mFooterClearAllListener.onClearAll();
}
clearNotifications(ROWS_ALL, true /* closeShade */);
footerView.setSecondaryVisible(false /* visible */, true /* animate */);
@@ -5389,20 +5389,20 @@
return mCheckForLeavebehind;
}
- void setDismissListener (DismissListener listener) {
- mDismissListener = listener;
+ void setClearAllListener(ClearAllListener listener) {
+ mClearAllListener = listener;
}
- void setDismissAllAnimationListener(DismissAllAnimationListener dismissAllAnimationListener) {
- mDismissAllAnimationListener = dismissAllAnimationListener;
+ void setClearAllAnimationListener(ClearAllAnimationListener clearAllAnimationListener) {
+ mClearAllAnimationListener = clearAllAnimationListener;
}
public void setHighPriorityBeforeSpeedBump(boolean highPriorityBeforeSpeedBump) {
mHighPriorityBeforeSpeedBump = highPriorityBeforeSpeedBump;
}
- void setFooterDismissListener(FooterDismissListener listener) {
- mFooterDismissListener = listener;
+ void setFooterClearAllListener(FooterClearAllListener listener) {
+ mFooterClearAllListener = listener;
}
void setShadeController(ShadeController shadeController) {
@@ -5976,9 +5976,6 @@
static boolean canChildBeDismissed(View v) {
if (v instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
- if (row.isBlockingHelperShowingAndTranslationFinished()) {
- return true;
- }
if (row.areGutsExposed() || !row.getEntry().hasFinishedInitialization()) {
return false;
}
@@ -5990,6 +5987,20 @@
return false;
}
+ static boolean canChildBeCleared(View v) {
+ if (v instanceof ExpandableNotificationRow) {
+ ExpandableNotificationRow row = (ExpandableNotificationRow) v;
+ if (row.areGutsExposed() || !row.getEntry().hasFinishedInitialization()) {
+ return false;
+ }
+ return row.canViewBeCleared();
+ }
+ if (v instanceof PeopleHubView) {
+ return ((PeopleHubView) v).getCanSwipe();
+ }
+ return false;
+ }
+
// --------------------- NotificationEntryManager/NotifPipeline methods ------------------------
void onEntryUpdated(NotificationEntry entry) {
@@ -6003,11 +6014,11 @@
/**
* Called after the animations for a "clear all notifications" action has ended.
*/
- private void onDismissAllAnimationsEnd(
+ private void onClearAllAnimationsEnd(
List<ExpandableNotificationRow> viewsToRemove,
@SelectedRows int selectedRows) {
- if (mDismissAllAnimationListener != null) {
- mDismissAllAnimationListener.onAnimationEnd(viewsToRemove, selectedRows);
+ if (mClearAllAnimationListener != null) {
+ mClearAllAnimationListener.onAnimationEnd(viewsToRemove, selectedRows);
}
}
@@ -6149,15 +6160,15 @@
/** Only rows where entry.isHighPriority() is false. */
public static final int ROWS_GENTLE = 2;
- interface DismissListener {
- void onDismiss(@SelectedRows int selectedRows);
+ interface ClearAllListener {
+ void onClearAll(@SelectedRows int selectedRows);
}
- interface FooterDismissListener {
- void onDismiss();
+ interface FooterClearAllListener {
+ void onClearAll();
}
- interface DismissAllAnimationListener {
+ interface ClearAllAnimationListener {
void onAnimationEnd(
List<ExpandableNotificationRow> viewsToRemove, @SelectedRows int selectedRows);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index fc612a9..ff75eef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -28,7 +28,7 @@
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_GENTLE;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.ROWS_HIGH_PRIORITY;
import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.SelectedRows;
-import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.canChildBeDismissed;
+import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.canChildBeCleared;
import static com.android.systemui.statusbar.phone.NotificationIconAreaController.HIGH_PRIORITY;
import android.content.res.Configuration;
@@ -466,7 +466,7 @@
*/
public void handleChildViewDismissed(View view) {
- if (mView.getDismissAllInProgress()) {
+ if (mView.getClearAllInProgress()) {
return;
}
mView.onSwipeEnd();
@@ -510,7 +510,7 @@
&& (parent.areGutsExposed()
|| mSwipeHelper.getExposedMenuView() == parent
|| (parent.getAttachedChildren().size() == 1
- && parent.getEntry().isClearable()))) {
+ && parent.getEntry().isDismissable()))) {
// In this case the group is expanded and showing the menu for the
// group, further interaction should apply to the group, not any
// child notifications so we use the parent of the child. We also do the
@@ -720,10 +720,10 @@
mView.setController(this);
mView.setTouchHandler(new TouchHandler());
mView.setStatusBar(mStatusBar);
- mView.setDismissAllAnimationListener(this::onAnimationEnd);
- mView.setDismissListener((selection) -> mUiEventLogger.log(
+ mView.setClearAllAnimationListener(this::onAnimationEnd);
+ mView.setClearAllListener((selection) -> mUiEventLogger.log(
NotificationPanelEvent.fromSelection(selection)));
- mView.setFooterDismissListener(() ->
+ mView.setFooterClearAllListener(() ->
mMetricsLogger.action(MetricsEvent.ACTION_DISMISS_ALL_NOTES));
mView.setIsRemoteInputActive(mRemoteInputManager.isRemoteInputActive());
mRemoteInputManager.addControllerCallback(new RemoteInputController.Callback() {
@@ -1452,7 +1452,7 @@
}
} else {
for (ExpandableNotificationRow rowToRemove : viewsToRemove) {
- if (canChildBeDismissed(rowToRemove)) {
+ if (canChildBeCleared(rowToRemove)) {
mNotificationEntryManager.performRemoveNotification(
rowToRemove.getEntry().getSbn(),
getDismissedByUserStats(rowToRemove.getEntry()),
@@ -1503,7 +1503,7 @@
* from the keyguard host to the quick settings one.
*/
public int getFullShadeTransitionInset() {
- MediaHeaderView view = mKeyguardMediaController.getSinglePaneContainer();
+ MediaContainerView view = mKeyguardMediaController.getSinglePaneContainer();
if (view == null || view.getHeight() == 0
|| mStatusBarStateController.getState() != KEYGUARD) {
return 0;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
index 2c70a5f..8f0579c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java
@@ -458,7 +458,7 @@
final boolean noSpaceForFooter = footerEnd > ambientState.getStackEndHeight();
((FooterView.FooterViewState) viewState).hideContent =
isShelfShowing || noSpaceForFooter
- || (ambientState.isDismissAllInProgress()
+ || (ambientState.isClearAllInProgress()
&& !hasOngoingNotifs(algorithmState));
}
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index bfa4a24..dee1b33 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -11,7 +11,7 @@
* 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
+ * limitations under the License.
*/
package com.android.systemui.statusbar.phone;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
index 01acce3..2824ab8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java
@@ -412,7 +412,7 @@
}
@Override
- protected boolean canRemoveImmediately(@NonNull String key) {
+ public boolean canRemoveImmediately(@NonNull String key) {
if (mSwipedOutKeys.contains(key)) {
// We always instantly dismiss views being manually swiped out.
mSwipedOutKeys.remove(key);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt
new file mode 100644
index 0000000..4de78f5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone
+
+import android.util.DisplayMetrics
+import android.view.View
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.LogLevel
+import com.android.systemui.log.dagger.LSShadeTransitionLog
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
+import com.android.systemui.statusbar.notification.row.ExpandableView
+import javax.inject.Inject
+
+private const val TAG = "LockscreenShadeTransitionController"
+
+class LSShadeTransitionLogger @Inject constructor(
+ @LSShadeTransitionLog private val buffer: LogBuffer,
+ private val lockscreenGestureLogger: LockscreenGestureLogger,
+ private val displayMetrics: DisplayMetrics
+) {
+ fun logUnSuccessfulDragDown(startingChild: View?) {
+ val entry = (startingChild as ExpandableNotificationRow?)?.entry
+ buffer.log(TAG, LogLevel.INFO, {
+ str1 = entry?.key ?: "no entry"
+ }, {
+ "Tried to drag down but can't drag down on $str1"
+ })
+ }
+
+ fun logDragDownAborted() {
+ buffer.log(TAG, LogLevel.INFO, {}, {
+ "The drag down was reset"
+ })
+ }
+
+ fun logDragDownStarted(startingChild: ExpandableView?) {
+ val entry = (startingChild as ExpandableNotificationRow?)?.entry
+ buffer.log(TAG, LogLevel.INFO, {
+ str1 = entry?.key ?: "no entry"
+ }, {
+ "The drag down has started on $str1"
+ })
+ }
+
+ fun logDraggedDownLockDownShade(startingChild: View?) {
+ val entry = (startingChild as ExpandableNotificationRow?)?.entry
+ buffer.log(TAG, LogLevel.INFO, {
+ str1 = entry?.key ?: "no entry"
+ }, {
+ "Dragged down in locked down shade on $str1"
+ })
+ }
+
+ fun logDraggedDown(startingChild: View?, dragLengthY: Int) {
+ val entry = (startingChild as ExpandableNotificationRow?)?.entry
+ buffer.log(TAG, LogLevel.INFO, {
+ str1 = entry?.key ?: "no entry"
+ }, {
+ "Drag down succeeded on $str1"
+ })
+ // Do logging to event log not just our own buffer
+ lockscreenGestureLogger.write(
+ MetricsEvent.ACTION_LS_SHADE,
+ (dragLengthY / displayMetrics.density).toInt(),
+ 0 /* velocityDp */)
+ lockscreenGestureLogger.log(
+ LockscreenGestureLogger.LockscreenUiEvent.LOCKSCREEN_PULL_SHADE_OPEN)
+ }
+
+ fun logDefaultGoToFullShadeAnimation(delay: Long) {
+ buffer.log(TAG, LogLevel.DEBUG, {
+ long1 = delay
+ }, {
+ "Default animation started to full shade with delay $long1"
+ })
+ }
+
+ fun logTryGoToLockedShade(keyguard: Boolean) {
+ buffer.log(TAG, LogLevel.INFO, {
+ bool1 = keyguard
+ }, {
+ "Trying to go to locked shade " + if (bool1) "from keyguard" else "not from keyguard"
+ })
+ }
+
+ fun logShadeDisabledOnGoToLockedShade() {
+ buffer.log(TAG, LogLevel.WARNING, {}, {
+ "The shade was disabled when trying to go to the locked shade"
+ })
+ }
+
+ fun logShowBouncerOnGoToLockedShade() {
+ buffer.log(TAG, LogLevel.INFO, {}, {
+ "Showing bouncer when trying to go to the locked shade"
+ })
+ }
+
+ fun logGoingToLockedShade(customAnimationHandler: Boolean) {
+ buffer.log(TAG, LogLevel.INFO, {
+ bool1 = customAnimationHandler
+ }, {
+ "Going to locked shade " + if (customAnimationHandler) "with" else "without" +
+ " a custom handler"
+ })
+ }
+
+ fun logOnHideKeyguard() {
+ buffer.log(TAG, LogLevel.INFO, {}, {
+ "Notified that the keyguard is being hidden"
+ })
+ }
+
+ fun logPulseExpansionStarted() {
+ buffer.log(TAG, LogLevel.INFO, {}, {
+ "Pulse Expansion has started"
+ })
+ }
+
+ fun logPulseExpansionFinished(cancelled: Boolean) {
+ if (cancelled) {
+ buffer.log(TAG, LogLevel.INFO, {}, {
+ "Pulse Expansion is requested to cancel"
+ })
+ } else {
+ buffer.log(TAG, LogLevel.INFO, {}, {
+ "Pulse Expansion is requested to finish"
+ })
+ }
+ }
+
+ fun logDragDownAnimation(target: Float) {
+ buffer.log(TAG, LogLevel.DEBUG, {
+ double1 = target.toDouble()
+ }, {
+ "Drag down amount animating to " + double1
+ })
+ }
+
+ fun logAnimationCancelled(isPulse: Boolean) {
+ if (isPulse) {
+ buffer.log(TAG, LogLevel.DEBUG, {}, {
+ "Pulse animation cancelled"
+ })
+ } else {
+ buffer.log(TAG, LogLevel.DEBUG, {}, {
+ "drag down animation cancelled"
+ })
+ }
+ }
+
+ fun logDragDownAmountResetWhenFullyCollapsed() {
+ buffer.log(TAG, LogLevel.WARNING, {}, {
+ "Drag down amount stuck and reset after shade was fully collapsed"
+ })
+ }
+
+ fun logPulseHeightNotResetWhenFullyCollapsed() {
+ buffer.log(TAG, LogLevel.WARNING, {}, {
+ "Pulse height stuck and reset after shade was fully collapsed"
+ })
+ }
+
+ fun logGoingToLockedShadeAborted() {
+ buffer.log(TAG, LogLevel.INFO, {}, {
+ "Going to the Locked Shade has been aborted"
+ })
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 03b1627..4d625cf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -183,7 +183,7 @@
import com.android.systemui.statusbar.notification.row.ExpandableView;
import com.android.systemui.statusbar.notification.stack.AmbientState;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
-import com.android.systemui.statusbar.notification.stack.MediaHeaderView;
+import com.android.systemui.statusbar.notification.stack.MediaContainerView;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
@@ -1581,7 +1581,7 @@
if (row.isRemoved()) {
continue;
}
- } else if (child instanceof MediaHeaderView) {
+ } else if (child instanceof MediaContainerView) {
if (child.getVisibility() == GONE) {
continue;
}
@@ -2433,7 +2433,7 @@
// mLockscreenShadeTransitionController.getDragProgress change.
// When in lockscreen, getDragProgress indicates the true expanded fraction of QS
float shadeExpandedFraction = mTransitioningToFullShadeProgress > 0
- ? mLockscreenShadeTransitionController.getDragProgress()
+ ? mLockscreenShadeTransitionController.getQSDragProgress()
: getExpandedFraction();
mSplitShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction);
mSplitShadeHeaderController.setQsExpandedFraction(qsExpansionFraction);
@@ -4766,7 +4766,7 @@
@Override
public float getLockscreenShadeDragProgress() {
- return mLockscreenShadeTransitionController.getDragProgress();
+ return mLockscreenShadeTransitionController.getQSDragProgress();
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 1cc5e12..a9b3927 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -1412,7 +1412,8 @@
private void setUpPresenter() {
// Set up the initial notification state.
- mActivityLaunchAnimator.setCallback(mKeyguardHandler);
+ mActivityLaunchAnimator.setCallback(mActivityLaunchAnimatorCallback);
+ mActivityLaunchAnimator.addListener(mActivityLaunchAnimatorListener);
mNotificationAnimationProvider = new NotificationLaunchAnimatorControllerProvider(
mNotificationShadeWindowViewController,
mStackScrollerController.getNotificationListContainer(),
@@ -4393,7 +4394,7 @@
}
};
- private final ActivityLaunchAnimator.Callback mKeyguardHandler =
+ private final ActivityLaunchAnimator.Callback mActivityLaunchAnimatorCallback =
new ActivityLaunchAnimator.Callback() {
@Override
public boolean isOnKeyguard() {
@@ -4412,11 +4413,6 @@
}
@Override
- public void setBlursDisabledForAppLaunch(boolean disabled) {
- mKeyguardViewMediator.setBlursDisabledForAppLaunch(disabled);
- }
-
- @Override
public int getBackgroundColor(TaskInfo task) {
if (!mStartingSurfaceOptional.isPresent()) {
Log.w(TAG, "No starting surface, defaulting to SystemBGColor");
@@ -4427,6 +4423,19 @@
}
};
+ private final ActivityLaunchAnimator.Listener mActivityLaunchAnimatorListener =
+ new ActivityLaunchAnimator.Listener() {
+ @Override
+ public void onLaunchAnimationStart() {
+ mKeyguardViewMediator.setBlursDisabledForAppLaunch(true);
+ }
+
+ @Override
+ public void onLaunchAnimationEnd() {
+ mKeyguardViewMediator.setBlursDisabledForAppLaunch(false);
+ }
+ };
+
private final DemoMode mDemoModeCallback = new DemoMode() {
@Override
public void onDemoModeFinished() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java
index 51f2e67..cf9a5db 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java
@@ -490,7 +490,8 @@
}
@Override
- public void showTransient(int displayId, @InternalInsetsType int[] types) {
+ public void showTransient(int displayId, @InternalInsetsType int[] types,
+ boolean isGestureOnSystemBar) {
if (displayId != mDisplayId) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java
index e2d0bb9..31407b1 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayApplier.java
@@ -66,6 +66,8 @@
"android.theme.customization.accent_color";
static final String OVERLAY_CATEGORY_SYSTEM_PALETTE =
"android.theme.customization.system_palette";
+ static final String OVERLAY_CATEGORY_THEME_STYLE =
+ "android.theme.customization.theme_style";
static final String OVERLAY_COLOR_SOURCE = "android.theme.customization.color_source";
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
index c86d77b..fb80551 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
@@ -66,6 +66,7 @@
import com.android.systemui.flags.Flags;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.monet.ColorScheme;
+import com.android.systemui.monet.Style;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
@@ -121,8 +122,8 @@
private boolean mNeedsOverlayCreation;
// Dominant color extracted from wallpaper, NOT the color used on the overlay
protected int mMainWallpaperColor = Color.TRANSPARENT;
- // Accent color extracted from wallpaper, NOT the color used on the overlay
- protected int mWallpaperAccentColor = Color.TRANSPARENT;
+ // Theme variant: Vibrant, Tonal, Expressive, etc
+ private Style mThemeStyle = Style.TONAL_SPOT;
// Accent colors overlay
private FabricatedOverlay mSecondaryOverlay;
// Neutral system colors overlay
@@ -453,26 +454,20 @@
private void reevaluateSystemTheme(boolean forceReload) {
final WallpaperColors currentColors = mCurrentColors.get(mUserTracker.getUserId());
final int mainColor;
- final int accentCandidate;
if (currentColors == null) {
mainColor = Color.TRANSPARENT;
- accentCandidate = Color.TRANSPARENT;
} else {
mainColor = getNeutralColor(currentColors);
- accentCandidate = getAccentColor(currentColors);
}
- if (mMainWallpaperColor == mainColor && mWallpaperAccentColor == accentCandidate
- && !forceReload) {
+ if (mMainWallpaperColor == mainColor && !forceReload) {
return;
}
-
mMainWallpaperColor = mainColor;
- mWallpaperAccentColor = accentCandidate;
if (mIsMonetEnabled) {
- mSecondaryOverlay = getOverlay(mWallpaperAccentColor, ACCENT);
- mNeutralOverlay = getOverlay(mMainWallpaperColor, NEUTRAL);
+ mSecondaryOverlay = getOverlay(mMainWallpaperColor, ACCENT, mThemeStyle);
+ mNeutralOverlay = getOverlay(mMainWallpaperColor, NEUTRAL, mThemeStyle);
mNeedsOverlayCreation = true;
if (DEBUG) {
Log.d(TAG, "fetched overlays. accent: " + mSecondaryOverlay
@@ -497,11 +492,11 @@
/**
* Given a color candidate, return an overlay definition.
*/
- protected @Nullable FabricatedOverlay getOverlay(int color, int type) {
+ protected @Nullable FabricatedOverlay getOverlay(int color, int type, Style style) {
boolean nightMode = (mContext.getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
- mColorScheme = new ColorScheme(color, nightMode);
+ mColorScheme = new ColorScheme(color, nightMode, style);
List<Integer> colorShades = type == ACCENT
? mColorScheme.getAllAccentColors() : mColorScheme.getAllNeutralColors();
String name = type == ACCENT ? "accent" : "neutral";
@@ -537,6 +532,7 @@
currentUser);
if (DEBUG) Log.d(TAG, "updateThemeOverlays. Setting: " + overlayPackageJson);
final Map<String, OverlayIdentifier> categoryToPackage = new ArrayMap<>();
+ Style newStyle = mThemeStyle;
if (!TextUtils.isEmpty(overlayPackageJson)) {
try {
JSONObject object = new JSONObject(overlayPackageJson);
@@ -547,11 +543,25 @@
categoryToPackage.put(category, identifier);
}
}
+
+ try {
+ newStyle = Style.valueOf(
+ object.getString(ThemeOverlayApplier.OVERLAY_CATEGORY_THEME_STYLE));
+ } catch (IllegalArgumentException e) {
+ newStyle = Style.TONAL_SPOT;
+ }
} catch (JSONException e) {
Log.i(TAG, "Failed to parse THEME_CUSTOMIZATION_OVERLAY_PACKAGES.", e);
}
}
+ if (mIsMonetEnabled && newStyle != mThemeStyle) {
+ mThemeStyle = newStyle;
+ mNeutralOverlay = getOverlay(mMainWallpaperColor, NEUTRAL, mThemeStyle);
+ mSecondaryOverlay = getOverlay(mMainWallpaperColor, ACCENT, mThemeStyle);
+ mNeedsOverlayCreation = true;
+ }
+
// Let's generate system overlay if the style picker decided to override it.
OverlayIdentifier systemPalette = categoryToPackage.get(OVERLAY_CATEGORY_SYSTEM_PALETTE);
if (mIsMonetEnabled && systemPalette != null && systemPalette.getPackageName() != null) {
@@ -561,9 +571,11 @@
colorString = "#" + colorString;
}
int color = Color.parseColor(colorString);
- mNeutralOverlay = getOverlay(color, NEUTRAL);
+ mNeutralOverlay = getOverlay(color, NEUTRAL, mThemeStyle);
+ mSecondaryOverlay = getOverlay(color, ACCENT, mThemeStyle);
mNeedsOverlayCreation = true;
categoryToPackage.remove(OVERLAY_CATEGORY_SYSTEM_PALETTE);
+ categoryToPackage.remove(OVERLAY_CATEGORY_ACCENT_COLOR);
} catch (Exception e) {
// Color.parseColor doesn't catch any exceptions from the calls it makes
Log.w(TAG, "Invalid color definition: " + systemPalette.getPackageName(), e);
@@ -574,30 +586,6 @@
// setting. We need to sanitize the input, otherwise the overlay transaction will
// fail.
categoryToPackage.remove(OVERLAY_CATEGORY_SYSTEM_PALETTE);
- } catch (NumberFormatException e) {
- // This is a package name. All good, let's continue
- }
- }
-
- // Same for accent color.
- OverlayIdentifier accentPalette = categoryToPackage.get(OVERLAY_CATEGORY_ACCENT_COLOR);
- if (mIsMonetEnabled && accentPalette != null && accentPalette.getPackageName() != null) {
- try {
- String colorString = accentPalette.getPackageName().toLowerCase();
- if (!colorString.startsWith("#")) {
- colorString = "#" + colorString;
- }
- int color = Color.parseColor(colorString);
- mSecondaryOverlay = getOverlay(color, ACCENT);
- mNeedsOverlayCreation = true;
- categoryToPackage.remove(OVERLAY_CATEGORY_ACCENT_COLOR);
- } catch (Exception e) {
- // Color.parseColor doesn't catch any exceptions from the calls it makes
- Log.w(TAG, "Invalid color definition: " + accentPalette.getPackageName(), e);
- }
- } else if (!mIsMonetEnabled && accentPalette != null) {
- try {
- Integer.parseInt(accentPalette.getPackageName().toLowerCase(), 16);
categoryToPackage.remove(OVERLAY_CATEGORY_ACCENT_COLOR);
} catch (NumberFormatException e) {
// This is a package name. All good, let's continue
@@ -642,7 +630,6 @@
public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
pw.println("mSystemColors=" + mCurrentColors);
pw.println("mMainWallpaperColor=" + Integer.toHexString(mMainWallpaperColor));
- pw.println("mWallpaperAccentColor=" + Integer.toHexString(mWallpaperAccentColor));
pw.println("mSecondaryOverlay=" + mSecondaryOverlay);
pw.println("mNeutralOverlay=" + mNeutralOverlay);
pw.println("mIsMonetEnabled=" + mIsMonetEnabled);
@@ -650,5 +637,6 @@
pw.println("mNeedsOverlayCreation=" + mNeedsOverlayCreation);
pw.println("mAcceptColorEvents=" + mAcceptColorEvents);
pw.println("mDeferredThemeEvaluation=" + mDeferredThemeEvaluation);
+ pw.println("mThemeStyle=" + mThemeStyle);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProvider.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProvider.kt
new file mode 100644
index 0000000..1f5959e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProvider.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.unfold
+
+import android.annotation.IntDef
+import com.android.systemui.statusbar.policy.CallbackController
+import com.android.systemui.unfold.FoldStateLoggingProvider.FoldStateLoggingListener
+import com.android.systemui.unfold.FoldStateLoggingProvider.LoggedFoldedStates
+
+/** Reports device fold states for logging purposes. */
+// TODO(b/198305865): Log state changes.
+interface FoldStateLoggingProvider : CallbackController<FoldStateLoggingListener> {
+
+ fun init()
+ fun uninit()
+
+ interface FoldStateLoggingListener {
+ fun onFoldUpdate(foldStateUpdate: FoldStateChange)
+ }
+
+ @IntDef(prefix = ["LOGGED_FOLD_STATE_"], value = [FULLY_OPENED, FULLY_CLOSED, HALF_OPENED])
+ @Retention(AnnotationRetention.SOURCE)
+ annotation class LoggedFoldedStates
+}
+
+data class FoldStateChange(
+ @LoggedFoldedStates val previous: Int,
+ @LoggedFoldedStates val current: Int,
+ val dtMillis: Long
+)
+
+const val FULLY_OPENED = 1
+const val FULLY_CLOSED = 2
+const val HALF_OPENED = 3
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt
new file mode 100644
index 0000000..2683971
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldStateLoggingProviderImpl.kt
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.unfold
+
+import android.util.Log
+import com.android.systemui.unfold.FoldStateLoggingProvider.FoldStateLoggingListener
+import com.android.systemui.unfold.FoldStateLoggingProvider.LoggedFoldedStates
+import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED
+import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN
+import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_HALF_OPEN
+import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING
+import com.android.systemui.unfold.updates.FOLD_UPDATE_START_OPENING
+import com.android.systemui.unfold.updates.FoldStateProvider
+import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate
+import com.android.systemui.util.time.SystemClock
+
+/**
+ * Reports device fold states for logging purposes.
+ *
+ * Wraps the state provided by [FoldStateProvider] to output only [FULLY_OPENED], [FULLY_CLOSED] and
+ * [HALF_OPENED] for logging purposes.
+ *
+ * Note that [HALF_OPENED] state is only emitted after the device angle is stable for some timeout.
+ * Check [FoldStateProvider] impl for it.
+ *
+ * This doesn't log the following transitions:
+ * - [HALF_OPENED] -> [FULLY_OPENED]: not interesting, as there is no transition going on
+ * - [HALF_OPENED] -> [HALF_OPENED]: not meaningful.
+ */
+class FoldStateLoggingProviderImpl(
+ private val foldStateProvider: FoldStateProvider,
+ private val clock: SystemClock
+) : FoldStateLoggingProvider, FoldStateProvider.FoldUpdatesListener {
+
+ private val outputListeners: MutableList<FoldStateLoggingListener> = mutableListOf()
+
+ @LoggedFoldedStates private var lastState: Int? = null
+ private var actionStartMillis: Long? = null
+
+ override fun init() {
+ foldStateProvider.addCallback(this)
+ foldStateProvider.start()
+ }
+
+ override fun uninit() {
+ foldStateProvider.removeCallback(this)
+ foldStateProvider.stop()
+ }
+
+ override fun onHingeAngleUpdate(angle: Float) {}
+
+ override fun onFoldUpdate(@FoldUpdate update: Int) {
+ val now = clock.elapsedRealtime()
+ when (update) {
+ FOLD_UPDATE_START_OPENING -> {
+ lastState = FULLY_CLOSED
+ actionStartMillis = now
+ }
+ FOLD_UPDATE_START_CLOSING -> actionStartMillis = now
+ FOLD_UPDATE_FINISH_HALF_OPEN -> dispatchState(HALF_OPENED)
+ FOLD_UPDATE_FINISH_FULL_OPEN -> dispatchState(FULLY_OPENED)
+ FOLD_UPDATE_FINISH_CLOSED -> dispatchState(FULLY_CLOSED)
+ }
+ }
+
+ private fun dispatchState(@LoggedFoldedStates current: Int) {
+ val now = clock.elapsedRealtime()
+ val previous = lastState
+ val lastActionStart = actionStartMillis
+
+ if (previous != null && previous != current && lastActionStart != null) {
+ val time = now - lastActionStart
+ val foldStateChange = FoldStateChange(previous, current, time)
+ outputListeners.forEach { it.onFoldUpdate(foldStateChange) }
+ if (DEBUG) {
+ Log.d(TAG, "From $previous to $current in $time")
+ }
+ }
+
+ actionStartMillis = null
+ lastState = current
+ }
+
+ override fun addCallback(listener: FoldStateLoggingListener) {
+ outputListeners.add(listener)
+ }
+
+ override fun removeCallback(listener: FoldStateLoggingListener) {
+ outputListeners.remove(listener)
+ }
+}
+
+private const val DEBUG = false
+private const val TAG = "FoldStateLoggingProviderImpl"
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt b/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
index ccde316..07f9c54 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
@@ -17,10 +17,11 @@
package com.android.systemui.unfold
import com.android.keyguard.KeyguardUnfoldTransition
-import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider
-import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.phone.StatusBarMoveFromCenterAnimationController
+import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider
+import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
+import com.android.systemui.util.kotlin.getOrNull
import dagger.BindsInstance
import dagger.Module
import dagger.Provides
@@ -36,15 +37,17 @@
/**
* Creates an injectable [SysUIUnfoldComponent] that provides objects that have been scoped with
- * [@SysUIUnfoldScope]. Since [SysUIUnfoldComponent] depends upon:
+ * [@SysUIUnfoldScope].
+ *
+ * Since [SysUIUnfoldComponent] depends upon:
* * [Optional<UnfoldTransitionProgressProvider>]
* * [Optional<ScopedUnfoldTransitionProgressProvider>]
* * [Optional<NaturalRotationProgressProvider>]
+ *
* no objects will get constructed if these parameters are empty.
*/
@Module(subcomponents = [SysUIUnfoldComponent::class])
class SysUIUnfoldModule {
- constructor() {}
@Provides
@SysUISingleton
@@ -53,12 +56,16 @@
rotationProvider: Optional<NaturalRotationUnfoldProgressProvider>,
@Named(UNFOLD_STATUS_BAR) scopedProvider: Optional<ScopedUnfoldTransitionProgressProvider>,
factory: SysUIUnfoldComponent.Factory
- ) =
- provider.flatMap { p1 ->
- rotationProvider.flatMap { p2 ->
- scopedProvider.map { p3 -> factory.create(p1, p2, p3) }
- }
+ ): Optional<SysUIUnfoldComponent> {
+ val p1 = provider.getOrNull()
+ val p2 = rotationProvider.getOrNull()
+ val p3 = scopedProvider.getOrNull()
+ return if (p1 == null || p2 == null || p3 == null) {
+ Optional.empty()
+ } else {
+ Optional.of(factory.create(p1, p2, p3))
}
+ }
}
@SysUIUnfoldScope
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
index 75dfd48..f2c1561 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTransitionModule.kt
@@ -24,8 +24,10 @@
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.LifecycleScreenStatusProvider
import com.android.systemui.unfold.config.UnfoldTransitionConfig
+import com.android.systemui.unfold.updates.FoldStateProvider
import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
+import com.android.systemui.util.time.SystemClockImpl
import com.android.wm.shell.unfold.ShellUnfoldProgressProvider
import dagger.Lazy
import dagger.Module
@@ -48,7 +50,7 @@
sensorManager: SensorManager,
@Main executor: Executor,
@Main handler: Handler
- ) =
+ ): Optional<UnfoldTransitionProgressProvider> =
if (config.isEnabled) {
Optional.of(
createUnfoldTransitionProgressProvider(
@@ -59,15 +61,47 @@
sensorManager,
handler,
executor,
- tracingTagPrefix = "systemui"
- )
- )
+ tracingTagPrefix = "systemui"))
} else {
Optional.empty()
}
@Provides
@Singleton
+ fun provideFoldStateProvider(
+ context: Context,
+ config: UnfoldTransitionConfig,
+ screenStatusProvider: Lazy<LifecycleScreenStatusProvider>,
+ deviceStateManager: DeviceStateManager,
+ sensorManager: SensorManager,
+ @Main executor: Executor,
+ @Main handler: Handler
+ ): Optional<FoldStateProvider> =
+ if (!config.isHingeAngleEnabled) {
+ Optional.empty()
+ } else {
+ Optional.of(
+ createFoldStateProvider(
+ context,
+ config,
+ screenStatusProvider.get(),
+ deviceStateManager,
+ sensorManager,
+ handler,
+ executor))
+ }
+
+ @Provides
+ @Singleton
+ fun providesFoldStateLoggingProvider(
+ optionalFoldStateProvider: Optional<FoldStateProvider>
+ ): Optional<FoldStateLoggingProvider> =
+ optionalFoldStateProvider.map { foldStateProvider ->
+ FoldStateLoggingProviderImpl(foldStateProvider, SystemClockImpl())
+ }
+
+ @Provides
+ @Singleton
fun provideUnfoldTransitionConfig(context: Context): UnfoldTransitionConfig =
createConfig(context)
@@ -77,13 +111,9 @@
context: Context,
windowManager: IWindowManager,
unfoldTransitionProgressProvider: Optional<UnfoldTransitionProgressProvider>
- ) =
- unfoldTransitionProgressProvider.map {
- provider -> NaturalRotationUnfoldProgressProvider(
- context,
- windowManager,
- provider
- )
+ ): Optional<NaturalRotationUnfoldProgressProvider> =
+ unfoldTransitionProgressProvider.map { provider ->
+ NaturalRotationUnfoldProgressProvider(context, windowManager, provider)
}
@Provides
@@ -91,10 +121,8 @@
@Singleton
fun provideStatusBarScopedTransitionProvider(
source: Optional<NaturalRotationUnfoldProgressProvider>
- ) =
- source.map {
- provider -> ScopedUnfoldTransitionProgressProvider(provider)
- }
+ ): Optional<ScopedUnfoldTransitionProgressProvider> =
+ source.map { provider -> ScopedUnfoldTransitionProgressProvider(provider) }
@Provides
@Singleton
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
index e8f6de7..20c8bf3 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
@@ -74,6 +74,7 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.coordinator.BubbleCoordinator;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.notifcollection.DismissedByUserStats;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
@@ -88,6 +89,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
@@ -111,8 +113,10 @@
private final INotificationManager mNotificationManager;
private final NotificationVisibilityProvider mVisibilityProvider;
private final NotificationInterruptStateProvider mNotificationInterruptStateProvider;
+ private final NotificationLockscreenUserManager mNotifUserManager;
private final NotificationGroupManagerLegacy mNotificationGroupManager;
private final NotificationEntryManager mNotificationEntryManager;
+ private final CommonNotifCollection mCommonNotifCollection;
private final NotifPipeline mNotifPipeline;
private final Executor mSysuiMainExecutor;
@@ -139,6 +143,7 @@
NotificationLockscreenUserManager notifUserManager,
NotificationGroupManagerLegacy groupManager,
NotificationEntryManager entryManager,
+ CommonNotifCollection notifCollection,
NotifPipeline notifPipeline,
SysUiState sysUiState,
NotifPipelineFlags notifPipelineFlags,
@@ -150,8 +155,8 @@
configurationController, statusBarService, notificationManager,
visibilityProvider,
interruptionStateProvider, zenModeController, notifUserManager,
- groupManager, entryManager, notifPipeline, sysUiState, notifPipelineFlags,
- dumpManager, sysuiMainExecutor);
+ groupManager, entryManager, notifCollection, notifPipeline, sysUiState,
+ notifPipelineFlags, dumpManager, sysuiMainExecutor);
} else {
return null;
}
@@ -172,6 +177,7 @@
NotificationLockscreenUserManager notifUserManager,
NotificationGroupManagerLegacy groupManager,
NotificationEntryManager entryManager,
+ CommonNotifCollection notifCollection,
NotifPipeline notifPipeline,
SysUiState sysUiState,
NotifPipelineFlags notifPipelineFlags,
@@ -184,8 +190,10 @@
mNotificationManager = notificationManager;
mVisibilityProvider = visibilityProvider;
mNotificationInterruptStateProvider = interruptionStateProvider;
+ mNotifUserManager = notifUserManager;
mNotificationGroupManager = groupManager;
mNotificationEntryManager = entryManager;
+ mCommonNotifCollection = notifCollection;
mNotifPipeline = notifPipeline;
mSysuiMainExecutor = sysuiMainExecutor;
@@ -264,8 +272,7 @@
@Override
public void getPendingOrActiveEntry(String key, Consumer<BubbleEntry> callback) {
sysuiMainExecutor.execute(() -> {
- NotificationEntry entry =
- mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
callback.accept(entry == null ? null : notifToBubbleEntry(entry));
});
}
@@ -275,11 +282,11 @@
Consumer<List<BubbleEntry>> callback) {
sysuiMainExecutor.execute(() -> {
List<BubbleEntry> result = new ArrayList<>();
- List<NotificationEntry> activeEntries =
- mNotificationEntryManager.getActiveNotificationsForCurrentUser();
- for (int i = 0; i < activeEntries.size(); i++) {
- NotificationEntry entry = activeEntries.get(i);
- if (savedBubbleKeys.contains(entry.getKey())
+ final Collection<NotificationEntry> activeEntries =
+ mCommonNotifCollection.getAllNotifs();
+ for (NotificationEntry entry : activeEntries) {
+ if (mNotifUserManager.isCurrentProfile(entry.getSbn().getUserId())
+ && savedBubbleKeys.contains(entry.getKey())
&& mNotificationInterruptStateProvider.shouldBubbleUp(entry)
&& entry.isBubble()) {
result.add(notifToBubbleEntry(entry));
@@ -292,8 +299,7 @@
@Override
public void setNotificationInterruption(String key) {
sysuiMainExecutor.execute(() -> {
- final NotificationEntry entry =
- mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
if (entry != null
&& entry.getImportance() >= NotificationManager.IMPORTANCE_HIGH) {
entry.setInterruption();
@@ -311,8 +317,7 @@
@Override
public void notifyRemoveNotification(String key, int reason) {
sysuiMainExecutor.execute(() -> {
- final NotificationEntry entry =
- mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
if (entry != null) {
for (NotifCallback cb : mCallbacks) {
cb.removeNotification(entry, getDismissedByUserStats(entry, true),
@@ -334,8 +339,7 @@
@Override
public void notifyMaybeCancelSummary(String key) {
sysuiMainExecutor.execute(() -> {
- final NotificationEntry entry =
- mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
if (entry != null) {
for (NotifCallback cb : mCallbacks) {
cb.maybeCancelSummary(entry);
@@ -347,8 +351,7 @@
@Override
public void removeNotificationEntry(String key) {
sysuiMainExecutor.execute(() -> {
- final NotificationEntry entry =
- mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
if (entry != null) {
mNotificationGroupManager.onEntryRemoved(entry);
}
@@ -358,8 +361,7 @@
@Override
public void updateNotificationBubbleButton(String key) {
sysuiMainExecutor.execute(() -> {
- final NotificationEntry entry =
- mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
if (entry != null && entry.getRow() != null) {
entry.getRow().updateBubbleButton();
}
@@ -369,8 +371,7 @@
@Override
public void updateNotificationSuppression(String key) {
sysuiMainExecutor.execute(() -> {
- final NotificationEntry entry =
- mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
if (entry != null) {
mNotificationGroupManager.updateSuppression(entry);
}
@@ -402,8 +403,7 @@
@Override
public void onUnbubbleConversation(String key) {
sysuiMainExecutor.execute(() -> {
- final NotificationEntry entry =
- mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
if (entry != null) {
onUserChangedBubble(entry, false /* shouldBubble */);
}
@@ -580,7 +580,7 @@
HashMap<String, Pair<BubbleEntry, Boolean>> pendingOrActiveNotif = new HashMap<>();
for (int i = 0; i < orderedKeys.length; i++) {
String key = orderedKeys[i];
- NotificationEntry entry = mNotificationEntryManager.getPendingOrActiveNotif(key);
+ final NotificationEntry entry = mCommonNotifCollection.getEntry(key);
BubbleEntry bubbleEntry = entry != null
? notifToBubbleEntry(entry)
: null;
@@ -761,7 +761,7 @@
}
static BubbleEntry notifToBubbleEntry(NotificationEntry e) {
- return new BubbleEntry(e.getSbn(), e.getRanking(), e.isClearable(),
+ return new BubbleEntry(e.getSbn(), e.getRanking(), e.isDismissable(),
e.shouldSuppressNotificationDot(), e.shouldSuppressNotificationList(),
e.shouldSuppressPeek());
}
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
index cbd6e86..0369d5b 100644
--- a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -110,6 +110,17 @@
private Collection<String> getClassNamesFromClassPath() {
ClassPathScanner scanner = new ClassPathScanner(mContext.getPackageCodePath());
+ ChainedClassNameFilter filter = makeClassNameFilter();
+
+ try {
+ return scanner.getClassPathEntries(filter);
+ } catch (IOException e) {
+ Log.e(getTag(), "Failed to scan classes", e);
+ }
+ return Collections.emptyList();
+ }
+
+ protected ChainedClassNameFilter makeClassNameFilter() {
ChainedClassNameFilter filter = new ChainedClassNameFilter();
filter.add(new ExternalClassNameFilter());
@@ -122,13 +133,7 @@
// the main SystemUI process. Therefore, exclude this package
// from the base class whitelist.
filter.add(s -> !s.startsWith("com.android.systemui.screenshot"));
-
- try {
- return scanner.getClassPathEntries(filter);
- } catch (IOException e) {
- Log.e(TAG, "Failed to scan classes", e);
- }
- return Collections.emptyList();
+ return filter;
}
private String getClsStr() {
@@ -212,8 +217,12 @@
* as loggable to limit log spam during normal use.
*/
private void logDebug(String msg) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, msg);
+ if (Log.isLoggable(getTag(), Log.DEBUG)) {
+ Log.d(getTag(), msg);
}
}
+
+ protected String getTag() {
+ return TAG;
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt
new file mode 100644
index 0000000..6bc6505
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardBiometricLockoutLoggerTest.kt
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.keyguard
+
+import android.hardware.biometrics.BiometricSourceType
+import org.mockito.Mockito.verify
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.UiEventLogger
+import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT
+import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.dump.DumpManager
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.Mock
+import org.mockito.Mockito.verifyNoMoreInteractions
+import org.mockito.Mockito.`when` as whenever
+import org.mockito.MockitoAnnotations
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class KeyguardBiometricLockoutLoggerTest : SysuiTestCase() {
+ @Mock
+ lateinit var uiEventLogger: UiEventLogger
+ @Mock
+ lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
+ @Mock
+ lateinit var dumpManager: DumpManager
+ @Mock
+ lateinit var strongAuthTracker: KeyguardUpdateMonitor.StrongAuthTracker
+
+ @Captor
+ lateinit var updateMonitorCallbackCaptor: ArgumentCaptor<KeyguardUpdateMonitorCallback>
+ lateinit var updateMonitorCallback: KeyguardUpdateMonitorCallback
+
+ lateinit var keyguardBiometricLockoutLogger: KeyguardBiometricLockoutLogger
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ whenever(keyguardUpdateMonitor.strongAuthTracker).thenReturn(strongAuthTracker)
+ keyguardBiometricLockoutLogger = KeyguardBiometricLockoutLogger(
+ mContext,
+ uiEventLogger,
+ keyguardUpdateMonitor,
+ dumpManager)
+ }
+
+ @Test
+ fun test_logsOnStart() {
+ // GIVEN is encrypted / lockdown before start
+ whenever(keyguardUpdateMonitor.isEncryptedOrLockdown(anyInt()))
+ .thenReturn(true)
+
+ // WHEN start
+ keyguardBiometricLockoutLogger.start()
+
+ // THEN encrypted / lockdown state is logged
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_ENCRYPTED_OR_LOCKDOWN)
+ }
+
+ @Test
+ fun test_logTimeoutChange() {
+ keyguardBiometricLockoutLogger.start()
+ captureUpdateMonitorCallback()
+
+ // GIVEN primary auth required b/c timeout
+ whenever(strongAuthTracker.getStrongAuthForUser(anyInt()))
+ .thenReturn(STRONG_AUTH_REQUIRED_AFTER_TIMEOUT)
+
+ // WHEN primary auth requirement changes
+ updateMonitorCallback.onStrongAuthStateChanged(0)
+
+ // THEN primary auth required state is logged
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_TIMEOUT)
+ }
+
+ @Test
+ fun test_logUnattendedUpdate() {
+ keyguardBiometricLockoutLogger.start()
+ captureUpdateMonitorCallback()
+
+ // GIVEN primary auth required b/c unattended update
+ whenever(strongAuthTracker.getStrongAuthForUser(anyInt()))
+ .thenReturn(STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE)
+
+ // WHEN primary auth requirement changes
+ updateMonitorCallback.onStrongAuthStateChanged(0)
+
+ // THEN primary auth required state is logged
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE)
+ }
+
+ @Test
+ fun test_logMultipleChanges() {
+ keyguardBiometricLockoutLogger.start()
+ captureUpdateMonitorCallback()
+
+ // GIVEN primary auth required b/c timeout
+ whenever(strongAuthTracker.getStrongAuthForUser(anyInt()))
+ .thenReturn(STRONG_AUTH_REQUIRED_AFTER_TIMEOUT
+ or STRONG_AUTH_REQUIRED_FOR_UNATTENDED_UPDATE)
+
+ // WHEN primary auth requirement changes
+ updateMonitorCallback.onStrongAuthStateChanged(0)
+
+ // THEN primary auth required state is logged with all the reasons
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_TIMEOUT)
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_UNATTENDED_UPDATE)
+
+ // WHEN onStrongAuthStateChanged is called again
+ updateMonitorCallback.onStrongAuthStateChanged(0)
+
+ // THEN no more events are sent since there haven't been any changes
+ verifyNoMoreInteractions(uiEventLogger)
+ }
+
+ @Test
+ fun test_logFaceLockout() {
+ keyguardBiometricLockoutLogger.start()
+ captureUpdateMonitorCallback()
+
+ // GIVEN primary auth required b/c face lock
+ whenever(keyguardUpdateMonitor.isFaceLockedOut).thenReturn(true)
+
+ // WHEN lockout state changes
+ updateMonitorCallback.onLockedOutStateChanged(BiometricSourceType.FACE)
+
+ // THEN primary auth required state is logged
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT)
+
+ // WHEN face lockout is reset
+ whenever(keyguardUpdateMonitor.isFaceLockedOut).thenReturn(false)
+ updateMonitorCallback.onLockedOutStateChanged(BiometricSourceType.FACE)
+
+ // THEN primary auth required state is logged
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_FACE_LOCKED_OUT_RESET)
+ }
+
+ @Test
+ fun test_logFingerprintLockout() {
+ keyguardBiometricLockoutLogger.start()
+ captureUpdateMonitorCallback()
+
+ // GIVEN primary auth required b/c fingerprint lock
+ whenever(keyguardUpdateMonitor.isFingerprintLockedOut).thenReturn(true)
+
+ // WHEN lockout state changes
+ updateMonitorCallback.onLockedOutStateChanged(BiometricSourceType.FINGERPRINT)
+
+ // THEN primary auth required state is logged
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT)
+
+ // WHEN fingerprint lockout is reset
+ whenever(keyguardUpdateMonitor.isFingerprintLockedOut).thenReturn(false)
+ updateMonitorCallback.onLockedOutStateChanged(BiometricSourceType.FINGERPRINT)
+
+ // THEN primary auth required state is logged
+ verify(uiEventLogger).log(KeyguardBiometricLockoutLogger.PrimaryAuthRequiredEvent
+ .PRIMARY_AUTH_REQUIRED_FINGERPRINT_LOCKED_OUT_RESET)
+ }
+
+ fun captureUpdateMonitorCallback() {
+ verify(keyguardUpdateMonitor).registerCallback(updateMonitorCallbackCaptor.capture())
+ updateMonitorCallback = updateMonitorCallbackCaptor.value
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
index c873804..599e547 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java
@@ -48,6 +48,7 @@
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingCollector;
+import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -116,6 +117,8 @@
@Mock
private GlobalSettings mGlobalSettings;
@Mock
+ private FeatureFlags mFeatureFlags;
+ @Mock
private UserSwitcherController mUserSwitcherController;
private Configuration mConfiguration;
@@ -151,7 +154,7 @@
mKeyguardUpdateMonitor, mKeyguardSecurityModel, mMetricsLogger, mUiEventLogger,
mKeyguardStateController, mKeyguardSecurityViewFlipperController,
mConfigurationController, mFalsingCollector, mFalsingManager,
- mUserSwitcherController, mGlobalSettings).create(mSecurityCallback);
+ mUserSwitcherController, mFeatureFlags, mGlobalSettings).create(mSecurityCallback);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
index 40549d69..8c20b24 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
@@ -29,8 +29,10 @@
import com.android.systemui.utils.leaks.LeakCheckedTest.SysuiLeakCheck;
import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Rule;
+import org.mockito.Mockito;
public abstract class SysuiBaseFragmentTest extends BaseFragmentTest {
@@ -78,6 +80,11 @@
SystemUIFactory.cleanup();
}
+ @AfterClass
+ public static void mockitoTeardown() {
+ Mockito.framework().clearInlineMocks();
+ }
+
@Override
protected SysuiTestableContext getContext() {
return new SysuiTestableContext(InstrumentationRegistry.getContext(), mLeakCheck);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
index 1fe3d44..589eeb5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt
@@ -21,13 +21,12 @@
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.util.mockito.any
-import com.android.systemui.util.mockito.eq
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertNotNull
import junit.framework.Assert.assertNull
import junit.framework.Assert.assertTrue
import junit.framework.AssertionFailedError
-import kotlin.concurrent.thread
+import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -40,6 +39,7 @@
import org.mockito.Mockito.verify
import org.mockito.Spy
import org.mockito.junit.MockitoJUnit
+import kotlin.concurrent.thread
@SmallTest
@RunWith(AndroidTestingRunner::class)
@@ -48,6 +48,7 @@
private val launchContainer = LinearLayout(mContext)
private val launchAnimator = LaunchAnimator(TEST_TIMINGS, TEST_INTERPOLATORS)
@Mock lateinit var callback: ActivityLaunchAnimator.Callback
+ @Mock lateinit var listener: ActivityLaunchAnimator.Listener
@Spy private val controller = TestLaunchAnimatorController(launchContainer)
@Mock lateinit var iCallback: IRemoteAnimationFinishedCallback
@Mock lateinit var failHandler: Log.TerribleFailureHandler
@@ -59,6 +60,12 @@
fun setup() {
activityLaunchAnimator = ActivityLaunchAnimator(launchAnimator)
activityLaunchAnimator.callback = callback
+ activityLaunchAnimator.addListener(listener)
+ }
+
+ @After
+ fun tearDown() {
+ activityLaunchAnimator.removeListener(listener)
}
private fun startIntentWithAnimation(
@@ -177,7 +184,7 @@
val runner = activityLaunchAnimator.createRunner(controller)
runner.onAnimationStart(0, arrayOf(fakeWindow()), emptyArray(), emptyArray(), iCallback)
waitForIdleSync()
- verify(callback).setBlursDisabledForAppLaunch(eq(true))
+ verify(listener).onLaunchAnimationStart()
verify(controller).onLaunchAnimationStart(anyBoolean())
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
index 84eb935..066a866 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
@@ -37,6 +37,7 @@
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.LockscreenShadeTransitionController
@@ -89,6 +90,7 @@
@Mock private lateinit var udfpsController: UdfpsController
@Mock private lateinit var udfpsView: UdfpsView
@Mock private lateinit var udfpsEnrollView: UdfpsEnrollView
+ @Mock private lateinit var activityLaunchAnimator: ActivityLaunchAnimator
private val sensorProps = SensorLocationInternal("", 10, 100, 20)
.asFingerprintSensorProperties()
@@ -118,7 +120,7 @@
keyguardUpdateMonitor, dialogManager, dumpManager, transitionController,
configurationController, systemClock, keyguardStateController,
unlockedScreenOffAnimationController, sensorProps, hbmProvider, reason,
- controllerCallback, onTouch)
+ controllerCallback, onTouch, activityLaunchAnimator)
block()
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 2afcbda..159bdba 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -58,6 +58,7 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.plugins.FalsingManager;
@@ -180,6 +181,8 @@
private TypedArray mBrightnessBacklight;
@Mock
private SystemUIDialogManager mSystemUIDialogManager;
+ @Mock
+ private ActivityLaunchAnimator mActivityLaunchAnimator;
// Capture listeners so that they can be used to send events
@Captor private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor;
@@ -252,7 +255,8 @@
mSystemClock,
mUnlockedScreenOffAnimationController,
mSystemUIDialogManager,
- mLatencyTracker);
+ mLatencyTracker,
+ mActivityLaunchAnimator);
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue();
verify(mScreenLifecycle).addObserver(mScreenObserverCaptor.capture());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
index 0ae3c39..e9a4e15 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerTest.java
@@ -36,6 +36,7 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -96,6 +97,8 @@
private SystemUIDialogManager mDialogManager;
@Mock
private UdfpsController mUdfpsController;
+ @Mock
+ private ActivityLaunchAnimator mActivityLaunchAnimator;
private FakeSystemClock mSystemClock = new FakeSystemClock();
private UdfpsKeyguardViewController mController;
@@ -134,7 +137,8 @@
mKeyguardStateController,
mUnlockedScreenOffAnimationController,
mDialogManager,
- mUdfpsController);
+ mUdfpsController,
+ mActivityLaunchAnimator);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
index 8cd8e4d..c0b7271 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java
@@ -16,12 +16,15 @@
package com.android.systemui.dreams;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Intent;
import android.os.IBinder;
+import android.service.dreams.DreamService;
import android.service.dreams.IDreamOverlay;
import android.service.dreams.IDreamOverlayCallback;
import android.testing.AndroidTestingRunner;
@@ -195,4 +198,22 @@
mService.onDestroy();
verify(mDreamOverlayStateController).removeCallback(callbackCapture.getValue());
}
+
+ @Test
+ public void testShouldShowComplicationsTrueByDefault() {
+ assertThat(mService.shouldShowComplications()).isTrue();
+
+ mService.onBind(new Intent());
+
+ assertThat(mService.shouldShowComplications()).isTrue();
+ }
+
+ @Test
+ public void testShouldShowComplicationsSetByIntentExtra() {
+ final Intent intent = new Intent();
+ intent.putExtra(DreamService.EXTRA_SHOW_COMPLICATIONS, false);
+ mService.onBind(intent);
+
+ assertThat(mService.shouldShowComplications()).isFalse();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/KeyguardMediaControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/KeyguardMediaControllerTest.kt
index 8cc2776..43d9a75 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/KeyguardMediaControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/KeyguardMediaControllerTest.kt
@@ -25,7 +25,7 @@
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
-import com.android.systemui.statusbar.notification.stack.MediaHeaderView
+import com.android.systemui.statusbar.notification.stack.MediaContainerView
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.animation.UniqueObjectHostView
@@ -57,7 +57,7 @@
@JvmField @Rule
val mockito = MockitoJUnit.rule()
- private val mediaHeaderView: MediaHeaderView = MediaHeaderView(context, null)
+ private val mediaContainerView: MediaContainerView = MediaContainerView(context, null)
private val hostView = UniqueObjectHostView(context)
private lateinit var keyguardMediaController: KeyguardMediaController
@@ -78,7 +78,7 @@
context,
configurationController
)
- keyguardMediaController.attachSinglePaneContainer(mediaHeaderView)
+ keyguardMediaController.attachSinglePaneContainer(mediaContainerView)
keyguardMediaController.useSplitShade = false
}
@@ -88,7 +88,7 @@
keyguardMediaController.refreshMediaPosition()
- assertThat(mediaHeaderView.visibility).isEqualTo(GONE)
+ assertThat(mediaContainerView.visibility).isEqualTo(GONE)
}
@Test
@@ -102,7 +102,7 @@
private fun testStateVisibility(state: Int, visibility: Int) {
whenever(statusBarStateController.state).thenReturn(state)
keyguardMediaController.refreshMediaPosition()
- assertThat(mediaHeaderView.visibility).isEqualTo(visibility)
+ assertThat(mediaContainerView.visibility).isEqualTo(visibility)
}
@Test
@@ -112,7 +112,7 @@
keyguardMediaController.refreshMediaPosition()
- assertThat(mediaHeaderView.visibility).isEqualTo(GONE)
+ assertThat(mediaContainerView.visibility).isEqualTo(GONE)
}
@Test
@@ -130,7 +130,7 @@
keyguardMediaController.attachSplitShadeContainer(splitShadeContainer)
assertThat(splitShadeContainer.visibility).isEqualTo(GONE)
- assertThat(mediaHeaderView.visibility).isEqualTo(VISIBLE)
+ assertThat(mediaContainerView.visibility).isEqualTo(VISIBLE)
}
@Test
@@ -149,6 +149,6 @@
keyguardMediaController.attachSplitShadeContainer(splitShadeContainer)
assertTrue("HostView wasn't attached to the single pane container",
- mediaHeaderView.childCount == 1)
+ mediaContainerView.childCount == 1)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index 7763e75..140a395 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -202,6 +202,7 @@
resumeAction = null)
whenever(mediaFlags.areMediaSessionActionsEnabled()).thenReturn(false)
+ whenever(mediaFlags.useMediaSessionLayout()).thenReturn(false)
}
/** Mock view holder for the notification player */
@@ -301,8 +302,47 @@
}
@Test
- fun bindSemanticActions() {
+ fun bindSemanticActionsOldLayout() {
whenever(mediaFlags.areMediaSessionActionsEnabled()).thenReturn(true)
+ whenever(mediaFlags.useMediaSessionLayout()).thenReturn(false)
+
+ val icon = Icon.createWithResource(context, android.R.drawable.ic_media_play)
+ val semanticActions = MediaButton(
+ playOrPause = MediaAction(icon, Runnable {}, "play"),
+ nextOrCustom = MediaAction(icon, Runnable {}, "next"),
+ startCustom = MediaAction(icon, null, "custom 1"),
+ endCustom = MediaAction(icon, null, "custom 2")
+ )
+ val state = mediaData.copy(semanticActions = semanticActions)
+
+ player.attachPlayer(holder, MediaViewController.TYPE.PLAYER)
+ player.bindPlayer(state, PACKAGE)
+
+ verify(expandedSet).setVisibility(R.id.action0, ConstraintSet.VISIBLE)
+ assertThat(action0.contentDescription).isEqualTo("custom 1")
+ assertThat(action0.isEnabled()).isFalse()
+
+ verify(expandedSet).setVisibility(R.id.action1, ConstraintSet.INVISIBLE)
+ assertThat(action1.isEnabled()).isFalse()
+
+ verify(expandedSet).setVisibility(R.id.action2, ConstraintSet.VISIBLE)
+ assertThat(action2.isEnabled()).isTrue()
+ assertThat(action2.contentDescription).isEqualTo("play")
+
+ verify(expandedSet).setVisibility(R.id.action3, ConstraintSet.VISIBLE)
+ assertThat(action3.isEnabled()).isTrue()
+ assertThat(action3.contentDescription).isEqualTo("next")
+
+ verify(expandedSet).setVisibility(R.id.action4, ConstraintSet.VISIBLE)
+ assertThat(action4.contentDescription).isEqualTo("custom 2")
+ assertThat(action4.isEnabled()).isFalse()
+ }
+
+ @Test
+ fun bindSemanticActionsNewLayout() {
+ whenever(mediaFlags.areMediaSessionActionsEnabled()).thenReturn(true)
+ whenever(mediaFlags.useMediaSessionLayout()).thenReturn(true)
+
val icon = Icon.createWithResource(context, android.R.drawable.ic_media_play)
val semanticActions = MediaButton(
playOrPause = MediaAction(icon, Runnable {}, "play"),
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
index 2e1fb07..8ccf559 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java
@@ -218,7 +218,8 @@
String expected = "TestableQSPanelControllerBase:\n"
+ " Tile records:\n"
+ " " + mockTileString + "\n"
- + " " + mockTileViewString + "\n";
+ + " " + mockTileViewString + "\n"
+ + " media bounds: null\n";
assertEquals(expected, w.getBuffer().toString());
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileRequestDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileRequestDialogTest.kt
index f56a185..2ad9c94 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileRequestDialogTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileRequestDialogTest.kt
@@ -130,4 +130,37 @@
val tile = content.getChildAt(1) as QSTileView
assertThat((tile.icon.iconView as ImageView).drawable).isNotNull()
}
+
+ @Test
+ fun setTileData_hasNoStateDescription() {
+ val icon = Icon.createWithResource(mContext, R.drawable.cloud)
+ val tileData = TileRequestDialog.TileData(APP_NAME, LABEL, icon)
+
+ dialog.setTileData(tileData)
+ dialog.show()
+
+ TestableLooper.get(this).processAllMessages()
+
+ val content = dialog.requireViewById<ViewGroup>(TileRequestDialog.CONTENT_ID)
+ val tile = content.getChildAt(1) as QSTileView
+
+ assertThat(tile.stateDescription).isEqualTo("")
+ }
+
+ @Test
+ fun setTileData_tileNotClickable() {
+ val icon = Icon.createWithResource(mContext, R.drawable.cloud)
+ val tileData = TileRequestDialog.TileData(APP_NAME, LABEL, icon)
+
+ dialog.setTileData(tileData)
+ dialog.show()
+
+ TestableLooper.get(this).processAllMessages()
+
+ val content = dialog.requireViewById<ViewGroup>(TileRequestDialog.CONTENT_ID)
+ val tile = content.getChildAt(1) as QSTileView
+
+ assertThat(tile.isClickable).isFalse()
+ assertThat(tile.isLongClickable).isFalse()
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index 5de4c11..6c29ecc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -151,17 +151,17 @@
@Test
public void testShowTransient() {
int[] types = new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR};
- mCommandQueue.showTransient(DEFAULT_DISPLAY, types);
+ mCommandQueue.showTransient(DEFAULT_DISPLAY, types, true /* isGestureOnSystemBar */);
waitForIdleSync();
- verify(mCallbacks).showTransient(eq(DEFAULT_DISPLAY), eq(types));
+ verify(mCallbacks).showTransient(eq(DEFAULT_DISPLAY), eq(types), eq(true));
}
@Test
public void testShowTransientForSecondaryDisplay() {
int[] types = new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR};
- mCommandQueue.showTransient(SECONDARY_DISPLAY, types);
+ mCommandQueue.showTransient(SECONDARY_DISPLAY, types, true /* isGestureOnSystemBar */);
waitForIdleSync();
- verify(mCallbacks).showTransient(eq(SECONDARY_DISPLAY), eq(types));
+ verify(mCallbacks).showTransient(eq(SECONDARY_DISPLAY), eq(types), eq(true));
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/DisableFlagsLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/DisableFlagsLoggerTest.kt
index 38ad6b8..c0d1155 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/DisableFlagsLoggerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/DisableFlagsLoggerTest.kt
@@ -37,7 +37,7 @@
private val disableFlagsLogger = DisableFlagsLogger(disable1Flags, disable2Flags)
@Test
- fun getDisableFlagsString_oldAndNewSame_statesLoggedButDiffsNotLogged() {
+ fun getDisableFlagsString_oldAndNewSame_newAndUnchangedLoggedOldNotLogged() {
val state = DisableFlagsLogger.DisableState(
0b111, // ABC
0b01 // mN
@@ -45,10 +45,9 @@
val result = disableFlagsLogger.getDisableFlagsString(state, state)
- assertThat(result).contains("Old: ABC.mN")
- assertThat(result).contains("New: ABC.mN")
- assertThat(result).doesNotContain("(")
- assertThat(result).doesNotContain(")")
+ assertThat(result).doesNotContain("Old")
+ assertThat(result).contains("ABC.mN")
+ assertThat(result).contains("(unchanged)")
}
@Test
@@ -66,7 +65,7 @@
assertThat(result).contains("Old: ABC.mN")
assertThat(result).contains("New: abC.Mn")
- assertThat(result).contains("(ab.Mn)")
+ assertThat(result).contains("(changed: ab.Mn)")
}
@Test
@@ -82,7 +81,7 @@
)
)
- assertThat(result).contains("(.n)")
+ assertThat(result).contains("(changed: .n)")
}
@Test
@@ -96,8 +95,7 @@
)
assertThat(result).doesNotContain("Old")
- assertThat(result).contains("New: abC.mN")
- // We have no state to diff on, so we shouldn't see any diff in parentheses
+ assertThat(result).contains("abC.mN")
assertThat(result).doesNotContain("(")
assertThat(result).doesNotContain(")")
}
@@ -141,7 +139,7 @@
)
)
- assertThat(result).contains("local modification: Abc.Mn (A.M)")
+ assertThat(result).contains("local modification: Abc.Mn (changed: A.M)")
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
index 89435ae..13b8e81 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt
@@ -9,6 +9,8 @@
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollector
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.log.LogBuffer
import com.android.systemui.media.MediaHierarchyManager
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.qs.QS
@@ -18,7 +20,7 @@
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
import com.android.systemui.statusbar.phone.KeyguardBypassController
-import com.android.systemui.statusbar.phone.LockscreenGestureLogger
+import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.phone.StatusBar
@@ -56,7 +58,8 @@
lateinit var transitionController: LockscreenShadeTransitionController
lateinit var row: ExpandableNotificationRow
@Mock lateinit var statusbarStateController: SysuiStatusBarStateController
- @Mock lateinit var lockscreenGestureLogger: LockscreenGestureLogger
+ @Mock lateinit var logger: LSShadeTransitionLogger
+ @Mock lateinit var dumpManager: DumpManager
@Mock lateinit var keyguardBypassController: KeyguardBypassController
@Mock lateinit var lockScreenUserManager: NotificationLockscreenUserManager
@Mock lateinit var falsingCollector: FalsingCollector
@@ -66,6 +69,7 @@
@Mock lateinit var scrimController: ScrimController
@Mock lateinit var configurationController: ConfigurationController
@Mock lateinit var falsingManager: FalsingManager
+ @Mock lateinit var buffer: LogBuffer
@Mock lateinit var notificationPanelController: NotificationPanelViewController
@Mock lateinit var nsslController: NotificationStackScrollLayoutController
@Mock lateinit var depthController: NotificationShadeDepthController
@@ -86,18 +90,18 @@
.addOverride(R.bool.config_use_split_notification_shade, false)
transitionController = LockscreenShadeTransitionController(
statusBarStateController = statusbarStateController,
- lockscreenGestureLogger = lockscreenGestureLogger,
+ logger = logger,
keyguardBypassController = keyguardBypassController,
lockScreenUserManager = lockScreenUserManager,
falsingCollector = falsingCollector,
ambientState = ambientState,
- displayMetrics = displayMetrics,
mediaHierarchyManager = mediaHierarchyManager,
scrimController = scrimController,
depthController = depthController,
context = context,
configurationController = configurationController,
- falsingManager = falsingManager
+ falsingManager = falsingManager,
+ dumpManager = dumpManager
)
whenever(nsslController.view).thenReturn(stackscroller)
whenever(nsslController.expandHelperCallback).thenReturn(expandHelperCallback)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java
index 41163bf..a7f8b6e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java
@@ -16,7 +16,9 @@
package com.android.systemui.statusbar.notification.collection;
+import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
import static android.app.Notification.FLAG_NO_CLEAR;
+import static android.app.Notification.FLAG_ONGOING_EVENT;
import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_CLICK;
@@ -797,7 +799,7 @@
}
@Test
- public void testDismissingSummaryDoesNotDismissForegroundServiceChildren() {
+ public void testDismissingSummaryDoesDismissForegroundServiceChildren() {
// GIVEN a collection with three grouped notifs in it
CollectionEvent notif0 = postNotif(
buildNotif(TEST_PACKAGE, 0)
@@ -814,7 +816,31 @@
// WHEN the summary is dismissed
mCollection.dismissNotification(notif0.entry, defaultStats(notif0.entry));
- // THEN the foreground service child is not dismissed
+ // THEN the foreground service child is dismissed
+ assertEquals(DISMISSED, notif0.entry.getDismissState());
+ assertEquals(PARENT_DISMISSED, notif1.entry.getDismissState());
+ assertEquals(PARENT_DISMISSED, notif2.entry.getDismissState());
+ }
+
+ @Test
+ public void testDismissingSummaryDoesNotDismissOngoingChildren() {
+ // GIVEN a collection with three grouped notifs in it
+ CollectionEvent notif0 = postNotif(
+ buildNotif(TEST_PACKAGE, 0)
+ .setGroup(mContext, GROUP_1)
+ .setGroupSummary(mContext, true));
+ CollectionEvent notif1 = postNotif(
+ buildNotif(TEST_PACKAGE, 1)
+ .setGroup(mContext, GROUP_1)
+ .setFlag(mContext, FLAG_ONGOING_EVENT, true));
+ CollectionEvent notif2 = postNotif(
+ buildNotif(TEST_PACKAGE, 2)
+ .setGroup(mContext, GROUP_1));
+
+ // WHEN the summary is dismissed
+ mCollection.dismissNotification(notif0.entry, defaultStats(notif0.entry));
+
+ // THEN the ongoing child is not dismissed
assertEquals(DISMISSED, notif0.entry.getDismissState());
assertEquals(NOT_DISMISSED, notif1.entry.getDismissState());
assertEquals(PARENT_DISMISSED, notif2.entry.getDismissState());
@@ -1427,6 +1453,37 @@
verify(mCollectionListener, never()).onEntryUpdated(any(), anyBoolean());
}
+ @Test
+ public void testCannotDismissOngoingNotificationChildren() {
+ // GIVEN an ongoing notification
+ final NotificationEntry container = new NotificationEntryBuilder()
+ .setPkg(TEST_PACKAGE)
+ .setId(47)
+ .setGroup(mContext, "group")
+ .setFlag(mContext, FLAG_ONGOING_EVENT, true)
+ .build();
+
+ // THEN its children are not dismissible
+ assertFalse(mCollection.shouldAutoDismissChildren(
+ container, container.getSbn().getGroupKey()));
+ }
+
+ @Test
+ public void testCanDismissFgsNotificationChildren() {
+ // GIVEN an FGS but not ongoing notification
+ final NotificationEntry container = new NotificationEntryBuilder()
+ .setPkg(TEST_PACKAGE)
+ .setId(47)
+ .setGroup(mContext, "group")
+ .setFlag(mContext, FLAG_FOREGROUND_SERVICE, true)
+ .build();
+ container.setDismissState(NOT_DISMISSED);
+
+ // THEN its children are dismissible
+ assertTrue(mCollection.shouldAutoDismissChildren(
+ container, container.getSbn().getGroupKey()));
+ }
+
private static NotificationEntryBuilder buildNotif(String pkg, int id, String tag) {
return new NotificationEntryBuilder()
.setPkg(pkg)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
index a11b46d..b3ee5f8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.java
@@ -140,10 +140,13 @@
public void testCancelStickyNotification() {
when(mHeadsUpManager.isSticky(anyString())).thenReturn(true);
addHUN(mEntry);
+ when(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false, true);
when(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 0L);
assertTrue(mNotifLifetimeExtender.shouldExtendLifetime(mEntry, 0));
mClock.advanceTime(1000L);
mExecutor.runAllReady();
+ verify(mHeadsUpManager, times(0))
+ .removeNotification(anyString(), eq(false));
verify(mHeadsUpManager, times(1))
.removeNotification(anyString(), eq(true));
}
@@ -157,6 +160,22 @@
mClock.advanceTime(1000L);
mExecutor.runAllReady();
verify(mHeadsUpManager, times(0))
+ .removeNotification(anyString(), eq(false));
+ verify(mHeadsUpManager, times(0))
+ .removeNotification(anyString(), eq(true));
+ }
+
+ @Test
+ public void testCancelNotification() {
+ when(mHeadsUpManager.isSticky(anyString())).thenReturn(false);
+ addHUN(mEntry);
+ when(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 500L);
+ assertTrue(mNotifLifetimeExtender.shouldExtendLifetime(mEntry, 0));
+ mClock.advanceTime(1000L);
+ mExecutor.runAllReady();
+ verify(mHeadsUpManager, times(1))
+ .removeNotification(anyString(), eq(false));
+ verify(mHeadsUpManager, times(0))
.removeNotification(anyString(), eq(true));
}
@@ -189,6 +208,13 @@
// GIVEN there is a HUN, mEntry
addHUN(mEntry);
+ given(mHeadsUpManager.canRemoveImmediately(anyString())).willAnswer(i -> {
+ String key = i.getArgument(0);
+ for (NotificationEntry entry : mHuns) {
+ if (entry.getKey().equals(key)) return false;
+ }
+ return true;
+ });
// THEN only the current HUN, mEntry, should be lifetimeExtended
assertTrue(mNotifLifetimeExtender.shouldExtendLifetime(mEntry, /* cancellationReason */ 0));
assertFalse(mNotifLifetimeExtender.shouldExtendLifetime(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderTest.kt
index 5271745..f773810 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/render/NodeSpecBuilderTest.kt
@@ -18,6 +18,7 @@
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager
import com.android.systemui.statusbar.notification.collection.GroupEntry
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder
import com.android.systemui.statusbar.notification.collection.ListEntry
@@ -31,18 +32,18 @@
import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT
import com.android.systemui.statusbar.notification.stack.PriorityBucket
import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.mock
import org.junit.Before
import org.junit.Test
-import org.mockito.Mock
import org.mockito.Mockito
-import org.mockito.Mockito.`when`
-import org.mockito.MockitoAnnotations
+import org.mockito.Mockito.`when` as whenever
@SmallTest
class NodeSpecBuilderTest : SysuiTestCase() {
- @Mock
- private lateinit var viewBarn: NotifViewBarn
+ private val mediaContainerController: MediaContainerController = mock()
+ private val sectionsFeatureManager: NotificationSectionsFeatureManager = mock()
+ private val viewBarn: NotifViewBarn = mock()
private var rootController: NodeController = buildFakeController("rootController")
private var headerController0: NodeController = buildFakeController("header0")
@@ -66,13 +67,12 @@
@Before
fun setUp() {
- MockitoAnnotations.initMocks(this)
-
- `when`(viewBarn.requireNodeController(any())).thenAnswer {
+ whenever(mediaContainerController.mediaContainerView).thenReturn(mock())
+ whenever(viewBarn.requireNodeController(any())).thenAnswer {
fakeViewBarn.getViewByEntry(it.getArgument(0))
}
- specBuilder = NodeSpecBuilder(viewBarn)
+ specBuilder = NodeSpecBuilder(mediaContainerController, sectionsFeatureManager, viewBarn)
}
@Test
@@ -109,6 +109,30 @@
@Test
fun testSimpleMapping() {
checkOutput(
+ // GIVEN a simple flat list of notifications all in the same headerless section
+ listOf(
+ notif(0, section0NoHeader),
+ notif(1, section0NoHeader),
+ notif(2, section0NoHeader),
+ notif(3, section0NoHeader)
+ ),
+
+ // THEN we output a similarly simple flag list of nodes
+ tree(
+ notifNode(0),
+ notifNode(1),
+ notifNode(2),
+ notifNode(3)
+ )
+ )
+ }
+
+ @Test
+ fun testSimpleMappingWithMedia() {
+ // WHEN media controls are enabled
+ whenever(sectionsFeatureManager.isMediaControlsEnabled()).thenReturn(true)
+
+ checkOutput(
// GIVEN a simple flat list of notifications all in the same headerless section
listOf(
notif(0, section0NoHeader),
@@ -117,8 +141,9 @@
notif(3, section0NoHeader)
),
- // THEN we output a similarly simple flag list of nodes
+ // THEN we output a similarly simple flag list of nodes, with media at the top
tree(
+ node(mediaContainerController),
notifNode(0),
notifNode(1),
notifNode(2),
@@ -333,7 +358,7 @@
private fun buildFakeController(name: String): NodeController {
val controller = Mockito.mock(NodeController::class.java)
- `when`(controller.nodeLabel).thenReturn(name)
+ whenever(controller.nodeLabel).thenReturn(name)
return controller
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
index e9e1911..4ea9321 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java
@@ -16,9 +16,12 @@
package com.android.systemui.statusbar.notification.row;
+import static android.app.Notification.FLAG_NO_CLEAR;
+import static android.app.Notification.FLAG_ONGOING_EVENT;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static com.android.systemui.statusbar.NotificationEntryHelper.modifyRanking;
+import static com.android.systemui.statusbar.NotificationEntryHelper.modifySbn;
import static com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_ALL;
import static org.junit.Assert.assertEquals;
@@ -29,6 +32,7 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -330,4 +334,28 @@
assertTrue(row.getIsNonblockable());
}
+
+ @Test
+ public void testCanDismissNoClear() throws Exception {
+ ExpandableNotificationRow row =
+ mNotificationTestHelper.createRow(mNotificationTestHelper.createNotification());
+ modifySbn(row.getEntry())
+ .setFlag(mContext, FLAG_NO_CLEAR, true)
+ .build();
+ row.performDismiss(false);
+ verify(mNotificationTestHelper.mOnUserInteractionCallback)
+ .onDismiss(any(), anyInt(), any());
+ }
+
+ @Test
+ public void testCannotDismissOngoing() throws Exception {
+ ExpandableNotificationRow row =
+ mNotificationTestHelper.createRow(mNotificationTestHelper.createNotification());
+ modifySbn(row.getEntry())
+ .setFlag(mContext, FLAG_ONGOING_EVENT, true)
+ .build();
+ row.performDismiss(false);
+ verify(mNotificationTestHelper.mOnUserInteractionCallback, never())
+ .onDismiss(any(), anyInt(), any());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
index 9039e1b..1f92b0a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/FooterViewTest.java
@@ -57,7 +57,7 @@
@Test
public void setDismissOnClick() {
- mView.setDismissButtonClickListener(mock(View.OnClickListener.class));
+ mView.setClearAllButtonClickListener(mock(View.OnClickListener.class));
assertTrue(mView.findSecondaryView().hasOnClickListeners());
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
index e4721b1..4457ae0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java
@@ -115,6 +115,7 @@
private final IconManager mIconManager;
private StatusBarStateController mStatusBarStateController;
private final PeopleNotificationIdentifier mPeopleNotificationIdentifier;
+ public final OnUserInteractionCallback mOnUserInteractionCallback;
public NotificationTestHelper(
Context context,
@@ -173,6 +174,7 @@
verify(collection).addCollectionListener(collectionListenerCaptor.capture());
mBindPipelineEntryListener = collectionListenerCaptor.getValue();
mPeopleNotificationIdentifier = mock(PeopleNotificationIdentifier.class);
+ mOnUserInteractionCallback = mock(OnUserInteractionCallback.class);
}
/**
@@ -499,7 +501,7 @@
new FalsingCollectorFake(),
mStatusBarStateController,
mPeopleNotificationIdentifier,
- mock(OnUserInteractionCallback.class),
+ mOnUserInteractionCallback,
Optional.of(mock(BubblesManager.class)),
mock(NotificationGutsManager.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java
index 4d2c0c3..ac9fcc0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManagerTest.java
@@ -41,7 +41,6 @@
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.AttributeSet;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -54,6 +53,7 @@
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
+import com.android.systemui.statusbar.notification.collection.render.MediaContainerController;
import com.android.systemui.statusbar.notification.collection.render.SectionHeaderController;
import com.android.systemui.statusbar.notification.row.ActivatableNotificationViewController;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -87,6 +87,7 @@
@Mock private NotificationRowComponent mNotificationRowComponent;
@Mock private ActivatableNotificationViewController mActivatableNotificationViewController;
@Mock private NotificationSectionsLogger mLogger;
+ @Mock private MediaContainerController mMediaContainerController;
@Mock private SectionHeaderController mIncomingHeaderController;
@Mock private SectionHeaderController mPeopleHeaderController;
@Mock private SectionHeaderController mAlertingHeaderController;
@@ -114,6 +115,8 @@
});
when(mNotificationRowComponent.getActivatableNotificationViewController())
.thenReturn(mActivatableNotificationViewController);
+ when(mMediaContainerController.getMediaContainerView())
+ .thenReturn(mock(MediaContainerView.class));
when(mIncomingHeaderController.getHeaderView()).thenReturn(mock(SectionHeaderView.class));
when(mPeopleHeaderController.getHeaderView()).thenReturn(mock(SectionHeaderView.class));
when(mAlertingHeaderController.getHeaderView()).thenReturn(mock(SectionHeaderView.class));
@@ -126,6 +129,7 @@
mSectionsFeatureManager,
mLogger,
mNotifPipelineFlags,
+ mMediaContainerController,
mIncomingHeaderController,
mPeopleHeaderController,
mAlertingHeaderController,
@@ -134,7 +138,7 @@
// Required in order for the header inflation to work properly
when(mNssl.generateLayoutParams(any(AttributeSet.class)))
.thenReturn(new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
- mSectionsManager.initialize(mNssl, LayoutInflater.from(mContext));
+ mSectionsManager.initialize(mNssl);
when(mNssl.indexOfChild(any(View.class))).thenReturn(-1);
when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE);
@@ -142,7 +146,7 @@
@Test(expected = IllegalStateException.class)
public void testDuplicateInitializeThrows() {
- mSectionsManager.initialize(mNssl, LayoutInflater.from(mContext));
+ mSectionsManager.initialize(mNssl);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
index 4cc1be6..04c6f6c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java
@@ -379,18 +379,18 @@
@Test
public void testDismissListener() {
- ArgumentCaptor<NotificationStackScrollLayout.DismissListener>
+ ArgumentCaptor<NotificationStackScrollLayout.ClearAllListener>
dismissListenerArgumentCaptor = ArgumentCaptor.forClass(
- NotificationStackScrollLayout.DismissListener.class);
+ NotificationStackScrollLayout.ClearAllListener.class);
mController.attach(mNotificationStackScrollLayout);
- verify(mNotificationStackScrollLayout).setDismissListener(
+ verify(mNotificationStackScrollLayout).setClearAllListener(
dismissListenerArgumentCaptor.capture());
- NotificationStackScrollLayout.DismissListener dismissListener =
+ NotificationStackScrollLayout.ClearAllListener dismissListener =
dismissListenerArgumentCaptor.getValue();
- dismissListener.onDismiss(ROWS_ALL);
+ dismissListener.onClearAll(ROWS_ALL);
verify(mUiEventLogger).log(NotificationPanelEvent.fromSelection(ROWS_ALL));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index eda0e83..46ba097 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -447,7 +447,7 @@
public void testClearNotifications_All() {
final int[] numCalls = {0};
final int[] selected = {-1};
- mStackScroller.setDismissListener(selectedRows -> {
+ mStackScroller.setClearAllListener(selectedRows -> {
numCalls[0]++;
selected[0] = selectedRows;
});
@@ -461,7 +461,7 @@
public void testClearNotifications_Gentle() {
final int[] numCalls = {0};
final int[] selected = {-1};
- mStackScroller.setDismissListener(selectedRows -> {
+ mStackScroller.setClearAllListener(selectedRows -> {
numCalls[0]++;
selected[0] = selectedRows;
});
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
index 5ada6d4..35f671bf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java
@@ -455,7 +455,8 @@
mStatusBarStateController,
mFalsingManager,
mLockscreenShadeTransitionController,
- new FalsingCollectorFake());
+ new FalsingCollectorFake(),
+ mDumpManager);
when(mKeyguardStatusViewComponentFactory.build(any()))
.thenReturn(mKeyguardStatusViewComponent);
when(mKeyguardStatusViewComponent.getKeyguardClockSwitchController())
diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
index 34407b0..f804d83 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java
@@ -39,6 +39,7 @@
import android.content.Intent;
import android.content.om.FabricatedOverlay;
import android.content.om.OverlayIdentifier;
+import android.database.ContentObserver;
import android.graphics.Color;
import android.os.Handler;
import android.os.UserHandle;
@@ -55,6 +56,7 @@
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.monet.Style;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
@@ -117,6 +119,9 @@
private ArgumentCaptor<WakefulnessLifecycle.Observer> mWakefulnessLifecycleObserver;
@Captor
private ArgumentCaptor<UserTracker.Callback> mUserTrackerCallback;
+ @Captor
+ private ArgumentCaptor<ContentObserver> mSettingsObserver;
+ private Style mCurrentStyle;
@Before
public void setup() {
@@ -130,10 +135,11 @@
mUserTracker, mDumpManager, mFeatureFlags, mWakefulnessLifecycle) {
@Nullable
@Override
- protected FabricatedOverlay getOverlay(int color, int type) {
+ protected FabricatedOverlay getOverlay(int color, int type, Style style) {
FabricatedOverlay overlay = mock(FabricatedOverlay.class);
when(overlay.getIdentifier())
.thenReturn(new OverlayIdentifier(Integer.toHexString(color | 0xff000000)));
+ mCurrentStyle = style;
return overlay;
}
};
@@ -148,6 +154,10 @@
verify(mWakefulnessLifecycle).addObserver(mWakefulnessLifecycleObserver.capture());
verify(mDumpManager).registerDumpable(any(), any());
verify(mDeviceProvisionedController).addCallback(mDeviceProvisionedListener.capture());
+ verify(mSecureSettings).registerContentObserverForUser(
+ eq(Settings.Secure.getUriFor(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES)),
+ eq(false), mSettingsObserver.capture(), eq(UserHandle.USER_ALL)
+ );
}
@Test
@@ -211,12 +221,6 @@
verify(mThemeOverlayApplier)
.applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any());
- // Assert that we received the colors that we were expecting
- assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE))
- .isEqualTo(new OverlayIdentifier("ffff0000"));
- assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_ACCENT_COLOR))
- .isEqualTo(new OverlayIdentifier("ffff0000"));
-
// Should not change theme after changing wallpapers, if intent doesn't have
// WallpaperManager.EXTRA_FROM_FOREGROUND_APP set to true.
clearInvocations(mThemeOverlayApplier);
@@ -322,6 +326,40 @@
}
@Test
+ public void onSettingChanged_honorThemeStyle() {
+ when(mDeviceProvisionedController.isUserSetup(anyInt())).thenReturn(true);
+ for (Style style : Style.values()) {
+ reset(mSecureSettings);
+
+ String jsonString = "{\"android.theme.customization.system_palette\":\"A16B00\","
+ + "\"android.theme.customization.theme_style\":\"" + style.name() + "\"}";
+
+ when(mSecureSettings.getStringForUser(
+ eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt()))
+ .thenReturn(jsonString);
+
+ mSettingsObserver.getValue().onChange(true, null, 0, mUserTracker.getUserId());
+
+ assertThat(mCurrentStyle).isEqualTo(style);
+ }
+ }
+
+ @Test
+ public void onSettingChanged_invalidStyle() {
+ when(mDeviceProvisionedController.isUserSetup(anyInt())).thenReturn(true);
+ String jsonString = "{\"android.theme.customization.system_palette\":\"A16B00\","
+ + "\"android.theme.customization.theme_style\":\"some_invalid_name\"}";
+
+ when(mSecureSettings.getStringForUser(
+ eq(Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES), anyInt()))
+ .thenReturn(jsonString);
+
+ mSettingsObserver.getValue().onChange(true, null, 0, mUserTracker.getUserId());
+
+ assertThat(mCurrentStyle).isEqualTo(Style.TONAL_SPOT);
+ }
+
+ @Test
public void onWallpaperColorsChanged_ResetThemeWithNewHomeAndLockWallpaper() {
// Should ask for a new theme when wallpaper colors change
WallpaperColors mainColors = new WallpaperColors(Color.valueOf(Color.RED),
@@ -611,11 +649,10 @@
mUserTracker, mDumpManager, mFeatureFlags, mWakefulnessLifecycle) {
@Nullable
@Override
- protected FabricatedOverlay getOverlay(int color, int type) {
+ protected FabricatedOverlay getOverlay(int color, int type, Style style) {
FabricatedOverlay overlay = mock(FabricatedOverlay.class);
when(overlay.getIdentifier())
.thenReturn(new OverlayIdentifier("com.thebest.livewallpaperapp.ever"));
-
return overlay;
}
@@ -648,7 +685,7 @@
mUserTracker, mDumpManager, mFeatureFlags, mWakefulnessLifecycle) {
@Nullable
@Override
- protected FabricatedOverlay getOverlay(int color, int type) {
+ protected FabricatedOverlay getOverlay(int color, int type, Style style) {
FabricatedOverlay overlay = mock(FabricatedOverlay.class);
when(overlay.getIdentifier())
.thenReturn(new OverlayIdentifier(Integer.toHexString(color | 0xff000000)));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldStateLoggingProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldStateLoggingProviderTest.kt
new file mode 100644
index 0000000..8076b4e
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/FoldStateLoggingProviderTest.kt
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.unfold
+
+import android.testing.AndroidTestingRunner
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.unfold.FoldStateLoggingProvider.FoldStateLoggingListener
+import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED
+import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_FULL_OPEN
+import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_HALF_OPEN
+import com.android.systemui.unfold.updates.FOLD_UPDATE_START_CLOSING
+import com.android.systemui.unfold.updates.FOLD_UPDATE_START_OPENING
+import com.android.systemui.unfold.updates.FoldStateProvider
+import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate
+import com.android.systemui.util.time.FakeSystemClock
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mock
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@RunWith(AndroidTestingRunner::class)
+@SmallTest
+class FoldStateLoggingProviderTest : SysuiTestCase() {
+
+ @Captor
+ private lateinit var foldUpdatesListener: ArgumentCaptor<FoldStateProvider.FoldUpdatesListener>
+
+ @Mock private lateinit var foldStateProvider: FoldStateProvider
+
+ private val fakeClock = FakeSystemClock()
+
+ private lateinit var foldStateLoggingProvider: FoldStateLoggingProvider
+
+ private val foldLoggingUpdates: MutableList<FoldStateChange> = arrayListOf()
+
+ private val foldStateLoggingListener =
+ object : FoldStateLoggingListener {
+ override fun onFoldUpdate(foldStateUpdate: FoldStateChange) {
+ foldLoggingUpdates.add(foldStateUpdate)
+ }
+ }
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+
+ foldStateLoggingProvider =
+ FoldStateLoggingProviderImpl(foldStateProvider, fakeClock).apply {
+ addCallback(foldStateLoggingListener)
+ init()
+ }
+
+ verify(foldStateProvider).addCallback(foldUpdatesListener.capture())
+ }
+
+ @Test
+ fun onFoldUpdate_noPreviousOne_finishHalfOpen_nothingReported() {
+ sendFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN)
+
+ assertThat(foldLoggingUpdates).isEmpty()
+ }
+
+ @Test
+ fun onFoldUpdate_noPreviousOne_finishFullOpen_nothingReported() {
+ sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN)
+
+ assertThat(foldLoggingUpdates).isEmpty()
+ }
+
+ @Test
+ fun onFoldUpdate_noPreviousOne_finishClosed_nothingReported() {
+ sendFoldUpdate(FOLD_UPDATE_FINISH_CLOSED)
+
+ assertThat(foldLoggingUpdates).isEmpty()
+ }
+
+ @Test
+ fun onFoldUpdate_startOpening_fullOpen_changeReported() {
+ val dtTime = 10L
+
+ sendFoldUpdate(FOLD_UPDATE_START_OPENING)
+ fakeClock.advanceTime(dtTime)
+ sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN)
+
+ assertThat(foldLoggingUpdates)
+ .containsExactly(FoldStateChange(FULLY_CLOSED, FULLY_OPENED, dtTime))
+ }
+
+ @Test
+ fun onFoldUpdate_startClosingThenFinishClosed_noInitialState_nothingReported() {
+ val dtTime = 10L
+
+ sendFoldUpdate(FOLD_UPDATE_START_CLOSING)
+ fakeClock.advanceTime(dtTime)
+ sendFoldUpdate(FOLD_UPDATE_FINISH_CLOSED)
+
+ assertThat(foldLoggingUpdates).isEmpty()
+ }
+
+ @Test
+ fun onFoldUpdate_startClosingThenFinishClosed_initiallyOpened_changeReported() {
+ val dtTime = 10L
+ sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN)
+
+ sendFoldUpdate(FOLD_UPDATE_START_CLOSING)
+ fakeClock.advanceTime(dtTime)
+ sendFoldUpdate(FOLD_UPDATE_FINISH_CLOSED)
+
+ assertThat(foldLoggingUpdates)
+ .containsExactly(FoldStateChange(FULLY_OPENED, FULLY_CLOSED, dtTime))
+ }
+
+ @Test
+ fun onFoldUpdate_startOpeningThenHalf_initiallyClosed_changeReported() {
+ val dtTime = 10L
+ sendFoldUpdate(FOLD_UPDATE_FINISH_CLOSED)
+
+ sendFoldUpdate(FOLD_UPDATE_START_OPENING)
+ fakeClock.advanceTime(dtTime)
+ sendFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN)
+
+ assertThat(foldLoggingUpdates)
+ .containsExactly(FoldStateChange(FULLY_CLOSED, HALF_OPENED, dtTime))
+ }
+
+ @Test
+ fun onFoldUpdate_startClosingThenHalf_initiallyOpened_changeReported() {
+ val dtTime = 10L
+ sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN)
+
+ sendFoldUpdate(FOLD_UPDATE_START_CLOSING)
+ fakeClock.advanceTime(dtTime)
+ sendFoldUpdate(FOLD_UPDATE_FINISH_HALF_OPEN)
+
+ assertThat(foldLoggingUpdates)
+ .containsExactly(FoldStateChange(FULLY_OPENED, HALF_OPENED, dtTime))
+ }
+
+ @Test
+ fun onFoldUpdate_foldThenUnfold_multipleReported() {
+ val foldTime = 24L
+ val unfoldTime = 42L
+ val waitingTime = 424L
+ sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN)
+
+ // Fold
+ sendFoldUpdate(FOLD_UPDATE_START_CLOSING)
+ fakeClock.advanceTime(foldTime)
+ sendFoldUpdate(FOLD_UPDATE_FINISH_CLOSED)
+ fakeClock.advanceTime(waitingTime)
+ // unfold
+ sendFoldUpdate(FOLD_UPDATE_START_OPENING)
+ fakeClock.advanceTime(unfoldTime)
+ sendFoldUpdate(FOLD_UPDATE_FINISH_FULL_OPEN)
+
+ assertThat(foldLoggingUpdates)
+ .containsExactly(
+ FoldStateChange(FULLY_OPENED, FULLY_CLOSED, foldTime),
+ FoldStateChange(FULLY_CLOSED, FULLY_OPENED, unfoldTime))
+ }
+
+ @Test
+ fun uninit_removesCallback() {
+ foldStateLoggingProvider.uninit()
+
+ verify(foldStateProvider).removeCallback(foldUpdatesListener.value)
+ }
+
+ private fun sendFoldUpdate(@FoldUpdate foldUpdate: Int) {
+ foldUpdatesListener.value.onFoldUpdate(foldUpdate)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index d27a570..07351cf 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -92,6 +92,7 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationTestHelper;
@@ -111,6 +112,7 @@
import com.android.wm.shell.TaskViewTransitions;
import com.android.wm.shell.WindowManagerShellWrapper;
import com.android.wm.shell.bubbles.Bubble;
+import com.android.wm.shell.bubbles.BubbleBadgeIconFactory;
import com.android.wm.shell.bubbles.BubbleData;
import com.android.wm.shell.bubbles.BubbleDataRepository;
import com.android.wm.shell.bubbles.BubbleEntry;
@@ -152,6 +154,8 @@
@Mock
private NotificationEntryManager mNotificationEntryManager;
@Mock
+ private CommonNotifCollection mCommonNotifCollection;
+ @Mock
private NotificationGroupManagerLegacy mNotificationGroupManager;
@Mock
private WindowManager mWindowManager;
@@ -299,9 +303,8 @@
mBubbleEntry2User11 = BubblesManager.notifToBubbleEntry(
mNotificationTestHelper.createBubble(handle));
- // Return non-null notification data from the NEM
- when(mNotificationEntryManager
- .getActiveNotificationUnfiltered(mRow.getKey())).thenReturn(mRow);
+ // Return non-null notification data from the CommonNotifCollection
+ when(mCommonNotifCollection.getEntry(mRow.getKey())).thenReturn(mRow);
mZenModeConfig.suppressedVisualEffects = 0;
when(mZenModeController.getConfig()).thenReturn(mZenModeConfig);
@@ -371,12 +374,14 @@
mLockscreenUserManager,
mNotificationGroupManager,
mNotificationEntryManager,
+ mCommonNotifCollection,
mNotifPipeline,
mSysUiState,
mNotifPipelineFlags,
mDumpManager,
syncExecutor);
+ // XXX: Does *this* need to be changed?
// Get a reference to the BubbleController's entry listener
verify(mNotificationEntryManager, atLeastOnce())
.addNotificationEntryListener(mEntryListenerCaptor.capture());
@@ -421,10 +426,8 @@
public void testPromoteBubble_autoExpand() throws Exception {
mBubbleController.updateBubble(mBubbleEntry2);
mBubbleController.updateBubble(mBubbleEntry);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
- .thenReturn(mRow);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getKey()))
- .thenReturn(mRow2);
+ when(mCommonNotifCollection.getEntry(mRow.getKey())).thenReturn(mRow);
+ when(mCommonNotifCollection.getEntry(mRow2.getKey())).thenReturn(mRow2);
mBubbleController.removeBubble(
mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
@@ -452,10 +455,8 @@
mBubbleController.updateBubble(mBubbleEntry2);
mBubbleController.updateBubble(mBubbleEntry, /* suppressFlyout */
false, /* showInShade */ true);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
- .thenReturn(mRow);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getKey()))
- .thenReturn(mRow2);
+ when(mCommonNotifCollection.getEntry(mRow.getKey())).thenReturn(mRow);
+ when(mCommonNotifCollection.getEntry(mRow2.getKey())).thenReturn(mRow2);
mBubbleController.removeBubble(
mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
@@ -958,12 +959,9 @@
mBubbleEntry2, /* suppressFlyout */ false, /* showInShade */ false);
mBubbleController.updateBubble(
mBubbleEntry3, /* suppressFlyout */ false, /* showInShade */ false);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
- .thenReturn(mRow);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getKey()))
- .thenReturn(mRow2);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow3.getKey()))
- .thenReturn(mRow3);
+ when(mCommonNotifCollection.getEntry(mRow.getKey())).thenReturn(mRow);
+ when(mCommonNotifCollection.getEntry(mRow2.getKey())).thenReturn(mRow2);
+ when(mCommonNotifCollection.getEntry(mRow3.getKey())).thenReturn(mRow3);
assertEquals(mBubbleData.getBubbles().size(), 3);
mBubbleData.setMaxOverflowBubbles(1);
@@ -1021,7 +1019,7 @@
// GIVEN a group summary with a bubble child
ExpandableNotificationRow groupSummary = mNotificationTestHelper.createGroup(0);
ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
- when(mNotificationEntryManager.getPendingOrActiveNotif(groupedBubble.getEntry().getKey()))
+ when(mCommonNotifCollection.getEntry(groupedBubble.getEntry().getKey()))
.thenReturn(groupedBubble.getEntry());
mEntryListener.onPendingEntryAdded(groupedBubble.getEntry());
groupSummary.addChildNotification(groupedBubble);
@@ -1046,7 +1044,7 @@
ExpandableNotificationRow groupSummary = mNotificationTestHelper.createGroup(0);
ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
mEntryListener.onPendingEntryAdded(groupedBubble.getEntry());
- when(mNotificationEntryManager.getPendingOrActiveNotif(groupedBubble.getEntry().getKey()))
+ when(mCommonNotifCollection.getEntry(groupedBubble.getEntry().getKey()))
.thenReturn(groupedBubble.getEntry());
groupSummary.addChildNotification(groupedBubble);
assertTrue(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
@@ -1069,7 +1067,7 @@
// GIVEN a group summary with two (non-bubble) children and one bubble child
ExpandableNotificationRow groupSummary = mNotificationTestHelper.createGroup(2);
ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
- when(mNotificationEntryManager.getPendingOrActiveNotif(groupedBubble.getEntry().getKey()))
+ when(mCommonNotifCollection.getEntry(groupedBubble.getEntry().getKey()))
.thenReturn(groupedBubble.getEntry());
mEntryListener.onPendingEntryAdded(groupedBubble.getEntry());
groupSummary.addChildNotification(groupedBubble);
@@ -1220,6 +1218,7 @@
mBubbleController,
mBubbleController.getStackView(),
new BubbleIconFactory(mContext),
+ new BubbleBadgeIconFactory(mContext),
bubble,
true /* skipInflation */);
verify(userContext, times(1)).getPackageManager();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
index ad26f01..9eee83c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
@@ -77,6 +77,7 @@
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
+import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
@@ -133,6 +134,8 @@
@Mock
private NotificationEntryManager mNotificationEntryManager;
@Mock
+ private CommonNotifCollection mCommonNotifCollection;
+ @Mock
private NotificationGroupManagerLegacy mNotificationGroupManager;
@Mock
private BubblesManager.NotifCallback mNotifCallback;
@@ -336,6 +339,7 @@
mLockscreenUserManager,
mNotificationGroupManager,
mNotificationEntryManager,
+ mCommonNotifCollection,
mNotifPipeline,
mSysUiState,
mNotifPipelineFlags,
@@ -404,8 +408,7 @@
public void testRemoveBubble_withDismissedNotif_notInOverflow() {
mEntryListener.onEntryAdded(mRow);
mBubbleController.updateBubble(mBubbleEntry);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
- .thenReturn(mRow);
+ when(mCommonNotifCollection.getEntry(mRow.getKey())).thenReturn(mRow);
assertTrue(mBubbleController.hasBubbles());
assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
@@ -887,7 +890,7 @@
ExpandableNotificationRow groupSummary = mNotificationTestHelper.createGroup(0);
ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
mEntryListener.onEntryAdded(groupedBubble.getEntry());
- when(mNotificationEntryManager.getPendingOrActiveNotif(groupedBubble.getEntry().getKey()))
+ when(mCommonNotifCollection.getEntry(groupedBubble.getEntry().getKey()))
.thenReturn(groupedBubble.getEntry());
groupSummary.addChildNotification(groupedBubble);
assertTrue(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
@@ -911,7 +914,7 @@
ExpandableNotificationRow groupSummary = mNotificationTestHelper.createGroup(0);
ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
mEntryListener.onEntryAdded(groupedBubble.getEntry());
- when(mNotificationEntryManager.getPendingOrActiveNotif(groupedBubble.getEntry().getKey()))
+ when(mCommonNotifCollection.getEntry(groupedBubble.getEntry().getKey()))
.thenReturn(groupedBubble.getEntry());
groupSummary.addChildNotification(groupedBubble);
assertTrue(mBubbleData.hasBubbleInStackWithKey(groupedBubble.getEntry().getKey()));
@@ -935,7 +938,7 @@
ExpandableNotificationRow groupSummary = mNotificationTestHelper.createGroup(2);
ExpandableNotificationRow groupedBubble = mNotificationTestHelper.createBubbleInGroup();
mEntryListener.onEntryAdded(groupedBubble.getEntry());
- when(mNotificationEntryManager.getPendingOrActiveNotif(groupedBubble.getEntry().getKey()))
+ when(mCommonNotifCollection.getEntry(groupedBubble.getEntry().getKey()))
.thenReturn(groupedBubble.getEntry());
groupSummary.addChildNotification(groupedBubble);
@@ -1011,10 +1014,9 @@
*/
@Test
public void testOverflowLoadedOnce() {
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow.getKey()))
- .thenReturn(mRow);
- when(mNotificationEntryManager.getPendingOrActiveNotif(mRow2.getKey()))
- .thenReturn(mRow2);
+ // XXX
+ when(mCommonNotifCollection.getEntry(mRow.getKey())).thenReturn(mRow);
+ when(mCommonNotifCollection.getEntry(mRow2.getKey())).thenReturn(mRow2);
mEntryListener.onEntryAdded(mRow);
mEntryListener.onEntryAdded(mRow2);
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 7074167..aa69a09 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -2398,6 +2398,7 @@
somethingChanged |= readUserRecommendedUiTimeoutSettingsLocked(userState);
somethingChanged |= readMagnificationModeForDefaultDisplayLocked(userState);
somethingChanged |= readMagnificationCapabilitiesLocked(userState);
+ somethingChanged |= readMagnificationFollowTypingLocked(userState);
return somethingChanged;
}
@@ -3873,6 +3874,9 @@
private final Uri mMagnificationCapabilityUri = Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY);
+ private final Uri mMagnificationFollowTypingUri = Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED);
+
public AccessibilityContentObserver(Handler handler) {
super(handler);
}
@@ -3911,6 +3915,8 @@
mMagnificationModeUri, false, this, UserHandle.USER_ALL);
contentResolver.registerContentObserver(
mMagnificationCapabilityUri, false, this, UserHandle.USER_ALL);
+ contentResolver.registerContentObserver(
+ mMagnificationFollowTypingUri, false, this, UserHandle.USER_ALL);
}
@Override
@@ -3978,6 +3984,8 @@
if (readMagnificationCapabilitiesLocked(userState)) {
updateMagnificationCapabilitiesSettingsChangeLocked(userState);
}
+ } else if (mMagnificationFollowTypingUri.equals(uri)) {
+ readMagnificationFollowTypingLocked(userState);
}
}
}
@@ -4074,6 +4082,19 @@
return false;
}
+ boolean readMagnificationFollowTypingLocked(AccessibilityUserState userState) {
+ final boolean followTypeEnabled = Settings.Secure.getIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED,
+ 1, userState.mUserId) == 1;
+ if (followTypeEnabled != userState.isMagnificationFollowTypingEnabled()) {
+ userState.setMagnificationFollowTypingEnabled(followTypeEnabled);
+ mMagnificationController.setMagnificationFollowTypingEnabled(followTypeEnabled);
+ return true;
+ }
+ return false;
+ }
+
@Override
public void setGestureDetectionPassthroughRegion(int displayId, Region region) {
mMainHandler.sendMessage(
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
index 9324e3e..0f35456 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
@@ -129,6 +129,8 @@
private final SparseIntArray mMagnificationModes = new SparseIntArray();
// The magnification capabilities used to know magnification mode could be switched.
private int mMagnificationCapabilities = ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
+ // Whether the following typing focus feature for magnification is enabled.
+ private boolean mMagnificationFollowTypingEnabled = true;
/** The stroke width of the focus rectangle in pixels */
private int mFocusStrokeWidth;
@@ -210,6 +212,7 @@
mMagnificationModes.clear();
mFocusStrokeWidth = mFocusStrokeWidthDefaultValue;
mFocusColor = mFocusColorDefaultValue;
+ mMagnificationFollowTypingEnabled = true;
}
void addServiceLocked(AccessibilityServiceConnection serviceConnection) {
@@ -685,6 +688,14 @@
mMagnificationCapabilities = capabilities;
}
+ public void setMagnificationFollowTypingEnabled(boolean enabled) {
+ mMagnificationFollowTypingEnabled = enabled;
+ }
+
+ public boolean isMagnificationFollowTypingEnabled() {
+ return mMagnificationFollowTypingEnabled;
+ }
+
/**
* Sets the magnification mode to the given display.
*
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
index 09485d1..aba32ec 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
@@ -667,6 +667,10 @@
return null;
}
+ // Don't need to add the embedded hierarchy windows into the accessibility windows list.
+ if (mHostEmbeddedMap.size() > 0 && isEmbeddedHierarchyWindowsLocked(windowId)) {
+ return null;
+ }
final AccessibilityWindowInfo reportedWindow = AccessibilityWindowInfo.obtain();
reportedWindow.setId(windowId);
@@ -699,6 +703,21 @@
return reportedWindow;
}
+ private boolean isEmbeddedHierarchyWindowsLocked(int windowId) {
+ final IBinder leashToken = mWindowIdMap.get(windowId);
+ if (leashToken == null) {
+ return false;
+ }
+
+ for (int i = 0; i < mHostEmbeddedMap.size(); i++) {
+ if (mHostEmbeddedMap.keyAt(i).equals(leashToken)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private int getTypeForWindowManagerWindowType(int windowType) {
switch (windowType) {
case WindowManager.LayoutParams.TYPE_APPLICATION:
@@ -735,8 +754,7 @@
case WindowManager.LayoutParams.TYPE_SYSTEM_ERROR:
case WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY:
case WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY:
- case WindowManager.LayoutParams.TYPE_SCREENSHOT:
- case WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY: {
+ case WindowManager.LayoutParams.TYPE_SCREENSHOT: {
return AccessibilityWindowInfo.TYPE_SYSTEM;
}
@@ -748,6 +766,10 @@
return AccessibilityWindowInfo.TYPE_ACCESSIBILITY_OVERLAY;
}
+ case WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY: {
+ return AccessibilityWindowInfo.TYPE_MAGNIFICATION_OVERLAY;
+ }
+
default: {
return -1;
}
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java
index 4d898c8..e39b979 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java
@@ -91,6 +91,8 @@
private final SparseArray<DisplayMagnification> mDisplays = new SparseArray<>(0);
private final Rect mTempRect = new Rect();
+ // Whether the following typing focus feature for magnification is enabled.
+ private boolean mMagnificationFollowTypingEnabled = true;
/**
* This class implements {@link WindowManagerInternal.MagnificationCallbacks} and holds
@@ -744,6 +746,9 @@
public void onRectangleOnScreenRequested(int displayId, int left, int top, int right,
int bottom) {
synchronized (mLock) {
+ if (!mMagnificationFollowTypingEnabled) {
+ return;
+ }
final DisplayMagnification display = mDisplays.get(displayId);
if (display == null) {
return;
@@ -760,6 +765,10 @@
}
}
+ void setMagnificationFollowTypingEnabled(boolean enabled) {
+ mMagnificationFollowTypingEnabled = enabled;
+ }
+
/**
* Remove the display magnification with given id.
*
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
index 8332126..b70ffb2 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java
@@ -530,6 +530,16 @@
mMagnificationCapabilities = capabilities;
}
+ /**
+ * Called when the following typing focus feature is switched.
+ *
+ * @param enabled Enable the following typing focus feature
+ */
+ public void setMagnificationFollowTypingEnabled(boolean enabled) {
+ getWindowMagnificationMgr().setMagnificationFollowTypingEnabled(enabled);
+ getFullScreenMagnificationController().setMagnificationFollowTypingEnabled(enabled);
+ }
+
private DisableMagnificationCallback getDisableMagnificationEndRunnableLocked(
int displayId) {
return mMagnificationEndRunnableSparseArray.get(displayId);
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java
index 59f3ce6..95c7d44 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationManager.java
@@ -97,6 +97,8 @@
private ConnectionCallback mConnectionCallback;
@GuardedBy("mLock")
private SparseArray<WindowMagnifier> mWindowMagnifiers = new SparseArray<>();
+ // Whether the following typing focus feature for magnification is enabled.
+ private boolean mMagnificationFollowTypingEnabled = true;
private boolean mReceiverRegistered = false;
@VisibleForTesting
@@ -299,6 +301,9 @@
@Override
public void onRectangleOnScreenRequested(int displayId, int left, int top, int right,
int bottom) {
+ if (!mMagnificationFollowTypingEnabled) {
+ return;
+ }
float toCenterX = (float) (left + right) / 2;
float toCenterY = (float) (top + bottom) / 2;
@@ -309,6 +314,10 @@
}
}
+ void setMagnificationFollowTypingEnabled(boolean enabled) {
+ mMagnificationFollowTypingEnabled = enabled;
+ }
+
/**
* Enable or disable tracking typing focus for the specific magnification window.
*
diff --git a/services/companion/java/com/android/server/companion/AssociationCleanUpService.java b/services/companion/java/com/android/server/companion/AssociationCleanUpService.java
new file mode 100644
index 0000000..f1d98f0
--- /dev/null
+++ b/services/companion/java/com/android/server/companion/AssociationCleanUpService.java
@@ -0,0 +1,77 @@
+/*
+ * 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.
+ */
+
+package com.android.server.companion;
+
+import static com.android.server.companion.CompanionDeviceManagerService.LOG_TAG;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.companion.AssociationRequest;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.AsyncTask;
+import android.util.Slog;
+
+import com.android.server.LocalServices;
+
+/**
+ * A Job Service responsible for clean up the Association.
+ * The job will be executed only if the device is charging and in idle mode due to the application
+ * will be killed if association/role are revoked.
+ */
+public class AssociationCleanUpService extends JobService {
+ private static final String TAG = LOG_TAG + ".AssociationCleanUpService";
+ private static final int JOB_ID = AssociationCleanUpService.class.hashCode();
+ private static final long ONE_DAY_INTERVAL = 3 * 24 * 60 * 60 * 1000; // 1 Day
+ private CompanionDeviceManagerServiceInternal mCdmServiceInternal = LocalServices.getService(
+ CompanionDeviceManagerServiceInternal.class);
+
+ @Override
+ public boolean onStartJob(final JobParameters params) {
+ Slog.i(LOG_TAG, "Execute the Association CleanUp job");
+ // Special policy for APP_STREAMING role that need to revoke associations if the device
+ // does not connect for 3 months.
+ AsyncTask.execute(() -> {
+ mCdmServiceInternal.associationCleanUp(AssociationRequest.DEVICE_PROFILE_APP_STREAMING);
+ jobFinished(params, false);
+ });
+ return true;
+ }
+
+ @Override
+ public boolean onStopJob(final JobParameters params) {
+ Slog.d(TAG, "Association cleanup job stopped; id=" + params.getJobId()
+ + ", reason="
+ + JobParameters.getInternalReasonCodeDescription(
+ params.getInternalStopReasonCode()));
+ return false;
+ }
+
+ static void schedule(Context context) {
+ Slog.i(LOG_TAG, "Scheduling the Association Cleanup job");
+ final JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
+ final JobInfo job = new JobInfo.Builder(JOB_ID,
+ new ComponentName(context, AssociationCleanUpService.class))
+ .setRequiresCharging(true)
+ .setRequiresDeviceIdle(true)
+ .setPeriodic(ONE_DAY_INTERVAL)
+ .build();
+ jobScheduler.schedule(job);
+ }
+}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 5aa1c93..94a97d8 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -19,7 +19,7 @@
import static android.Manifest.permission.MANAGE_COMPANION_DEVICES;
import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_ALL_MATCHES;
-import static android.bluetooth.le.ScanSettings.SCAN_MODE_BALANCED;
+import static android.bluetooth.le.ScanSettings.SCAN_MODE_LOW_POWER;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
import static android.content.pm.PackageManager.FEATURE_COMPANION_DEVICE_SETUP;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
@@ -149,6 +149,9 @@
private static final String PREF_FILE_NAME = "companion_device_preferences.xml";
private static final String PREF_KEY_AUTO_REVOKE_GRANTS_DONE = "auto_revoke_grants_done";
+ private static final long ASSOCIATION_CLEAN_UP_TIME_WINDOW =
+ 90L * 24 * 60 * 60 * 1000; // 3 months
+
private static DateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
static {
sDateFormat.setTimeZone(TimeZone.getDefault());
@@ -179,6 +182,7 @@
new ArrayMap<>();
private final RemoteCallbackList<IOnAssociationsChangedListener> mListeners =
new RemoteCallbackList<>();
+ private final CompanionDeviceManagerServiceInternal mLocalService = new LocalService(this);
final Handler mMainHandler = Handler.getMain();
private CompanionDevicePresenceController mCompanionDevicePresenceController;
@@ -208,6 +212,8 @@
mPermissionControllerManager = requireNonNull(
context.getSystemService(PermissionControllerManager.class));
mUserManager = context.getSystemService(UserManager.class);
+
+ LocalServices.addService(CompanionDeviceManagerServiceInternal.class, mLocalService);
}
@Override
@@ -250,6 +256,9 @@
} else {
Slog.w(LOG_TAG, "No BluetoothAdapter available");
}
+ } else if (phase == PHASE_BOOT_COMPLETED) {
+ // Run the Association CleanUp job service daily.
+ AssociationCleanUpService.schedule(getContext());
}
}
@@ -294,6 +303,24 @@
return association;
}
+ // Revoke associations if the selfManaged companion device does not connect for 3
+ // months for specific profile.
+ private void associationCleanUp(String profile) {
+ for (AssociationInfo ai : mAssociationStore.getAssociations()) {
+ if (ai.isSelfManaged()
+ && profile.equals(ai.getDeviceProfile())
+ && System.currentTimeMillis() - ai.getLastTimeConnectedMs()
+ >= ASSOCIATION_CLEAN_UP_TIME_WINDOW) {
+ Slog.d(LOG_TAG, "Removing the association for associationId: "
+ + ai.getId()
+ + " due to the device does not connect for 3 months."
+ + " Current time: "
+ + new Date(System.currentTimeMillis()));
+ disassociateInternal(ai.getId());
+ }
+ }
+ }
+
void maybeGrantAutoRevokeExemptions() {
Slog.d(LOG_TAG, "maybeGrantAutoRevokeExemptions()");
PackageManager pm = getContext().getPackageManager();
@@ -573,6 +600,9 @@
return;
}
+ association.setLastTimeConnected(System.currentTimeMillis());
+ mAssociationStore.updateAssociation(association);
+
mCompanionDevicePresenceController.onDeviceNotifyAppeared(
association, getContext(), mMainHandler);
}
@@ -735,7 +765,8 @@
final long timestamp = System.currentTimeMillis();
final AssociationInfo association = new AssociationInfo(id, userId, packageName,
- macAddress, displayName, deviceProfile, selfManaged, false, timestamp);
+ macAddress, displayName, deviceProfile, selfManaged, false, timestamp,
+ Long.MAX_VALUE);
Slog.i(LOG_TAG, "New CDM association created=" + association);
mAssociationStore.addAssociation(association);
@@ -1169,7 +1200,7 @@
} else {
scanner.startScan(
filters,
- new ScanSettings.Builder().setScanMode(SCAN_MODE_BALANCED).build(),
+ new ScanSettings.Builder().setScanMode(SCAN_MODE_LOW_POWER).build(),
mBleScanCallback);
}
}
@@ -1297,4 +1328,17 @@
return Collections.unmodifiableMap(copy);
}
+
+ private final class LocalService extends CompanionDeviceManagerServiceInternal {
+ private final CompanionDeviceManagerService mService;
+
+ LocalService(CompanionDeviceManagerService service) {
+ mService = service;
+ }
+
+ @Override
+ public void associationCleanUp(String profile) {
+ mService.associationCleanUp(profile);
+ }
+ }
}
diff --git a/core/java/android/app/communal/ICommunalModeListener.aidl b/services/companion/java/com/android/server/companion/CompanionDeviceManagerServiceInternal.java
similarity index 63%
rename from core/java/android/app/communal/ICommunalModeListener.aidl
rename to services/companion/java/com/android/server/companion/CompanionDeviceManagerServiceInternal.java
index 006e782..326fefe 100644
--- a/core/java/android/app/communal/ICommunalModeListener.aidl
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerServiceInternal.java
@@ -14,13 +14,16 @@
* limitations under the License.
*/
-package android.app.communal;
+package com.android.server.companion;
/**
- * System private API to be notified about communal mode changes.
+ * Companion Device Manager Local System Service Interface.
*
- * @hide
+ * @hide Only for use within the system server.
*/
-oneway interface ICommunalModeListener {
- void onCommunalModeChanged(boolean isCommunalMode);
-}
\ No newline at end of file
+public abstract class CompanionDeviceManagerServiceInternal {
+ /**
+ * @see CompanionDeviceManagerService#associationCleanUp
+ */
+ public abstract void associationCleanUp(String profile);
+}
diff --git a/services/companion/java/com/android/server/companion/PersistentDataStore.java b/services/companion/java/com/android/server/companion/PersistentDataStore.java
index 97ec3bb..ef3aa7f 100644
--- a/services/companion/java/com/android/server/companion/PersistentDataStore.java
+++ b/services/companion/java/com/android/server/companion/PersistentDataStore.java
@@ -168,6 +168,7 @@
private static final String XML_ATTR_SELF_MANAGED = "self_managed";
private static final String XML_ATTR_NOTIFY_DEVICE_NEARBY = "notify_device_nearby";
private static final String XML_ATTR_TIME_APPROVED = "time_approved";
+ private static final String XML_ATTR_LAST_TIME_CONNECTED = "last_time_connected";
private static final String LEGACY_XML_ATTR_DEVICE = "device";
@@ -378,7 +379,7 @@
out.add(new AssociationInfo(associationId, userId, appPackage,
MacAddress.fromString(deviceAddress), null, profile,
- /* managedByCompanionApp */false, notify, timeApproved));
+ /* managedByCompanionApp */false, notify, timeApproved, Long.MAX_VALUE));
}
private static void readAssociationsV1(@NonNull TypedXmlPullParser parser,
@@ -408,9 +409,12 @@
final boolean selfManaged = readBooleanAttribute(parser, XML_ATTR_SELF_MANAGED);
final boolean notify = readBooleanAttribute(parser, XML_ATTR_NOTIFY_DEVICE_NEARBY);
final long timeApproved = readLongAttribute(parser, XML_ATTR_TIME_APPROVED, 0L);
+ final long lastTimeConnected = readLongAttribute(
+ parser, XML_ATTR_LAST_TIME_CONNECTED, Long.MAX_VALUE);
final AssociationInfo associationInfo = createAssociationInfoNoThrow(associationId, userId,
- appPackage, macAddress, displayName, profile, selfManaged, notify, timeApproved);
+ appPackage, macAddress, displayName, profile, selfManaged, notify, timeApproved,
+ lastTimeConnected);
if (associationInfo != null) {
out.add(associationInfo);
}
@@ -464,6 +468,8 @@
writeBooleanAttribute(
serializer, XML_ATTR_NOTIFY_DEVICE_NEARBY, a.isNotifyOnDeviceNearby());
writeLongAttribute(serializer, XML_ATTR_TIME_APPROVED, a.getTimeApprovedMs());
+ writeLongAttribute(
+ serializer, XML_ATTR_LAST_TIME_CONNECTED, a.getLastTimeConnectedMs());
serializer.endTag(null, XML_TAG_ASSOCIATION);
}
@@ -512,11 +518,11 @@
private static AssociationInfo createAssociationInfoNoThrow(int associationId,
@UserIdInt int userId, @NonNull String appPackage, @Nullable MacAddress macAddress,
@Nullable CharSequence displayName, @Nullable String profile, boolean selfManaged,
- boolean notify, long timeApproved) {
+ boolean notify, long timeApproved, long lastTimeConnected) {
AssociationInfo associationInfo = null;
try {
associationInfo = new AssociationInfo(associationId, userId, appPackage, macAddress,
- displayName, profile, selfManaged, notify, timeApproved);
+ displayName, profile, selfManaged, notify, timeApproved, lastTimeConnected);
} catch (Exception e) {
if (DEBUG) Slog.w(LOG_TAG, "Could not create AssociationInfo", e);
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 780afd8..ec018de 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -3846,7 +3846,7 @@
final boolean primary = false;
final boolean removable = false;
final boolean emulated = true;
- final boolean stub = false;
+ final boolean externallyManaged = false;
final boolean allowMassStorage = false;
final long maxFileSize = 0;
final UserHandle user = new UserHandle(userId);
@@ -3854,7 +3854,8 @@
final String description = mContext.getString(android.R.string.unknownName);
res.add(new StorageVolume(id, path, path, description, primary, removable, emulated,
- stub, allowMassStorage, maxFileSize, user, null /*uuid */, id, envState));
+ externallyManaged, allowMassStorage, maxFileSize, user, null /*uuid */, id,
+ envState));
}
if (!foundPrimary) {
@@ -3869,7 +3870,7 @@
final boolean primary = true;
final boolean removable = primaryPhysical;
final boolean emulated = !primaryPhysical;
- final boolean stub = false;
+ final boolean externallyManaged = false;
final boolean allowMassStorage = false;
final long maxFileSize = 0L;
final UserHandle owner = new UserHandle(userId);
@@ -3878,7 +3879,7 @@
final String state = Environment.MEDIA_REMOVED;
res.add(0, new StorageVolume(id, path, path,
- description, primary, removable, emulated, stub,
+ description, primary, removable, emulated, externallyManaged,
allowMassStorage, maxFileSize, owner, uuid, fsUuid, state));
}
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 1208cb7..e7f4de2 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -26,6 +26,7 @@
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
+import android.util.ArraySet;
import android.util.EventLog;
import android.util.IndentingPrintWriter;
import android.util.Slog;
@@ -45,6 +46,9 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@@ -91,7 +95,8 @@
private long mRuntimeStartUptime;
// Services that should receive lifecycle events.
- private final ArrayList<SystemService> mServices = new ArrayList<SystemService>();
+ private List<SystemService> mServices;
+ private Set<String> mServiceClassnames;
private int mCurrentPhase = -1;
@@ -113,11 +118,13 @@
SystemServiceManager(Context context) {
mContext = context;
+ mServices = new ArrayList<>();
+ mServiceClassnames = new ArraySet<>();
// Disable using the thread pool for low ram devices
sUseLifecycleThreadPool = sUseLifecycleThreadPool
- && !ActivityManager.isLowRamDeviceStatic();
+ && !ActivityManager.isLowRamDeviceStatic();
mNumUserPoolThreads = Math.min(Runtime.getRuntime().availableProcessors(),
- DEFAULT_MAX_USER_POOL_THREADS);
+ DEFAULT_MAX_USER_POOL_THREADS);
}
/**
@@ -207,8 +214,17 @@
}
public void startService(@NonNull final SystemService service) {
+ // Check if already started
+ String className = service.getClass().getName();
+ if (mServiceClassnames.contains(className)) {
+ Slog.i(TAG, "Not starting an already started service " + className);
+ return;
+ }
+ mServiceClassnames.add(className);
+
// Register it.
mServices.add(service);
+
// Start it.
long time = SystemClock.elapsedRealtime();
try {
@@ -220,11 +236,17 @@
warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
+ /** Disallow starting new services after this call. */
+ void sealStartedServices() {
+ mServiceClassnames = Collections.emptySet();
+ mServices = Collections.unmodifiableList(mServices);
+ }
+
/**
* Starts the specified boot phase for all system services that have been started up to
* this point.
*
- * @param t trace logger
+ * @param t trace logger
* @param phase The boot phase to start.
*/
public void startBootPhase(@NonNull TimingsTraceAndSlog t, int phase) {
@@ -398,8 +420,8 @@
// Limit the lifecycle parallelization to all users other than the system user
// and only for the user start lifecycle phase for now.
final boolean useThreadPool = sUseLifecycleThreadPool
- && curUserId != UserHandle.USER_SYSTEM
- && onWhat.equals(USER_STARTING);
+ && curUserId != UserHandle.USER_SYSTEM
+ && onWhat.equals(USER_STARTING);
final ExecutorService threadPool =
useThreadPool ? Executors.newFixedThreadPool(mNumUserPoolThreads) : null;
for (int i = 0; i < serviceLen; i++) {
@@ -419,7 +441,7 @@
+ serviceName + " because it's not supported (curUser: "
+ curUser + ", prevUser:" + prevUser + ")");
} else {
- Slog.i(TAG, "Skipping " + onWhat + "User-" + curUserId + " on "
+ Slog.i(TAG, "Skipping " + onWhat + "User-" + curUserId + " on "
+ serviceName);
}
continue;
@@ -516,6 +538,7 @@
/**
* Returns whether we are booting into safe mode.
+ *
* @return safe mode flag
*/
public boolean isSafeMode() {
@@ -559,9 +582,10 @@
/**
* Ensures that the system directory exist creating one if needed.
+ *
+ * @return The system directory.
* @deprecated Use {@link Environment#getDataSystemCeDirectory()}
* or {@link Environment#getDataSystemDeDirectory()} instead.
- * @return The system directory.
*/
@Deprecated
public static File ensureSystemDir() {
@@ -578,7 +602,9 @@
pw.printf("Current phase: %d\n", mCurrentPhase);
synchronized (mTargetUsers) {
if (mCurrentUser != null) {
- pw.print("Current user: "); mCurrentUser.dump(pw); pw.println();
+ pw.print("Current user: ");
+ mCurrentUser.dump(pw);
+ pw.println();
} else {
pw.println("Current user not set!");
}
diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java
index 0c990ec..6a7afd9 100644
--- a/services/core/java/com/android/server/VcnManagementService.java
+++ b/services/core/java/com/android/server/VcnManagementService.java
@@ -24,7 +24,6 @@
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_INACTIVE;
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_NOT_CONFIGURED;
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE;
-import static android.telephony.SubscriptionManager.isValidSubscriptionId;
import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot;
import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionTrackerCallback;
@@ -164,10 +163,6 @@
@VisibleForTesting(visibility = Visibility.PRIVATE)
static final String VCN_CONFIG_FILE = "/data/system/vcn/configs.xml";
- // TODO(b/176956496): Directly use CarrierServiceBindHelper.UNBIND_DELAY_MILLIS
- @VisibleForTesting(visibility = Visibility.PRIVATE)
- static final long CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS = TimeUnit.SECONDS.toMillis(30);
-
/* Binder context for this service */
@NonNull private final Context mContext;
@NonNull private final Dependencies mDeps;
@@ -372,12 +367,15 @@
/** Notifies the VcnManagementService that external dependencies can be set up. */
public void systemReady() {
- mNetworkProvider.register();
- mContext.getSystemService(ConnectivityManager.class)
- .registerNetworkCallback(
- new NetworkRequest.Builder().clearCapabilities().build(),
- mTrackingNetworkCallback);
- mTelephonySubscriptionTracker.register();
+ // Always run on the handler thread to ensure consistency.
+ mHandler.post(() -> {
+ mNetworkProvider.register();
+ mContext.getSystemService(ConnectivityManager.class)
+ .registerNetworkCallback(
+ new NetworkRequest.Builder().clearCapabilities().build(),
+ mTrackingNetworkCallback);
+ mTelephonySubscriptionTracker.register();
+ });
}
private void enforcePrimaryUser() {
@@ -471,22 +469,15 @@
if (!mVcns.containsKey(subGrp)) {
startVcnLocked(subGrp, entry.getValue());
}
-
- // Cancel any scheduled teardowns for active subscriptions
- mHandler.removeCallbacksAndMessages(mVcns.get(subGrp));
}
}
- // Schedule teardown of any VCN instances that have lost carrier privileges (after a
- // delay)
+ // Schedule teardown of any VCN instances that have lost carrier privileges
for (Entry<ParcelUuid, Vcn> entry : mVcns.entrySet()) {
final ParcelUuid subGrp = entry.getKey();
final VcnConfig config = mConfigs.get(subGrp);
final boolean isActiveSubGrp = isActiveSubGroup(subGrp, snapshot);
- final boolean isValidActiveDataSubIdNotInVcnSubGrp =
- isValidSubscriptionId(snapshot.getActiveDataSubscriptionId())
- && !isActiveSubGroup(subGrp, snapshot);
// TODO(b/193687515): Support multiple VCNs active at the same time
if (config == null
@@ -496,31 +487,12 @@
final ParcelUuid uuidToTeardown = subGrp;
final Vcn instanceToTeardown = entry.getValue();
- // TODO(b/193687515): Support multiple VCNs active at the same time
- // If directly switching to a subscription not in the current group,
- // teardown immediately to prevent other subscription's network from being
- // outscored by the VCN. Otherwise, teardown after a delay to ensure that
- // SIM profile switches do not trigger the VCN to cycle.
- final long teardownDelayMs =
- isValidActiveDataSubIdNotInVcnSubGrp
- ? 0
- : CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS;
- mHandler.postDelayed(() -> {
- synchronized (mLock) {
- // Guard against case where this is run after a old instance was
- // torn down, and a new instance was started. Verify to ensure
- // correct instance is torn down. This could happen as a result of a
- // Carrier App manually removing/adding a VcnConfig.
- if (mVcns.get(uuidToTeardown) == instanceToTeardown) {
- stopVcnLocked(uuidToTeardown);
+ stopVcnLocked(uuidToTeardown);
- // TODO(b/181789060): invoke asynchronously after Vcn notifies
- // through VcnCallback
- notifyAllPermissionedStatusCallbacksLocked(
- uuidToTeardown, VCN_STATUS_CODE_INACTIVE);
- }
- }
- }, instanceToTeardown, teardownDelayMs);
+ // TODO(b/181789060): invoke asynchronously after Vcn notifies
+ // through VcnCallback
+ notifyAllPermissionedStatusCallbacksLocked(
+ uuidToTeardown, VCN_STATUS_CODE_INACTIVE);
} else {
// If this VCN's status has not changed, update it with the new snapshot
entry.getValue().updateSubscriptionSnapshot(mLastSnapshot);
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index f591b26..297d28d 100644
--- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -18,6 +18,7 @@
import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull;
+import android.annotation.NonNull;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.Notification;
@@ -170,6 +171,12 @@
mAdbConnectionInfo = new AdbConnectionInfo();
}
+ static void sendBroadcastWithDebugPermission(@NonNull Context context, @NonNull Intent intent,
+ @NonNull UserHandle userHandle) {
+ context.sendBroadcastAsUser(intent, userHandle,
+ android.Manifest.permission.MANAGE_DEBUGGING);
+ }
+
class PairingThread extends Thread implements NsdManager.RegistrationListener {
private NsdManager mNsdManager;
private String mPublicKey;
@@ -1278,7 +1285,7 @@
? AdbManager.WIRELESS_STATUS_CONNECTED
: AdbManager.WIRELESS_STATUS_DISCONNECTED);
intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
}
private void onAdbdWifiServerConnected(int port) {
@@ -1350,7 +1357,8 @@
if (publicKey == null) {
Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA, AdbManager.WIRELESS_STATUS_FAIL);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent,
+ UserHandle.ALL);
} else {
Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA,
@@ -1366,7 +1374,8 @@
device.guid = hostname;
device.connected = false;
intent.putExtra(AdbManager.WIRELESS_PAIR_DEVICE_EXTRA, device);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent,
+ UserHandle.ALL);
// Add the key into the keystore
mAdbKeyStore.setLastConnectionTime(publicKey,
System.currentTimeMillis());
@@ -1380,14 +1389,14 @@
intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA,
AdbManager.WIRELESS_STATUS_CONNECTED);
intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
}
private void sendPairedDevicesToUI(Map<String, PairDevice> devices) {
Intent intent = new Intent(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION);
// Map is not serializable, so need to downcast
intent.putExtra(AdbManager.WIRELESS_DEVICES_EXTRA, (HashMap) devices);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
}
private void updateUIPairCode(String code) {
@@ -1397,7 +1406,7 @@
intent.putExtra(AdbManager.WIRELESS_PAIRING_CODE_EXTRA, code);
intent.putExtra(AdbManager.WIRELESS_STATUS_EXTRA,
AdbManager.WIRELESS_STATUS_PAIRING_CODE);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
}
}
diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java
index 7a4d2ce..2845fbf 100644
--- a/services/core/java/com/android/server/adb/AdbService.java
+++ b/services/core/java/com/android/server/adb/AdbService.java
@@ -459,7 +459,7 @@
? AdbManager.WIRELESS_STATUS_CONNECTED
: AdbManager.WIRELESS_STATUS_DISCONNECTED);
intent.putExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, port);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ AdbDebuggingManager.sendBroadcastWithDebugPermission(mContext, intent, UserHandle.ALL);
Slog.i(TAG, "sent port broadcast port=" + port);
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index da8c407..704d739 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2333,7 +2333,7 @@
offloadConstants.SLOW_TIME = Integer.MAX_VALUE;
mEnableOffloadQueue = SystemProperties.getBoolean(
- "persist.device_config.activity_manager_native_boot.offload_queue_enabled", false);
+ "persist.device_config.activity_manager_native_boot.offload_queue_enabled", true);
mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
"foreground", foreConstants, false);
diff --git a/services/core/java/com/android/server/am/AppNotRespondingDialog.java b/services/core/java/com/android/server/am/AppNotRespondingDialog.java
index 878ef31..5fe8427 100644
--- a/services/core/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/core/java/com/android/server/am/AppNotRespondingDialog.java
@@ -163,7 +163,9 @@
synchronized (mService.mProcLock) {
errState.setNotResponding(false);
- errState.setNotRespondingReport(null);
+ // We're not clearing the ANR report here, in case we'd need to report
+ // it again when the ANR dialog shows again.
+ // errState.setNotRespondingReport(null);
errState.getDialogController().clearAnrDialogs();
}
mService.mServices.scheduleServiceTimeoutLocked(app);
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index 336572f..8561b61 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -16,6 +16,7 @@
package com.android.server.am;
import android.annotation.Nullable;
+import android.app.usage.NetworkStatsManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
@@ -712,8 +713,10 @@
if (wifiInfo.isValid()) {
final long wifiChargeUC = measuredEnergyDeltas != null ?
measuredEnergyDeltas.wifiChargeUC : MeasuredEnergySnapshot.UNAVAILABLE;
- mStats.updateWifiState(
- extractDeltaLocked(wifiInfo), wifiChargeUC, elapsedRealtime, uptime);
+ final NetworkStatsManager networkStatsManager = mInjector.getSystemService(
+ NetworkStatsManager.class);
+ mStats.updateWifiState(extractDeltaLocked(wifiInfo),
+ wifiChargeUC, elapsedRealtime, uptime, networkStatsManager);
} else {
Slog.w(TAG, "wifi info is invalid: " + wifiInfo);
}
@@ -722,8 +725,10 @@
if (modemInfo != null) {
final long mobileRadioChargeUC = measuredEnergyDeltas != null
? measuredEnergyDeltas.mobileRadioChargeUC : MeasuredEnergySnapshot.UNAVAILABLE;
+ final NetworkStatsManager networkStatsManager = mInjector.getSystemService(
+ NetworkStatsManager.class);
mStats.noteModemControllerActivity(modemInfo, mobileRadioChargeUC, elapsedRealtime,
- uptime);
+ uptime, networkStatsManager);
}
if (updateFlags == UPDATE_ALL) {
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 8cb2040..9ffafe25 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -22,6 +22,7 @@
import android.annotation.NonNull;
import android.app.StatsManager;
+import android.app.usage.NetworkStatsManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.content.ContentResolver;
import android.content.Context;
@@ -2029,8 +2030,11 @@
synchronized (mLock) {
final long elapsedRealtime = SystemClock.elapsedRealtime();
final long uptime = SystemClock.uptimeMillis();
+ final NetworkStatsManager networkStatsManager = mContext.getSystemService(
+ NetworkStatsManager.class);
mHandler.post(() -> {
- mStats.updateWifiState(info, POWER_DATA_UNAVAILABLE, elapsedRealtime, uptime);
+ mStats.updateWifiState(info, POWER_DATA_UNAVAILABLE, elapsedRealtime, uptime,
+ networkStatsManager);
});
}
}
@@ -2067,9 +2071,11 @@
synchronized (mLock) {
final long elapsedRealtime = SystemClock.elapsedRealtime();
final long uptime = SystemClock.uptimeMillis();
+ final NetworkStatsManager networkStatsManager = mContext.getSystemService(
+ NetworkStatsManager.class);
mHandler.post(() -> {
mStats.noteModemControllerActivity(info, POWER_DATA_UNAVAILABLE, elapsedRealtime,
- uptime);
+ uptime, networkStatsManager);
});
}
}
diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java
index c55bbe8..c08cf64 100644
--- a/services/core/java/com/android/server/am/CachedAppOptimizer.java
+++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java
@@ -539,6 +539,8 @@
*/
static private native void compactProcess(int pid, int compactionFlags);
+ static private native void cancelCompaction();
+
/**
* Reads the flag value from DeviceConfig to determine whether app compaction
* should be enabled, and starts the freeze/compaction thread if needed.
@@ -1049,6 +1051,26 @@
}
}
+ @GuardedBy({"mService", "mProcLock"})
+ void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecord app) {
+ // Cancel any currently executing compactions
+ // if the process moved out of cached state
+ if (DefaultProcessDependencies.mPidCompacting == app.mPid && newAdj < oldAdj
+ && newAdj < ProcessList.CACHED_APP_MIN_ADJ) {
+ cancelCompaction();
+ }
+
+ // Perform a minor compaction when a perceptible app becomes the prev/home app
+ // Perform a major compaction when any app enters cached
+ if (oldAdj <= ProcessList.PERCEPTIBLE_APP_ADJ
+ && (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) {
+ compactAppSome(app);
+ } else if (newAdj >= ProcessList.CACHED_APP_MIN_ADJ
+ && newAdj <= ProcessList.CACHED_APP_MAX_ADJ) {
+ compactAppFull(app);
+ }
+ }
+
@VisibleForTesting
static final class LastCompactionStats {
private final long[] mRssAfterCompaction;
@@ -1091,6 +1113,13 @@
name = proc.processName;
opt.setHasPendingCompact(false);
+ if (mAm.mInternal.isPendingTopUid(proc.uid)) {
+ // In case the OOM Adjust has not yet been propagated we see if this is
+ // pending on becoming top app in which case we should not compact.
+ Slog.e(TAG_AM, "Skip compaction since UID is active for " + name);
+ return;
+ }
+
// don't compact if the process has returned to perceptible
// and this is only a cached/home/prev compaction
if ((pendingAction == COMPACT_PROCESS_SOME
@@ -1500,6 +1529,8 @@
* Default implementation for ProcessDependencies, public vor visibility to OomAdjuster class.
*/
private static final class DefaultProcessDependencies implements ProcessDependencies {
+ public static int mPidCompacting = -1;
+
// Get memory RSS from process.
@Override
public long[] getRss(int pid) {
@@ -1509,6 +1540,7 @@
// Compact process.
@Override
public void performCompaction(String action, int pid) throws IOException {
+ mPidCompacting = pid;
if (action.equals(COMPACT_ACTION_STRING[COMPACT_ACTION_FULL])) {
compactProcess(pid, COMPACT_ACTION_FILE_FLAG | COMPACT_ACTION_ANON_FLAG);
} else if (action.equals(COMPACT_ACTION_STRING[COMPACT_ACTION_FILE])) {
@@ -1516,6 +1548,7 @@
} else if (action.equals(COMPACT_ACTION_STRING[COMPACT_ACTION_ANON])) {
compactProcess(pid, COMPACT_ACTION_ANON_FLAG);
}
+ mPidCompacting = -1;
}
}
}
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java
index af4ff58..b123496 100644
--- a/services/core/java/com/android/server/am/OomAdjuster.java
+++ b/services/core/java/com/android/server/am/OomAdjuster.java
@@ -2486,18 +2486,9 @@
// don't compact during bootup
if (mCachedAppOptimizer.useCompaction() && mService.mBooted) {
// Cached and prev/home compaction
+ // reminder: here, setAdj is previous state, curAdj is upcoming state
if (state.getCurAdj() != state.getSetAdj()) {
- // Perform a minor compaction when a perceptible app becomes the prev/home app
- // Perform a major compaction when any app enters cached
- // reminder: here, setAdj is previous state, curAdj is upcoming state
- if (state.getSetAdj() <= ProcessList.PERCEPTIBLE_APP_ADJ
- && (state.getCurAdj() == ProcessList.PREVIOUS_APP_ADJ
- || state.getCurAdj() == ProcessList.HOME_APP_ADJ)) {
- mCachedAppOptimizer.compactAppSome(app);
- } else if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ
- && state.getCurAdj() <= ProcessList.CACHED_APP_MAX_ADJ) {
- mCachedAppOptimizer.compactAppFull(app);
- }
+ mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app);
} else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE
&& state.getSetAdj() < ProcessList.FOREGROUND_APP_ADJ
// Because these can fire independent of oom_adj/procstate changes, we need
diff --git a/services/core/java/com/android/server/apphibernation/AppHibernationService.java b/services/core/java/com/android/server/apphibernation/AppHibernationService.java
index 4d025c9..9d4d1c1 100644
--- a/services/core/java/com/android/server/apphibernation/AppHibernationService.java
+++ b/services/core/java/com/android/server/apphibernation/AppHibernationService.java
@@ -223,10 +223,10 @@
android.Manifest.permission.MANAGE_APP_HIBERNATION,
"Caller does not have MANAGE_APP_HIBERNATION permission.");
userId = handleIncomingUser(userId, methodName);
- if (!checkUserStatesExist(userId, methodName)) {
- return false;
- }
synchronized (mLock) {
+ if (!checkUserStatesExist(userId, methodName)) {
+ return false;
+ }
final Map<String, UserLevelState> packageStates = mUserStates.get(userId);
final UserLevelState pkgState = packageStates.get(packageName);
if (pkgState == null) {
@@ -278,10 +278,10 @@
android.Manifest.permission.MANAGE_APP_HIBERNATION,
"Caller does not have MANAGE_APP_HIBERNATION permission.");
final int realUserId = handleIncomingUser(userId, methodName);
- if (!checkUserStatesExist(realUserId, methodName)) {
- return;
- }
synchronized (mLock) {
+ if (!checkUserStatesExist(realUserId, methodName)) {
+ return;
+ }
final Map<String, UserLevelState> packageStates = mUserStates.get(realUserId);
final UserLevelState pkgState = packageStates.get(packageName);
if (pkgState == null) {
@@ -365,10 +365,10 @@
android.Manifest.permission.MANAGE_APP_HIBERNATION,
"Caller does not have MANAGE_APP_HIBERNATION permission.");
userId = handleIncomingUser(userId, methodName);
- if (!checkUserStatesExist(userId, methodName)) {
- return hibernatingPackages;
- }
synchronized (mLock) {
+ if (!checkUserStatesExist(userId, methodName)) {
+ return hibernatingPackages;
+ }
Map<String, UserLevelState> userStates = mUserStates.get(userId);
for (UserLevelState state : userStates.values()) {
if (state.hibernated) {
@@ -658,6 +658,14 @@
}
}
+ /**
+ * Check that user states exist.
+ *
+ * @param userId user to check
+ * @param methodName method name that is calling. Used for logging purposes.
+ * @return true if user states exist
+ */
+ @GuardedBy("mLock")
private boolean checkUserStatesExist(int userId, String methodName) {
if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
Slog.e(TAG, String.format(
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index a27e4b77..023a11e 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -238,6 +238,9 @@
//------------------------------------------------------------
/*package*/ void dump(PrintWriter pw, String prefix) {
+ pw.println("\n" + prefix + "BECOMING_NOISY_INTENT_DEVICES_SET=");
+ BECOMING_NOISY_INTENT_DEVICES_SET.forEach(device -> {
+ pw.print(" 0x" + Integer.toHexString(device)); });
pw.println("\n" + prefix + "Preferred devices for strategy:");
mPreferredDevices.forEach((strategy, device) -> {
pw.println(" " + prefix + "strategy:" + strategy + " device:" + device); });
@@ -1204,10 +1207,13 @@
state == AudioService.CONNECTION_STATE_CONNECTED
? MediaMetrics.Value.CONNECTED : MediaMetrics.Value.DISCONNECTED);
if (state != AudioService.CONNECTION_STATE_DISCONNECTED) {
+ Log.i(TAG, "not sending NOISY: state=" + state);
mmi.set(MediaMetrics.Property.DELAY_MS, 0).record(); // OK to return
return 0;
}
if (!BECOMING_NOISY_INTENT_DEVICES_SET.contains(device)) {
+ Log.i(TAG, "not sending NOISY: device=0x" + Integer.toHexString(device)
+ + " not in set " + BECOMING_NOISY_INTENT_DEVICES_SET);
mmi.set(MediaMetrics.Property.DELAY_MS, 0).record(); // OK to return
return 0;
}
@@ -1217,18 +1223,24 @@
if (((di.mDeviceType & AudioSystem.DEVICE_BIT_IN) == 0)
&& BECOMING_NOISY_INTENT_DEVICES_SET.contains(di.mDeviceType)) {
devices.add(di.mDeviceType);
+ Log.i(TAG, "NOISY: adding 0x" + Integer.toHexString(di.mDeviceType));
}
}
if (musicDevice == AudioSystem.DEVICE_NONE) {
musicDevice = mDeviceBroker.getDeviceForStream(AudioSystem.STREAM_MUSIC);
+ Log.i(TAG, "NOISY: musicDevice changing from NONE to 0x"
+ + Integer.toHexString(musicDevice));
}
// always ignore condition on device being actually used for music when in communication
// because music routing is altered in this case.
// also checks whether media routing if affected by a dynamic policy or mirroring
- if (((device == musicDevice) || mDeviceBroker.isInCommunication())
- && AudioSystem.isSingleAudioDeviceType(devices, device)
- && !mDeviceBroker.hasMediaDynamicPolicy()
+ final boolean inCommunication = mDeviceBroker.isInCommunication();
+ final boolean singleAudioDeviceType = AudioSystem.isSingleAudioDeviceType(devices, device);
+ final boolean hasMediaDynamicPolicy = mDeviceBroker.hasMediaDynamicPolicy();
+ if (((device == musicDevice) || inCommunication)
+ && singleAudioDeviceType
+ && !hasMediaDynamicPolicy
&& (musicDevice != AudioSystem.DEVICE_OUT_REMOTE_SUBMIX)) {
if (!mAudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0 /*not looking in past*/)
&& !mDeviceBroker.hasAudioFocusUsers()) {
@@ -1241,6 +1253,12 @@
}
mDeviceBroker.postBroadcastBecomingNoisy();
delay = AudioService.BECOMING_NOISY_DELAY_MS;
+ } else {
+ Log.i(TAG, "not sending NOISY: device:0x" + Integer.toHexString(device)
+ + " musicDevice:0x" + Integer.toHexString(musicDevice)
+ + " inComm:" + inCommunication
+ + " mediaPolicy:" + hasMediaDynamicPolicy
+ + " singleDevice:" + singleAudioDeviceType);
}
mmi.set(MediaMetrics.Property.DELAY_MS, delay).record();
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 0879bec..69765d2 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -9319,8 +9319,6 @@
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- mAudioSystem.dump(pw);
-
sLifecycleLogger.dump(pw);
if (mAudioHandler != null) {
pw.println("\nMessage handler (watch for unhandled messages):");
@@ -9400,6 +9398,8 @@
pw.println("mHasSpatializerEffect:" + mHasSpatializerEffect);
pw.println("isSpatializerEnabled:" + isSpatializerEnabled());
pw.println("isSpatialAudioEnabled:" + isSpatialAudioEnabled());
+
+ mAudioSystem.dump(pw);
}
private void dumpSupportedSystemUsage(PrintWriter pw) {
diff --git a/services/core/java/com/android/server/audio/AudioSystemAdapter.java b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
index ac212ee..a2ba76b 100644
--- a/services/core/java/com/android/server/audio/AudioSystemAdapter.java
+++ b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
@@ -524,11 +524,28 @@
* @param pw
*/
public void dump(PrintWriter pw) {
+ pw.println("\nAudioSystemAdapter:");
+ pw.println(" mDevicesForStreamCache:");
+ if (mDevicesForStreamCache != null) {
+ for (Integer stream : mDevicesForStreamCache.keySet()) {
+ pw.println("\t stream:" + stream + " device:"
+ + AudioSystem.getOutputDeviceName(mDevicesForStreamCache.get(stream)));
+ }
+ }
+ pw.println(" mDevicesForAttrCache:");
+ if (mDevicesForAttrCache != null) {
+ for (AudioAttributes attr : mDevicesForAttrCache.keySet()) {
+ pw.println("\t" + attr);
+ for (AudioDeviceAttributes devAttr : mDevicesForAttrCache.get(attr)) {
+ pw.println("\t\t" + devAttr);
+ }
+ }
+ }
+
if (!ENABLE_GETDEVICES_STATS) {
- // only stats in this dump
+ // only stats in the rest of this dump
return;
}
- pw.println("\nAudioSystemAdapter:");
for (int i = 0; i < NB_MEASUREMENTS; i++) {
pw.println(mMethodNames[i]
+ ": counter=" + mMethodCallCounter[i]
diff --git a/services/core/java/com/android/server/biometrics/sensors/LockoutResetDispatcher.java b/services/core/java/com/android/server/biometrics/sensors/LockoutResetDispatcher.java
index f4997d4..92218b1 100644
--- a/services/core/java/com/android/server/biometrics/sensors/LockoutResetDispatcher.java
+++ b/services/core/java/com/android/server/biometrics/sensors/LockoutResetDispatcher.java
@@ -25,7 +25,11 @@
import android.os.RemoteException;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
/**
* Allows clients (such as keyguard) to register for notifications on when biometric lockout
@@ -37,7 +41,8 @@
private static final String TAG = "LockoutResetTracker";
private final Context mContext;
- private final ArrayList<ClientCallback> mClientCallbacks;
+ @VisibleForTesting
+ final List<ClientCallback> mClientCallbacks = new ArrayList<>();
private static class ClientCallback {
private static final long WAKELOCK_TIMEOUT_MS = 2000;
@@ -81,7 +86,6 @@
public LockoutResetDispatcher(Context context) {
mContext = context;
- mClientCallbacks = new ArrayList<>();
}
public void addCallback(IBiometricServiceLockoutResetCallback callback, String opPackageName) {
@@ -106,11 +110,13 @@
@Override
public void binderDied(IBinder who) {
Slog.e(TAG, "Callback binder died: " + who);
- for (ClientCallback callback : mClientCallbacks) {
+ final Iterator<ClientCallback> iterator = mClientCallbacks.iterator();
+ while (iterator.hasNext()) {
+ final ClientCallback callback = iterator.next();
if (callback.mCallback.asBinder().equals(who)) {
Slog.e(TAG, "Removing dead callback for: " + callback.mOpPackageName);
callback.releaseWakelock();
- mClientCallbacks.remove(callback);
+ iterator.remove();
}
}
}
diff --git a/services/core/java/com/android/server/communal/CommunalManagerService.java b/services/core/java/com/android/server/communal/CommunalManagerService.java
index 2a6456d..600313b 100644
--- a/services/core/java/com/android/server/communal/CommunalManagerService.java
+++ b/services/core/java/com/android/server/communal/CommunalManagerService.java
@@ -19,10 +19,7 @@
import android.Manifest;
import android.annotation.RequiresPermission;
import android.app.communal.ICommunalManager;
-import android.app.communal.ICommunalModeListener;
import android.content.Context;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.SystemService;
@@ -36,9 +33,6 @@
private final Context mContext;
private final AtomicBoolean mCommunalViewIsShowing = new AtomicBoolean(false);
private final BinderService mBinderService;
- private final RemoteCallbackList<ICommunalModeListener> mListeners =
- new RemoteCallbackList<>();
-
public CommunalManagerService(Context context) {
super(context);
@@ -56,27 +50,6 @@
publishBinderService(Context.COMMUNAL_SERVICE, mBinderService);
}
- private void dispatchCommunalMode(boolean isShowing) {
- synchronized (mListeners) {
- int i = mListeners.beginBroadcast();
- while (i > 0) {
- i--;
- try {
- mListeners.getBroadcastItem(i).onCommunalModeChanged(isShowing);
- } catch (RemoteException e) {
- // Handled by the RemoteCallbackList.
- }
- }
- mListeners.finishBroadcast();
- }
- }
-
- private void enforceReadPermission() {
- mContext.enforceCallingPermission(Manifest.permission.READ_COMMUNAL_STATE,
- Manifest.permission.READ_COMMUNAL_STATE
- + "permission required to read communal state.");
- }
-
private final class BinderService extends ICommunalManager.Stub {
/**
* Sets whether or not we are in communal mode.
@@ -91,39 +64,6 @@
return;
}
mCommunalViewIsShowing.set(isShowing);
- dispatchCommunalMode(isShowing);
- }
-
- /**
- * Checks whether or not we are in communal mode.
- */
- @RequiresPermission(Manifest.permission.READ_COMMUNAL_STATE)
- @Override
- public boolean isCommunalMode() {
- enforceReadPermission();
- return mCommunalViewIsShowing.get();
- }
-
- /**
- * Adds a callback to execute when communal state changes.
- */
- @RequiresPermission(Manifest.permission.READ_COMMUNAL_STATE)
- public void addCommunalModeListener(ICommunalModeListener listener) {
- enforceReadPermission();
- synchronized (mListeners) {
- mListeners.register(listener);
- }
- }
-
- /**
- * Removes an added callback that execute when communal state changes.
- */
- @RequiresPermission(Manifest.permission.READ_COMMUNAL_STATE)
- public void removeCommunalModeListener(ICommunalModeListener listener) {
- enforceReadPermission();
- synchronized (mListeners) {
- mListeners.unregister(listener);
- }
}
}
}
diff --git a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
index 72e900b..cc9efbc 100644
--- a/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
+++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
@@ -68,7 +68,6 @@
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.net.NetworkPolicyManagerInternal;
-import com.android.server.net.NetworkStatsManagerInternal;
import java.time.Clock;
import java.time.ZoneId;
@@ -262,8 +261,10 @@
private long getNetworkTotalBytes(long start, long end) {
try {
- return LocalServices.getService(NetworkStatsManagerInternal.class)
- .getNetworkTotalBytes(mNetworkTemplate, start, end);
+ final android.app.usage.NetworkStats.Bucket ret =
+ mContext.getSystemService(NetworkStatsManager.class)
+ .querySummaryForDevice(mNetworkTemplate, start, end);
+ return ret.getRxBytes() + ret.getTxBytes();
} catch (RuntimeException e) {
Log.w(TAG, "Failed to get data usage: " + e);
return -1;
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index c4f2b14..be889e4 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1781,6 +1781,14 @@
return mDisplayModeDirector.getModeSwitchingType();
}
+ private boolean getDisplayDecorationSupportInternal(int displayId) {
+ final IBinder displayToken = getDisplayToken(displayId);
+ if (null == displayToken) {
+ return false;
+ }
+ return SurfaceControl.getDisplayDecorationSupport(displayToken);
+ }
+
private void setBrightnessConfigurationForDisplayInternal(
@Nullable BrightnessConfiguration c, String uniqueId, @UserIdInt int userId,
String packageName) {
@@ -3441,6 +3449,16 @@
Binder.restoreCallingIdentity(token);
}
}
+
+ @Override // Binder call
+ public boolean getDisplayDecorationSupport(int displayId) {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ return getDisplayDecorationSupportInternal(displayId);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
}
private static boolean isValidBrightness(float brightness) {
diff --git a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
index cc5aaf4..9b0b782 100644
--- a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
+++ b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
@@ -35,6 +35,7 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.ServiceSpecificException;
import android.util.Log;
import android.util.Pair;
@@ -435,7 +436,7 @@
public void onHostEndpointConnected(HostEndpointInfo info) {
try {
mHub.onHostEndpointConnected(info);
- } catch (RemoteException e) {
+ } catch (RemoteException | ServiceSpecificException e) {
Log.e(TAG, "RemoteException in onHostEndpointConnected");
}
}
@@ -444,7 +445,7 @@
public void onHostEndpointDisconnected(short hostEndpointId) {
try {
mHub.onHostEndpointDisconnected((char) hostEndpointId);
- } catch (RemoteException e) {
+ } catch (RemoteException | ServiceSpecificException e) {
Log.e(TAG, "RemoteException in onHostEndpointDisconnected");
}
}
@@ -453,8 +454,13 @@
public int sendMessageToContextHub(
short hostEndpointId, int contextHubId, NanoAppMessage message)
throws RemoteException {
- return toTransactionResult(mHub.sendMessageToHub(contextHubId,
- ContextHubServiceUtil.createAidlContextHubMessage(hostEndpointId, message)));
+ try {
+ mHub.sendMessageToHub(contextHubId,
+ ContextHubServiceUtil.createAidlContextHubMessage(hostEndpointId, message));
+ return ContextHubTransaction.RESULT_SUCCESS;
+ } catch (RemoteException | ServiceSpecificException e) {
+ return ContextHubTransaction.RESULT_FAILED_UNKNOWN;
+ }
}
@ContextHubTransaction.Result
@@ -462,49 +468,71 @@
int transactionId) throws RemoteException {
android.hardware.contexthub.NanoappBinary aidlNanoAppBinary =
ContextHubServiceUtil.createAidlNanoAppBinary(binary);
- return toTransactionResult(
- mHub.loadNanoapp(contextHubId, aidlNanoAppBinary, transactionId));
+ try {
+ mHub.loadNanoapp(contextHubId, aidlNanoAppBinary, transactionId);
+ return ContextHubTransaction.RESULT_SUCCESS;
+ } catch (RemoteException | ServiceSpecificException e) {
+ return ContextHubTransaction.RESULT_FAILED_UNKNOWN;
+ }
}
@ContextHubTransaction.Result
public int unloadNanoapp(int contextHubId, long nanoappId, int transactionId)
throws RemoteException {
- return toTransactionResult(mHub.unloadNanoapp(contextHubId, nanoappId, transactionId));
+ try {
+ mHub.unloadNanoapp(contextHubId, nanoappId, transactionId);
+ return ContextHubTransaction.RESULT_SUCCESS;
+ } catch (RemoteException | ServiceSpecificException e) {
+ return ContextHubTransaction.RESULT_FAILED_UNKNOWN;
+ }
}
@ContextHubTransaction.Result
public int enableNanoapp(int contextHubId, long nanoappId, int transactionId)
throws RemoteException {
- return toTransactionResult(mHub.enableNanoapp(contextHubId, nanoappId, transactionId));
+ try {
+ mHub.enableNanoapp(contextHubId, nanoappId, transactionId);
+ return ContextHubTransaction.RESULT_SUCCESS;
+ } catch (RemoteException | ServiceSpecificException e) {
+ return ContextHubTransaction.RESULT_FAILED_UNKNOWN;
+ }
}
@ContextHubTransaction.Result
public int disableNanoapp(int contextHubId, long nanoappId, int transactionId)
throws RemoteException {
- return toTransactionResult(mHub.disableNanoapp(contextHubId, nanoappId, transactionId));
+ try {
+ mHub.disableNanoapp(contextHubId, nanoappId, transactionId);
+ return ContextHubTransaction.RESULT_SUCCESS;
+ } catch (RemoteException | ServiceSpecificException e) {
+ return ContextHubTransaction.RESULT_FAILED_UNKNOWN;
+ }
}
@ContextHubTransaction.Result
public int queryNanoapps(int contextHubId) throws RemoteException {
- return toTransactionResult(mHub.queryNanoapps(contextHubId));
+ try {
+ mHub.queryNanoapps(contextHubId);
+ return ContextHubTransaction.RESULT_SUCCESS;
+ } catch (RemoteException | ServiceSpecificException e) {
+ return ContextHubTransaction.RESULT_FAILED_UNKNOWN;
+ }
}
public void registerCallback(int contextHubId, ICallback callback) throws RemoteException {
mAidlCallbackMap.put(contextHubId, new ContextHubAidlCallback(contextHubId, callback));
- mHub.registerCallback(contextHubId, mAidlCallbackMap.get(contextHubId));
- }
-
- @ContextHubTransaction.Result
- private int toTransactionResult(boolean success) {
- return success ? ContextHubTransaction.RESULT_SUCCESS
- : ContextHubTransaction.RESULT_FAILED_UNKNOWN;
+ try {
+ mHub.registerCallback(contextHubId, mAidlCallbackMap.get(contextHubId));
+ } catch (RemoteException | ServiceSpecificException e) {
+ Log.e(TAG, "Exception while registering callback: " + e.getMessage());
+ }
}
private void onSettingChanged(byte setting, boolean enabled) {
try {
mHub.onSettingChanged(setting, enabled);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException while sending setting update");
+ } catch (RemoteException | ServiceSpecificException e) {
+ Log.e(TAG, "Exception while sending setting update: " + e.getMessage());
}
}
}
diff --git a/services/core/java/com/android/server/location/geofence/GeofenceManager.java b/services/core/java/com/android/server/location/geofence/GeofenceManager.java
index a52c9ce..5093f5d 100644
--- a/services/core/java/com/android/server/location/geofence/GeofenceManager.java
+++ b/services/core/java/com/android/server/location/geofence/GeofenceManager.java
@@ -131,8 +131,8 @@
return mPermitted;
}
- boolean onLocationPermissionsChanged(String packageName) {
- if (getIdentity().getPackageName().equals(packageName)) {
+ boolean onLocationPermissionsChanged(@Nullable String packageName) {
+ if (packageName == null || getIdentity().getPackageName().equals(packageName)) {
return onLocationPermissionsChanged();
}
@@ -242,7 +242,7 @@
mLocationPermissionsListener =
new LocationPermissionsHelper.LocationPermissionsListener() {
@Override
- public void onLocationPermissionsChanged(String packageName) {
+ public void onLocationPermissionsChanged(@Nullable String packageName) {
GeofenceManager.this.onLocationPermissionsChanged(packageName);
}
@@ -494,7 +494,7 @@
updateRegistrations(registration -> registration.getIdentity().getUserId() == userId);
}
- void onLocationPermissionsChanged(String packageName) {
+ void onLocationPermissionsChanged(@Nullable String packageName) {
updateRegistrations(registration -> registration.onLocationPermissionsChanged(packageName));
}
diff --git a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java
index 5e6ae68..a540476 100644
--- a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java
+++ b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java
@@ -119,8 +119,8 @@
*/
protected void onGnssListenerUnregister() {}
- boolean onLocationPermissionsChanged(String packageName) {
- if (getIdentity().getPackageName().equals(packageName)) {
+ boolean onLocationPermissionsChanged(@Nullable String packageName) {
+ if (packageName == null || getIdentity().getPackageName().equals(packageName)) {
return onLocationPermissionsChanged();
}
@@ -197,7 +197,7 @@
mLocationPermissionsListener =
new LocationPermissionsHelper.LocationPermissionsListener() {
@Override
- public void onLocationPermissionsChanged(String packageName) {
+ public void onLocationPermissionsChanged(@Nullable String packageName) {
GnssListenerMultiplexer.this.onLocationPermissionsChanged(packageName);
}
@@ -390,7 +390,7 @@
updateRegistrations(registration -> registration.getIdentity().getUserId() == userId);
}
- private void onLocationPermissionsChanged(String packageName) {
+ private void onLocationPermissionsChanged(@Nullable String packageName) {
updateRegistrations(registration -> registration.onLocationPermissionsChanged(packageName));
}
diff --git a/services/core/java/com/android/server/location/injector/LocationPermissionsHelper.java b/services/core/java/com/android/server/location/injector/LocationPermissionsHelper.java
index 2df2101..557ecda 100644
--- a/services/core/java/com/android/server/location/injector/LocationPermissionsHelper.java
+++ b/services/core/java/com/android/server/location/injector/LocationPermissionsHelper.java
@@ -18,6 +18,7 @@
import static com.android.server.location.LocationPermissions.PERMISSION_NONE;
+import android.annotation.Nullable;
import android.location.util.identity.CallerIdentity;
import com.android.server.location.LocationPermissions;
@@ -36,9 +37,10 @@
public interface LocationPermissionsListener {
/**
- * Called when something has changed about location permissions for the given package.
+ * Called when something has changed about location permissions for the given package. A
+ * null package indicates this affects every package.
*/
- void onLocationPermissionsChanged(String packageName);
+ void onLocationPermissionsChanged(@Nullable String packageName);
/**
* Called when something has changed about location permissions for the given uid.
diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
index 1ba32ac..d42e2c6 100644
--- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java
+++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
@@ -509,8 +509,8 @@
}
@GuardedBy("mLock")
- final boolean onLocationPermissionsChanged(String packageName) {
- if (getIdentity().getPackageName().equals(packageName)) {
+ final boolean onLocationPermissionsChanged(@Nullable String packageName) {
+ if (packageName == null || getIdentity().getPackageName().equals(packageName)) {
return onLocationPermissionsChanged();
}
@@ -915,30 +915,19 @@
return null;
}
+ // acquire a wakelock for non-passive requests
+ boolean useWakeLock =
+ getRequest().getIntervalMillis() != LocationRequest.PASSIVE_INTERVAL;
+
// deliver location
return new ListenerOperation<LocationTransport>() {
- private boolean mUseWakeLock;
-
@Override
public void onPreExecute() {
- mUseWakeLock = false;
-
- // don't acquire a wakelock for passive requests or for mock locations
- if (getRequest().getIntervalMillis() != LocationRequest.PASSIVE_INTERVAL) {
- final int size = locationResult.size();
- for (int i = 0; i < size; ++i) {
- if (!locationResult.get(i).isMock()) {
- mUseWakeLock = true;
- break;
- }
- }
- }
-
// update last delivered location
setLastDeliveredLocation(locationResult.getLastLocation());
- if (mUseWakeLock) {
+ if (useWakeLock) {
mWakeLock.acquire(WAKELOCK_TIMEOUT_MS);
}
}
@@ -955,14 +944,14 @@
}
listener.deliverOnLocationChanged(deliverLocationResult,
- mUseWakeLock ? mWakeLockReleaser : null);
+ useWakeLock ? mWakeLockReleaser : null);
EVENT_LOG.logProviderDeliveredLocations(mName, locationResult.size(),
getIdentity());
}
@Override
public void onPostExecute(boolean success) {
- if (!success && mUseWakeLock) {
+ if (!success && useWakeLock) {
mWakeLock.release();
}
@@ -1355,7 +1344,7 @@
private final LocationPermissionsListener mLocationPermissionsListener =
new LocationPermissionsListener() {
@Override
- public void onLocationPermissionsChanged(String packageName) {
+ public void onLocationPermissionsChanged(@Nullable String packageName) {
LocationProviderManager.this.onLocationPermissionsChanged(packageName);
}
@@ -2361,7 +2350,7 @@
}
}
- private void onLocationPermissionsChanged(String packageName) {
+ private void onLocationPermissionsChanged(@Nullable String packageName) {
synchronized (mLock) {
updateRegistrations(
registration -> registration.onLocationPermissionsChanged(packageName));
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index 4822d6a..96391ac 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -52,7 +52,6 @@
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SystemClock;
-import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
@@ -643,22 +642,24 @@
}
private void pushQueueUpdate() {
- ParceledListSlice<QueueItem> parcelableQueue;
+ ArrayList<QueueItem> toSend;
synchronized (mLock) {
if (mDestroyed) {
return;
}
- if (mQueue == null) {
- parcelableQueue = null;
- } else {
- parcelableQueue = new ParceledListSlice<>(mQueue);
- // Limit the size of initial Parcel to prevent binder buffer overflow
- // as onQueueChanged is an async binder call.
- parcelableQueue.setInlineCountLimit(1);
+ toSend = new ArrayList<>();
+ if (mQueue != null) {
+ toSend.ensureCapacity(mQueue.size());
+ toSend.addAll(mQueue);
}
}
Collection<ISessionControllerCallbackHolder> deadCallbackHolders = null;
for (ISessionControllerCallbackHolder holder : mControllerCallbackHolders) {
+ ParceledListSlice<QueueItem> parcelableQueue = new ParceledListSlice<>(toSend);
+ // Limit the size of initial Parcel to prevent binder buffer overflow
+ // as onQueueChanged is an async binder call.
+ parcelableQueue.setInlineCountLimit(1);
+
try {
holder.mCallback.onQueueChanged(parcelableQueue);
} catch (DeadObjectException e) {
diff --git a/services/core/java/com/android/server/notification/CountdownConditionProvider.java b/services/core/java/com/android/server/notification/CountdownConditionProvider.java
index 471c9b9..4b70e2e 100644
--- a/services/core/java/com/android/server/notification/CountdownConditionProvider.java
+++ b/services/core/java/com/android/server/notification/CountdownConditionProvider.java
@@ -94,7 +94,8 @@
@Override
public void onConnected() {
if (DEBUG) Slog.d(TAG, "onConnected");
- mContext.registerReceiver(mReceiver, new IntentFilter(ACTION));
+ mContext.registerReceiver(mReceiver, new IntentFilter(ACTION),
+ Context.RECEIVER_EXPORTED_UNAUDITED);
mConnected = true;
}
diff --git a/services/core/java/com/android/server/notification/EventConditionProvider.java b/services/core/java/com/android/server/notification/EventConditionProvider.java
index 4be4f0a..4fe7a27 100644
--- a/services/core/java/com/android/server/notification/EventConditionProvider.java
+++ b/services/core/java/com/android/server/notification/EventConditionProvider.java
@@ -306,7 +306,8 @@
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(ACTION_EVALUATE);
- registerReceiver(mReceiver, filter);
+ registerReceiver(mReceiver, filter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
} else {
unregisterReceiver(mReceiver);
}
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
index 8a33299..a9b2570 100644
--- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
+++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
@@ -100,7 +100,8 @@
IntentFilter deletionFilter = new IntentFilter(ACTION_HISTORY_DELETION);
deletionFilter.addDataScheme(SCHEME_DELETION);
- mContext.registerReceiver(mFileCleanupReceiver, deletionFilter);
+ mContext.registerReceiver(mFileCleanupReceiver, deletionFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
public void init() {
diff --git a/services/core/java/com/android/server/notification/NotificationManagerInternal.java b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
index 0528b95..5455738 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerInternal.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
@@ -36,4 +36,7 @@
void removeForegroundServiceFlagFromNotification(String pkg, int notificationId, int userId);
void onConversationRemoved(String pkg, int uid, Set<String> shortcuts);
+
+ /** Get the number of notification channels for a given package */
+ int getNumNotificationChannelsForPackage(String pkg, int uid, boolean includeDeleted);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 2068632..a0eeb65 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -133,6 +133,7 @@
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.ActivityManagerInternal.ServiceNotificationPolicy;
+import android.app.ActivityTaskManager;
import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.AppOpsManager;
@@ -296,6 +297,7 @@
import com.android.server.notification.toast.ToastRecord;
import com.android.server.pm.PackageManagerService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
+import com.android.server.policy.PermissionPolicyInternal;
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.utils.quota.MultiRateLimiter;
@@ -480,6 +482,7 @@
private IPackageManager mPackageManager;
private PackageManager mPackageManagerClient;
private PackageManagerInternal mPackageManagerInternal;
+ private PermissionPolicyInternal mPermissionPolicyInternal;
AudioManager mAudioManager;
AudioManagerInternal mAudioManagerInternal;
// Can be null for wear
@@ -595,6 +598,7 @@
private ConditionProviders mConditionProviders;
private NotificationUsageStats mUsageStats;
private boolean mLockScreenAllowSecureNotifications = true;
+ boolean mAllowFgsDismissal = false;
private static final int MY_UID = Process.myUid();
private static final int MY_PID = Process.myPid();
@@ -1137,8 +1141,9 @@
id = r.getSbn().getId();
}
}
+ int mustNotHaveFlags = FLAG_ONGOING_EVENT;
cancelNotification(callingUid, callingPid, pkg, tag, id, 0,
- FLAG_ONGOING_EVENT | FLAG_FOREGROUND_SERVICE,
+ mustNotHaveFlags,
true, userId, REASON_CANCEL, nv.rank, nv.count,null);
nv.recycle();
}
@@ -2104,6 +2109,7 @@
mPackageManager = packageManager;
mPackageManagerClient = packageManagerClient;
mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
+ mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class);
mAppOps = appOps;
mAppOpsService = iAppOps;
try {
@@ -2328,7 +2334,8 @@
IntentFilter timeoutFilter = new IntentFilter(ACTION_NOTIFICATION_TIMEOUT);
timeoutFilter.addDataScheme(SCHEME_TIMEOUT);
- getContext().registerReceiver(mNotificationTimeoutReceiver, timeoutFilter);
+ getContext().registerReceiver(mNotificationTimeoutReceiver, timeoutFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
IntentFilter settingsRestoredFilter = new IntentFilter(Intent.ACTION_SETTING_RESTORED);
getContext().registerReceiver(mRestoreReceiver, settingsRestoredFilter);
@@ -2411,7 +2418,7 @@
publishLocalService(NotificationManagerInternal.class, mInternalService);
}
- private void registerDeviceConfigChange() {
+ void registerDeviceConfigChange() {
mDeviceConfigChangedListener = properties -> {
if (!DeviceConfig.NAMESPACE_SYSTEMUI.equals(properties.getNamespace())) {
return;
@@ -2440,9 +2447,19 @@
} else if ("false".equals(value)) {
mAssistants.disallowAdjustmentType(Adjustment.KEY_NOT_CONVERSATION);
}
+ } else if (SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED.equals(name)) {
+ String value = properties.getString(name, null);
+ if ("true".equals(value)) {
+ mAllowFgsDismissal = true;
+ } else if ("false".equals(value)) {
+ mAllowFgsDismissal = false;
+ }
}
}
};
+ mAllowFgsDismissal = DeviceConfig.getBoolean(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED, false);
DeviceConfig.addOnPropertiesChangedListener(
DeviceConfig.NAMESPACE_SYSTEMUI,
new HandlerExecutor(mHandler),
@@ -2754,7 +2771,7 @@
}
}
- private void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group,
+ void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group,
boolean fromApp, boolean fromListener) {
Objects.requireNonNull(group);
Objects.requireNonNull(pkg);
@@ -3343,8 +3360,7 @@
userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
Binder.getCallingUid(), userId, true, false, "cancelAllNotifications", pkg);
- // Calling from user space, don't allow the canceling of actively
- // running foreground services.
+ // Don't allow the app to cancel active FGS notifications
cancelAllNotificationsInt(Binder.getCallingUid(), Binder.getCallingPid(),
pkg, null, 0, FLAG_FOREGROUND_SERVICE, true, userId,
REASON_APP_CANCEL_ALL, null);
@@ -3663,9 +3679,19 @@
private void createNotificationChannelsImpl(String pkg, int uid,
ParceledListSlice channelsList) {
+ createNotificationChannelsImpl(pkg, uid, channelsList,
+ ActivityTaskManager.INVALID_TASK_ID);
+ }
+
+ private void createNotificationChannelsImpl(String pkg, int uid,
+ ParceledListSlice channelsList, int startingTaskId) {
List<NotificationChannel> channels = channelsList.getList();
final int channelsSize = channels.size();
+ ParceledListSlice<NotificationChannel> oldChannels =
+ mPreferencesHelper.getNotificationChannels(pkg, uid, true);
+ final boolean hadChannel = oldChannels != null && !oldChannels.getList().isEmpty();
boolean needsPolicyFileChange = false;
+ boolean hasRequestedNotificationPermission = false;
for (int i = 0; i < channelsSize; i++) {
final NotificationChannel channel = channels.get(i);
Objects.requireNonNull(channel, "channel in list is null");
@@ -3679,6 +3705,19 @@
mPreferencesHelper.getNotificationChannel(pkg, uid, channel.getId(),
false),
NOTIFICATION_CHANNEL_OR_GROUP_ADDED);
+ boolean hasChannel = hadChannel || hasRequestedNotificationPermission;
+ if (!hasChannel) {
+ ParceledListSlice<NotificationChannel> currChannels =
+ mPreferencesHelper.getNotificationChannels(pkg, uid, true);
+ hasChannel = currChannels != null && !currChannels.getList().isEmpty();
+ }
+ if (!hadChannel && hasChannel && !hasRequestedNotificationPermission
+ && startingTaskId != ActivityTaskManager.INVALID_TASK_ID) {
+ hasRequestedNotificationPermission = true;
+ mHandler.post(new ShowNotificationPermissionPromptRunnable(pkg,
+ UserHandle.getUserId(uid), startingTaskId,
+ mPermissionPolicyInternal));
+ }
}
}
if (needsPolicyFileChange) {
@@ -3687,10 +3726,29 @@
}
@Override
- public void createNotificationChannels(String pkg,
- ParceledListSlice channelsList) {
+ public void createNotificationChannels(String pkg, ParceledListSlice channelsList) {
checkCallerIsSystemOrSameApp(pkg);
- createNotificationChannelsImpl(pkg, Binder.getCallingUid(), channelsList);
+ int taskId = ActivityTaskManager.INVALID_TASK_ID;
+ try {
+ int uid = mPackageManager.getPackageUid(pkg, 0,
+ UserHandle.getUserId(Binder.getCallingUid()));
+ List<ActivityManager.AppTask> tasks = mAtm.getAppTasks(pkg, uid);
+ for (int i = 0; i < tasks.size(); i++) {
+ ActivityManager.RecentTaskInfo task = tasks.get(i).getTaskInfo();
+ if (mPermissionPolicyInternal == null) {
+ mPermissionPolicyInternal =
+ LocalServices.getService(PermissionPolicyInternal.class);
+ }
+ if (mPermissionPolicyInternal != null
+ && mPermissionPolicyInternal.canShowPermissionPromptForTask(task)) {
+ taskId = task.taskId;
+ break;
+ }
+ }
+ } catch (RemoteException e) {
+ // Do nothing
+ }
+ createNotificationChannelsImpl(pkg, Binder.getCallingUid(), channelsList, taskId);
}
@Override
@@ -3811,7 +3869,8 @@
final int callingUid = Binder.getCallingUid();
NotificationChannelGroup groupToDelete =
- mPreferencesHelper.getNotificationChannelGroup(groupId, pkg, callingUid);
+ mPreferencesHelper.getNotificationChannelGroupWithChannels(
+ pkg, callingUid, groupId, false);
if (groupToDelete != null) {
// Preflight for allowability
final int userId = UserHandle.getUserId(callingUid);
@@ -3873,8 +3932,8 @@
public int getNumNotificationChannelsForPackage(String pkg, int uid,
boolean includeDeleted) {
enforceSystemOrSystemUI("getNumNotificationChannelsForPackage");
- return mPreferencesHelper.getNotificationChannels(pkg, uid, includeDeleted)
- .getList().size();
+ return NotificationManagerService.this
+ .getNumNotificationChannelsForPackage(pkg, uid, includeDeleted);
}
@Override
@@ -4414,8 +4473,9 @@
@GuardedBy("mNotificationLock")
private void cancelNotificationFromListenerLocked(ManagedServiceInfo info,
int callingUid, int callingPid, String pkg, String tag, int id, int userId) {
- cancelNotification(callingUid, callingPid, pkg, tag, id, 0,
- FLAG_ONGOING_EVENT | FLAG_FOREGROUND_SERVICE,
+ int mustNotHaveFlags = FLAG_ONGOING_EVENT;
+ cancelNotification(callingUid, callingPid, pkg, tag, id, 0 /* mustHaveFlags */,
+ mustNotHaveFlags,
true,
userId, REASON_LISTENER_CANCEL, info);
}
@@ -6132,15 +6192,26 @@
return;
}
StatusBarNotification sbn = r.getSbn();
- // NoMan adds flags FLAG_NO_CLEAR and FLAG_ONGOING_EVENT when it sees
+ // NoMan adds flags FLAG_ONGOING_EVENT when it sees
// FLAG_FOREGROUND_SERVICE. Hence it's not enough to remove
// FLAG_FOREGROUND_SERVICE, we have to revert to the flags we received
// initially *and* force remove FLAG_FOREGROUND_SERVICE.
- sbn.getNotification().flags =
- (r.mOriginalFlags & ~FLAG_FOREGROUND_SERVICE);
+ sbn.getNotification().flags = (r.mOriginalFlags & ~FLAG_FOREGROUND_SERVICE);
+ }
+
+ @Override
+ public int getNumNotificationChannelsForPackage(String pkg, int uid,
+ boolean includeDeleted) {
+ return NotificationManagerService.this
+ .getNumNotificationChannelsForPackage(pkg, uid, includeDeleted);
}
};
+ int getNumNotificationChannelsForPackage(String pkg, int uid, boolean includeDeleted) {
+ return mPreferencesHelper.getNotificationChannels(pkg, uid, includeDeleted).getList()
+ .size();
+ }
+
void cancelNotificationInternal(String pkg, String opPkg, int callingUid, int callingPid,
String tag, int id, int userId) {
userId = ActivityManager.handleIncomingUser(callingPid,
@@ -6910,7 +6981,6 @@
r.getKey(), true /* notifSuppressed */, isBubbleSuppressed);
return;
}
-
if ((r.getNotification().flags & mMustHaveFlags) != mMustHaveFlags) {
return;
}
@@ -6918,19 +6988,25 @@
return;
}
- // Bubbled children get to stick around if the summary was manually cancelled
- // (user removed) from systemui.
- FlagChecker childrenFlagChecker = null;
- if (mReason == REASON_CANCEL
- || mReason == REASON_CLICK
- || mReason == REASON_CANCEL_ALL) {
- childrenFlagChecker = (flags) -> {
- if ((flags & FLAG_BUBBLE) != 0) {
+ FlagChecker childrenFlagChecker = (flags) -> {
+ if (mReason == REASON_CANCEL
+ || mReason == REASON_CLICK
+ || mReason == REASON_CANCEL_ALL) {
+ // Bubbled children get to stick around if the summary was manually
+ // cancelled (user removed) from systemui.
+ if ((flags & FLAG_BUBBLE) != 0) {
+ return false;
+ }
+ } else if (mReason == REASON_APP_CANCEL) {
+ if ((flags & FLAG_FOREGROUND_SERVICE) != 0) {
+ return false;
+ }
+ }
+ if ((flags & mMustNotHaveFlags) != 0) {
return false;
}
return true;
};
- }
// Cancel the notification.
boolean wasPosted = removeFromNotificationListsLocked(r);
@@ -6957,6 +7033,44 @@
}
}
+ protected static class ShowNotificationPermissionPromptRunnable implements Runnable {
+ private final String mPkgName;
+ private final int mUserId;
+ private final int mTaskId;
+ private final PermissionPolicyInternal mPpi;
+
+ ShowNotificationPermissionPromptRunnable(String pkg, int user, int task,
+ PermissionPolicyInternal pPi) {
+ mPkgName = pkg;
+ mUserId = user;
+ mTaskId = task;
+ mPpi = pPi;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof ShowNotificationPermissionPromptRunnable)) {
+ return false;
+ }
+
+ ShowNotificationPermissionPromptRunnable other =
+ (ShowNotificationPermissionPromptRunnable) o;
+
+ return Objects.equals(mPkgName, other.mPkgName) && mUserId == other.mUserId
+ && mTaskId == other.mTaskId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mPkgName, mUserId, mTaskId);
+ }
+
+ @Override
+ public void run() {
+ mPpi.showNotificationPromptIfNeeded(mPkgName, mUserId, mTaskId);
+ }
+ }
+
protected class EnqueueNotificationRunnable implements Runnable {
private final NotificationRecord r;
private final int userId;
@@ -7141,8 +7255,10 @@
// Ensure if this is a foreground service that the proper additional
// flags are set.
if ((notification.flags & FLAG_FOREGROUND_SERVICE) != 0) {
- notification.flags |= FLAG_ONGOING_EVENT
- | FLAG_NO_CLEAR;
+ notification.flags |= FLAG_NO_CLEAR;
+ if (!mAllowFgsDismissal) {
+ notification.flags |= FLAG_ONGOING_EVENT;
+ }
}
mRankingHelper.extractSignals(r);
@@ -7417,13 +7533,20 @@
mSummaryByGroupKey.put(group, r);
}
+ FlagChecker childrenFlagChecker = (flags) -> {
+ if ((flags & FLAG_FOREGROUND_SERVICE) != 0) {
+ return false;
+ }
+ return true;
+ };
+
// Clear out group children of the old notification if the update
// causes the group summary to go away. This happens when the old
// notification was a summary and the new one isn't, or when the old
// notification was a summary and its group key changed.
if (oldIsSummary && (!isSummary || !oldGroup.equals(group))) {
cancelGroupChildrenLocked(old, callingUid, callingPid, null, false /* sendDelete */,
- null, REASON_APP_CANCEL);
+ childrenFlagChecker, REASON_APP_CANCEL);
}
}
@@ -9042,7 +9165,6 @@
final StatusBarNotification childSbn = childR.getSbn();
if ((childSbn.isGroup() && !childSbn.getNotification().isGroupSummary()) &&
childR.getGroupKey().equals(parentNotification.getGroupKey())
- && (childR.getFlags() & FLAG_FOREGROUND_SERVICE) == 0
&& (flagChecker == null || flagChecker.apply(childR.getFlags()))
&& (!childR.getChannel().isImportantConversation()
|| reason != REASON_CANCEL)) {
diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java
index 24008d0..0cbdbc1 100644
--- a/services/core/java/com/android/server/notification/PermissionHelper.java
+++ b/services/core/java/com/android/server/notification/PermissionHelper.java
@@ -16,6 +16,7 @@
package com.android.server.notification;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
import static android.permission.PermissionManager.PERMISSION_GRANTED;
@@ -159,13 +160,21 @@
}
/**
+ * @see setNotificationPermission(String, int, boolean, boolean, boolean)
+ */
+ public void setNotificationPermission(String packageName, @UserIdInt int userId, boolean grant,
+ boolean userSet) {
+ setNotificationPermission(packageName, userId, grant, userSet, false);
+ }
+
+ /**
* Grants or revokes the notification permission for a given package/user. UserSet should
* only be true if this method is being called to migrate existing user choice, because it
* can prevent the user from seeing the in app permission dialog. Must not be called
* with a lock held.
*/
public void setNotificationPermission(String packageName, @UserIdInt int userId, boolean grant,
- boolean userSet) {
+ boolean userSet, boolean reviewRequired) {
assertFlag();
final long callingId = Binder.clearCallingIdentity();
try {
@@ -177,7 +186,12 @@
}
if (userSet) {
mPermManager.updatePermissionFlags(packageName, NOTIFICATION_PERMISSION,
- FLAG_PERMISSION_USER_SET, FLAG_PERMISSION_USER_SET, true, userId);
+ FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_REVIEW_REQUIRED,
+ FLAG_PERMISSION_USER_SET, true, userId);
+ } else if (reviewRequired) {
+ mPermManager.updatePermissionFlags(packageName, NOTIFICATION_PERMISSION,
+ FLAG_PERMISSION_REVIEW_REQUIRED, FLAG_PERMISSION_REVIEW_REQUIRED, true,
+ userId);
}
} catch (RemoteException e) {
Slog.e(TAG, "Could not reach system server", e);
@@ -186,15 +200,17 @@
}
}
+ /**
+ * Set the notification permission state upon phone version upgrade from S- to T+, or upon
+ * restoring a pre-T backup on a T+ device
+ */
public void setNotificationPermission(PackagePermission pkgPerm) {
assertFlag();
- final long callingId = Binder.clearCallingIdentity();
- try {
- setNotificationPermission(
- pkgPerm.packageName, pkgPerm.userId, pkgPerm.granted, pkgPerm.userSet);
- } finally {
- Binder.restoreCallingIdentity(callingId);
+ if (pkgPerm == null || pkgPerm.packageName == null) {
+ return;
}
+ setNotificationPermission(pkgPerm.packageName, pkgPerm.userId, pkgPerm.granted,
+ pkgPerm.userSet, !pkgPerm.userSet);
}
public boolean isPermissionFixed(String packageName, @UserIdInt int userId) {
diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
index 92cdce7..737353d 100644
--- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
+++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
@@ -261,7 +261,8 @@
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(ACTION_EVALUATE);
filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
- registerReceiver(mReceiver, filter);
+ registerReceiver(mReceiver, filter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
} else {
unregisterReceiver(mReceiver);
}
diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java
index 4500bbc..7f265df 100644
--- a/services/core/java/com/android/server/notification/SnoozeHelper.java
+++ b/services/core/java/com/android/server/notification/SnoozeHelper.java
@@ -116,7 +116,8 @@
mContext = context;
IntentFilter filter = new IntentFilter(REPOST_ACTION);
filter.addDataScheme(REPOST_SCHEME);
- mContext.registerReceiver(mBroadcastReceiver, filter);
+ mContext.registerReceiver(mBroadcastReceiver, filter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
mAm = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
mCallback = callback;
mUserProfiles = userProfiles;
diff --git a/services/core/java/com/android/server/notification/VibratorHelper.java b/services/core/java/com/android/server/notification/VibratorHelper.java
index be5f219..8acc857 100644
--- a/services/core/java/com/android/server/notification/VibratorHelper.java
+++ b/services/core/java/com/android/server/notification/VibratorHelper.java
@@ -125,10 +125,10 @@
private static VibrationEffect createChirpVibration(int rampDuration, boolean insistent) {
VibrationEffect.WaveformBuilder waveformBuilder = VibrationEffect.startWaveform()
- .addStep(/* amplitude= */ 0, /* frequency= */ -0.85f, /* duration= */ 0)
- .addRamp(/* amplitude= */ 1, /* frequency= */ -0.25f, rampDuration)
- .addStep(/* amplitude= */ 1, /* frequency= */ -0.25f, CHIRP_LEVEL_DURATION_MILLIS)
- .addRamp(/* amplitude= */ 0, /* frequency= */ -0.85f, rampDuration);
+ .addStep(/* amplitude= */ 0, /* frequencyHz= */ 60f, /* duration= */ 0)
+ .addRamp(/* amplitude= */ 1, /* frequencyHz= */ 120f, rampDuration)
+ .addStep(/* amplitude= */ 1, /* frequencyHz= */ 120f, CHIRP_LEVEL_DURATION_MILLIS)
+ .addRamp(/* amplitude= */ 0, /* frequencyHz= */ 60f, rampDuration);
if (insistent) {
return waveformBuilder
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 27db2f9..05a51cc 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -37,6 +37,7 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
@@ -146,6 +147,11 @@
@GuardedBy("mLock")
@Status private int mLastExecutionStatus = STATUS_OK;
+ @GuardedBy("mLock")
+ private long mLastExecutionStartTimeMs;
+ @GuardedBy("mLock")
+ private long mLastExecutionDurationMs;
+
// Keeps packages cancelled from PDO for last session. This is for debugging.
@GuardedBy("mLock")
private final ArraySet<String> mLastCancelledPackages = new ArraySet<String>();
@@ -218,9 +224,15 @@
writer.print("mDexOptCancellingThread:");
writer.println(mDexOptCancellingThread);
writer.print("mFinishedPostBootUpdate:");
- writer.print(mFinishedPostBootUpdate);
- writer.print(",mLastExecutionStatus:");
+ writer.println(mFinishedPostBootUpdate);
+ writer.print("mLastExecutionStatus:");
writer.println(mLastExecutionStatus);
+ writer.print("mLastExecutionStartTimeMs:");
+ writer.println(mLastExecutionStartTimeMs);
+ writer.print("mLastExecutionDurationMs:");
+ writer.println(mLastExecutionDurationMs);
+ writer.print("now:");
+ writer.println(SystemClock.elapsedRealtime());
writer.print("mLastCancelledPackages:");
writer.println(String.join(",", mLastCancelledPackages));
writer.print("mFailedPackageNamesPrimary:");
@@ -514,12 +526,17 @@
/** Returns true if completed */
private boolean runIdleOptimization(PackageManagerService pm, ArraySet<String> pkgs,
boolean isPostBootUpdate) {
+ synchronized (mLock) {
+ mLastExecutionStartTimeMs = SystemClock.elapsedRealtime();
+ mLastExecutionDurationMs = -1;
+ }
long lowStorageThreshold = getLowStorageThreshold();
int status = idleOptimizePackages(pm, pkgs, lowStorageThreshold,
isPostBootUpdate);
logStatus(status);
synchronized (mLock) {
mLastExecutionStatus = status;
+ mLastExecutionDurationMs = SystemClock.elapsedRealtime() - mLastExecutionStartTimeMs;
}
return status == STATUS_OK;
diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java
index dd66130..fcf4a02 100644
--- a/services/core/java/com/android/server/pm/Computer.java
+++ b/services/core/java/com/android/server/pm/Computer.java
@@ -49,8 +49,6 @@
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.utils.WatchedArrayMap;
-import com.android.server.utils.WatchedLongSparseArray;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -309,10 +307,6 @@
@Nullable
String getRenamedPackage(@NonNull String packageName);
- @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
- @NonNull
- WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries();
-
/**
* @return set of packages to notify
*/
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 2f4f271..e37aaa5 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -3490,9 +3490,8 @@
return mSettings.getRenamedPackageLPr(packageName);
}
- @NonNull
- @Override
- public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
+ private WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>>
+ getSharedLibraries() {
return mSharedLibraries.getAll();
}
@@ -4788,7 +4787,7 @@
@Override
public List<PackageStateInternal> findSharedNonSystemLibraries(
@NonNull PackageStateInternal pkgSetting) {
- List<SharedLibraryInfo> deps = SharedLibraryHelper.findSharedLibraries(pkgSetting);
+ List<SharedLibraryInfo> deps = SharedLibraryUtils.findSharedLibraries(pkgSetting);
if (!deps.isEmpty()) {
List<PackageStateInternal> retValue = new ArrayList<>();
for (SharedLibraryInfo info : deps) {
diff --git a/services/core/java/com/android/server/pm/ComputerLocked.java b/services/core/java/com/android/server/pm/ComputerLocked.java
index bd730e9..529aca3 100644
--- a/services/core/java/com/android/server/pm/ComputerLocked.java
+++ b/services/core/java/com/android/server/pm/ComputerLocked.java
@@ -46,8 +46,6 @@
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.utils.WatchedArrayMap;
-import com.android.server.utils.WatchedLongSparseArray;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -269,14 +267,6 @@
@NonNull
@Override
- public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
- synchronized (mLock) {
- return super.getSharedLibraries();
- }
- }
-
- @NonNull
- @Override
public ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages) {
synchronized (mLock) {
return super.getNotifyPackagesForReplacedReceived(packages);
diff --git a/services/core/java/com/android/server/pm/ComputerTracker.java b/services/core/java/com/android/server/pm/ComputerTracker.java
index e6ff836..52309ce 100644
--- a/services/core/java/com/android/server/pm/ComputerTracker.java
+++ b/services/core/java/com/android/server/pm/ComputerTracker.java
@@ -47,8 +47,6 @@
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.utils.WatchedArrayMap;
-import com.android.server.utils.WatchedLongSparseArray;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -703,14 +701,6 @@
@NonNull
@Override
- public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
- try (ThreadComputer current = snapshot()) {
- return current.mComputer.getSharedLibraries();
- }
- }
-
- @NonNull
- @Override
public ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages) {
try (ThreadComputer current = snapshot()) {
return current.mComputer.getNotifyPackagesForReplacedReceived(packages);
diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java
index eac38af..dcad3ec 100644
--- a/services/core/java/com/android/server/pm/DexOptHelper.java
+++ b/services/core/java/com/android/server/pm/DexOptHelper.java
@@ -379,7 +379,7 @@
// at boot, or background job), the passed 'targetCompilerFilter' stays the same,
// and the first package that uses the library will dexopt it. The
// others will see that the compiled code for the library is up to date.
- Collection<SharedLibraryInfo> deps = SharedLibraryHelper.findSharedLibraries(pkgSetting);
+ Collection<SharedLibraryInfo> deps = SharedLibraryUtils.findSharedLibraries(pkgSetting);
final String[] instructionSets = getAppDexInstructionSets(
AndroidPackageUtils.getPrimaryCpuAbi(p, pkgSetting),
AndroidPackageUtils.getSecondaryCpuAbi(p, pkgSetting));
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 27b6282..9302aad 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -894,8 +894,6 @@
final Map<String, PackageInstalledInfo> installResults = new ArrayMap<>(requests.size());
final Map<String, PrepareResult> prepareResults = new ArrayMap<>(requests.size());
final Map<String, Settings.VersionInfo> versionInfos = new ArrayMap<>(requests.size());
- final Map<String, PackageSetting> lastStaticSharedLibSettings =
- new ArrayMap<>(requests.size());
final Map<String, Boolean> createdAppId = new ArrayMap<>(requests.size());
boolean success = false;
try {
@@ -955,35 +953,22 @@
createdAppId.put(packageName, optimisticallyRegisterAppId(result));
versionInfos.put(result.mPkgSetting.getPkg().getPackageName(),
mPm.getSettingsVersionForPackage(result.mPkgSetting.getPkg()));
- if (result.mStaticSharedLibraryInfo != null) {
- final PackageSetting staticSharedLibLatestVersionSetting =
- mSharedLibraries.getStaticSharedLibLatestVersionSetting(result);
- if (staticSharedLibLatestVersionSetting != null) {
- lastStaticSharedLibSettings.put(
- result.mPkgSetting.getPkg().getPackageName(),
- staticSharedLibLatestVersionSetting);
- }
- }
} catch (PackageManagerException e) {
request.mInstallResult.setError("Scanning Failed.", e);
return;
}
}
- ReconcileRequest
- reconcileRequest = new ReconcileRequest(preparedScans, installArgs,
- installResults,
- prepareResults,
- mSharedLibraries.getAll(),
- Collections.unmodifiableMap(mPm.mPackages), versionInfos,
- lastStaticSharedLibSettings);
+ ReconcileRequest reconcileRequest = new ReconcileRequest(preparedScans, installArgs,
+ installResults, prepareResults,
+ Collections.unmodifiableMap(mPm.mPackages), versionInfos);
CommitRequest commitRequest = null;
synchronized (mPm.mLock) {
Map<String, ReconciledPackage> reconciledPackages;
try {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "reconcilePackages");
reconciledPackages = ReconcilePackageUtils.reconcilePackages(
- reconcileRequest, mPm.mSettings.getKeySetManagerService(),
- mPm.mInjector);
+ reconcileRequest, mSharedLibraries,
+ mPm.mSettings.getKeySetManagerService());
} catch (ReconcileFailure e) {
for (InstallRequest request : requests) {
request.mInstallResult.setError("Reconciliation failed...", e);
@@ -3586,15 +3571,12 @@
final String pkgName = scanResult.mPkgSetting.getPackageName();
final ReconcileRequest reconcileRequest = new ReconcileRequest(
Collections.singletonMap(pkgName, scanResult),
- mSharedLibraries.getAll(), mPm.mPackages,
+ mPm.mPackages,
Collections.singletonMap(pkgName,
- mPm.getSettingsVersionForPackage(parsedPackage)),
- Collections.singletonMap(pkgName,
- mSharedLibraries.getStaticSharedLibLatestVersionSetting(
- scanResult)));
+ mPm.getSettingsVersionForPackage(parsedPackage)));
final Map<String, ReconciledPackage> reconcileResult =
ReconcilePackageUtils.reconcilePackages(reconcileRequest,
- mPm.mSettings.getKeySetManagerService(), mPm.mInjector);
+ mSharedLibraries, mPm.mSettings.getKeySetManagerService());
appIdCreated = optimisticallyRegisterAppId(scanResult);
commitReconciledScanResultLocked(reconcileResult.get(pkgName),
mPm.mUserManager.getUserIds());
diff --git a/services/core/java/com/android/server/pm/OWNERS b/services/core/java/com/android/server/pm/OWNERS
index 1bdc9f3..c219f80 100644
--- a/services/core/java/com/android/server/pm/OWNERS
+++ b/services/core/java/com/android/server/pm/OWNERS
@@ -40,7 +40,7 @@
per-file KeySetManagerService.java = cbrubaker@google.com, nnk@google.com
per-file PackageKeySetData.java = cbrubaker@google.com, nnk@google.com
per-file PackageSignatures.java = cbrubaker@google.com, nnk@google.com
-per-file SELinuxMMAC* = alanstokes@google.com, cbrubaker@google.com, jeffv@google.com, jgalenson@google.com
+per-file SELinuxMMAC* = alanstokes@google.com, cbrubaker@google.com, jeffv@google.com
# shortcuts
per-file LauncherAppsService.java = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index cfcf199..416b3a4 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -70,6 +70,7 @@
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.ExceptionUtils;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -121,7 +122,7 @@
public class PackageInstallerService extends IPackageInstaller.Stub implements
PackageSessionProvider {
private static final String TAG = "PackageInstaller";
- private static final boolean LOGD = false;
+ private static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
private static final boolean DEBUG = Build.IS_DEBUGGABLE;
@@ -135,7 +136,7 @@
/** Automatically destroy sessions older than this */
private static final long MAX_AGE_MILLIS = 3 * DateUtils.DAY_IN_MILLIS;
/** Automatically destroy staged sessions that have not changed state in this time */
- private static final long MAX_TIME_SINCE_UPDATE_MILLIS = 7 * DateUtils.DAY_IN_MILLIS;
+ private static final long MAX_TIME_SINCE_UPDATE_MILLIS = 21 * DateUtils.DAY_IN_MILLIS;
/** Upper bound on number of active sessions for a UID that has INSTALL_PACKAGES */
private static final long MAX_ACTIVE_SESSIONS_WITH_PERMISSION = 1024;
/** Upper bound on number of active sessions for a UID without INSTALL_PACKAGES */
@@ -510,6 +511,7 @@
valid = true;
}
if (!valid) {
+ Slog.w(TAG, "Remove old session: " + session.sessionId);
// Remove expired sessions as well as child sessions if any
mSessions.remove(session.sessionId);
// Since this is early during boot we don't send
@@ -850,6 +852,9 @@
mCallbacks.notifySessionCreated(session.sessionId, session.userId);
mSettingsWriteRequest.schedule();
+ if (LOGD) {
+ Slog.d(TAG, "Created session id=" + sessionId + " staged=" + params.isStaged);
+ }
return sessionId;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 0564e85..be2bdaa 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -2816,7 +2816,7 @@
case UserManager.REMOVE_RESULT_REMOVED:
getOutPrintWriter().printf("Success: user %d removed\n", userId);
return 0;
- case UserManager.REMOVE_RESULT_SET_EPHEMERAL:
+ case UserManager.REMOVE_RESULT_DEFERRED:
getOutPrintWriter().printf("Success: user %d set as ephemeral\n", userId);
return 0;
case UserManager.REMOVE_RESULT_ALREADY_BEING_REMOVED:
diff --git a/services/core/java/com/android/server/pm/ReconcilePackageUtils.java b/services/core/java/com/android/server/pm/ReconcilePackageUtils.java
index 5a25004..67f6b12 100644
--- a/services/core/java/com/android/server/pm/ReconcilePackageUtils.java
+++ b/services/core/java/com/android/server/pm/ReconcilePackageUtils.java
@@ -42,8 +42,8 @@
final class ReconcilePackageUtils {
public static Map<String, ReconciledPackage> reconcilePackages(
- final ReconcileRequest request, KeySetManagerService ksms,
- PackageManagerServiceInjector injector)
+ final ReconcileRequest request, SharedLibrariesImpl sharedLibraries,
+ KeySetManagerService ksms)
throws ReconcileFailure {
final Map<String, ScanResult> scannedPackages = request.mScannedPackages;
@@ -67,11 +67,10 @@
// in the first pass, we'll build up the set of incoming shared libraries
final List<SharedLibraryInfo> allowedSharedLibInfos =
- SharedLibraryHelper.getAllowedSharedLibInfos(scanResult,
- request.mSharedLibrarySource);
+ sharedLibraries.getAllowedSharedLibInfos(scanResult);
if (allowedSharedLibInfos != null) {
for (SharedLibraryInfo info : allowedSharedLibInfos) {
- if (!SharedLibraryHelper.addSharedLibraryToPackageVersionMap(
+ if (!SharedLibraryUtils.addSharedLibraryToPackageVersionMap(
incomingSharedLibraries, info)) {
throw new ReconcileFailure("Shared Library " + info.getName()
+ " is being installed twice in this set!");
@@ -113,7 +112,8 @@
final PackageSetting disabledPkgSetting = scanResult.mRequest.mDisabledPkgSetting;
final PackageSetting lastStaticSharedLibSetting =
- request.mLastStaticSharedLibSettings.get(installPackageName);
+ scanResult.mStaticSharedLibraryInfo == null ? null
+ : sharedLibraries.getStaticSharedLibLatestVersionSetting(scanResult);
final PackageSetting signatureCheckPs =
(prepareResult != null && lastStaticSharedLibSetting != null)
? lastStaticSharedLibSetting
@@ -264,11 +264,9 @@
}
try {
result.get(installPackageName).mCollectedSharedLibraryInfos =
- SharedLibraryHelper.collectSharedLibraryInfos(
- scanResult.mRequest.mParsedPackage,
- combinedPackages, request.mSharedLibrarySource,
- incomingSharedLibraries, injector.getCompatibility());
-
+ sharedLibraries.collectSharedLibraryInfos(
+ scanResult.mRequest.mParsedPackage, combinedPackages,
+ incomingSharedLibraries);
} catch (PackageManagerException e) {
throw new ReconcileFailure(e.error, e.getMessage());
}
diff --git a/services/core/java/com/android/server/pm/ReconcileRequest.java b/services/core/java/com/android/server/pm/ReconcileRequest.java
index 3188138..9e4e986 100644
--- a/services/core/java/com/android/server/pm/ReconcileRequest.java
+++ b/services/core/java/com/android/server/pm/ReconcileRequest.java
@@ -16,10 +16,7 @@
package com.android.server.pm;
-import android.content.pm.SharedLibraryInfo;
-
import com.android.server.pm.parsing.pkg.AndroidPackage;
-import com.android.server.utils.WatchedLongSparseArray;
import java.util.Collections;
import java.util.Map;
@@ -37,38 +34,29 @@
public final Map<String, ScanResult> mScannedPackages;
public final Map<String, AndroidPackage> mAllPackages;
- public final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> mSharedLibrarySource;
public final Map<String, InstallArgs> mInstallArgs;
public final Map<String, PackageInstalledInfo> mInstallResults;
public final Map<String, PrepareResult> mPreparedPackages;
public final Map<String, Settings.VersionInfo> mVersionInfos;
- public final Map<String, PackageSetting> mLastStaticSharedLibSettings;
ReconcileRequest(Map<String, ScanResult> scannedPackages,
Map<String, InstallArgs> installArgs,
Map<String, PackageInstalledInfo> installResults,
Map<String, PrepareResult> preparedPackages,
- Map<String, WatchedLongSparseArray<SharedLibraryInfo>> sharedLibrarySource,
Map<String, AndroidPackage> allPackages,
- Map<String, Settings.VersionInfo> versionInfos,
- Map<String, PackageSetting> lastStaticSharedLibSettings) {
+ Map<String, Settings.VersionInfo> versionInfos) {
mScannedPackages = scannedPackages;
mInstallArgs = installArgs;
mInstallResults = installResults;
mPreparedPackages = preparedPackages;
- mSharedLibrarySource = sharedLibrarySource;
mAllPackages = allPackages;
mVersionInfos = versionInfos;
- mLastStaticSharedLibSettings = lastStaticSharedLibSettings;
}
ReconcileRequest(Map<String, ScanResult> scannedPackages,
- Map<String, WatchedLongSparseArray<SharedLibraryInfo>> sharedLibrarySource,
Map<String, AndroidPackage> allPackages,
- Map<String, Settings.VersionInfo> versionInfos,
- Map<String, PackageSetting> lastStaticSharedLibSettings) {
+ Map<String, Settings.VersionInfo> versionInfos) {
this(scannedPackages, Collections.emptyMap(), Collections.emptyMap(),
- Collections.emptyMap(), sharedLibrarySource, allPackages, versionInfos,
- lastStaticSharedLibSettings);
+ Collections.emptyMap(), allPackages, versionInfos);
}
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 21df5a9..7085682 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -4863,11 +4863,11 @@
pw.print(userState.isInstantApp());
pw.print(" virtual=");
pw.println(userState.isVirtualPreload());
- pw.print(" installReason=");
+ pw.print(" installReason=");
pw.println(userState.getInstallReason());
final PackageUserStateInternal pus = ps.readUserState(user.id);
- pw.print(" firstInstallTime=");
+ pw.print(" firstInstallTime=");
date.setTime(pus.getFirstInstallTime());
pw.println(sdf.format(date));
diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
index 0055f4e..aa23050 100644
--- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
+++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
@@ -16,19 +16,27 @@
package com.android.server.pm;
+import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY;
+
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import static com.android.server.pm.PackageManagerService.TAG;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
+import android.content.pm.Signature;
+import android.content.pm.SigningDetails;
import android.content.pm.VersionedPackage;
+import android.os.Build;
import android.os.Process;
import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.service.pm.PackageServiceDumpProto;
import android.util.ArraySet;
+import android.util.PackageUtils;
import android.util.Pair;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
@@ -36,8 +44,10 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.server.SystemConfig;
+import com.android.server.compat.PlatformCompat;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
+import com.android.server.pm.parsing.pkg.ParsedPackage;
import com.android.server.utils.Snappable;
import com.android.server.utils.SnapshotCache;
import com.android.server.utils.Watchable;
@@ -47,10 +57,13 @@
import com.android.server.utils.WatchedLongSparseArray;
import com.android.server.utils.Watcher;
+import libcore.util.HexEncoding;
+
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
@@ -62,6 +75,24 @@
* Current known shared libraries on the device.
*/
public final class SharedLibrariesImpl implements SharedLibrariesRead, Watchable, Snappable {
+ private static final boolean DEBUG_SHARED_LIBRARIES = false;
+
+ /**
+ * Apps targeting Android S and above need to declare dependencies to the public native
+ * shared libraries that are defined by the device maker using {@code uses-native-library} tag
+ * in its {@code AndroidManifest.xml}.
+ *
+ * If any of the dependencies cannot be satisfied, i.e. one of the dependency doesn't exist,
+ * the package manager rejects to install the app. The dependency can be specified as optional
+ * using {@code android:required} attribute in the tag, in which case failing to satisfy the
+ * dependency doesn't stop the installation.
+ * <p>Once installed, an app is provided with only the native shared libraries that are
+ * specified in the app manifest. {@code dlopen}ing a native shared library that doesn't appear
+ * in the app manifest will fail even if it actually exists on the device.
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.R)
+ private static final long ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES = 142191088;
// TODO(b/200588896): remove PMS dependency
private final PackageManagerService mPm;
@@ -493,10 +524,8 @@
@Nullable AndroidPackage changingLib, @Nullable PackageSetting changingLibSetting,
@NonNull Map<String, AndroidPackage> availablePackages)
throws PackageManagerException {
- final ArrayList<SharedLibraryInfo> sharedLibraryInfos =
- SharedLibraryHelper.collectSharedLibraryInfos(
- pkgSetting.getPkg(), availablePackages, mSharedLibraries,
- null /* newLibraries */, mInjector.getCompatibility());
+ final ArrayList<SharedLibraryInfo> sharedLibraryInfos = collectSharedLibraryInfos(
+ pkgSetting.getPkg(), availablePackages, null /* newLibraries */);
executeSharedLibrariesUpdateLPw(pkg, pkgSetting, changingLib, changingLibSetting,
sharedLibraryInfos, mPm.mUserManager.getUserIds());
}
@@ -735,6 +764,234 @@
}
/**
+ * Compare the newly scanned package with current system state to see which of its declared
+ * shared libraries should be allowed to be added to the system.
+ */
+ List<SharedLibraryInfo> getAllowedSharedLibInfos(ScanResult scanResult) {
+ // Let's used the parsed package as scanResult.pkgSetting may be null
+ final ParsedPackage parsedPackage = scanResult.mRequest.mParsedPackage;
+ if (scanResult.mSdkSharedLibraryInfo == null && scanResult.mStaticSharedLibraryInfo == null
+ && scanResult.mDynamicSharedLibraryInfos == null) {
+ return null;
+ }
+
+ // Any app can add new SDKs and static shared libraries.
+ if (scanResult.mSdkSharedLibraryInfo != null) {
+ return Collections.singletonList(scanResult.mSdkSharedLibraryInfo);
+ }
+ if (scanResult.mStaticSharedLibraryInfo != null) {
+ return Collections.singletonList(scanResult.mStaticSharedLibraryInfo);
+ }
+ final boolean hasDynamicLibraries = parsedPackage.isSystem()
+ && scanResult.mDynamicSharedLibraryInfos != null;
+ if (!hasDynamicLibraries) {
+ return null;
+ }
+ final boolean isUpdatedSystemApp = scanResult.mPkgSetting.getPkgState()
+ .isUpdatedSystemApp();
+ // We may not yet have disabled the updated package yet, so be sure to grab the
+ // current setting if that's the case.
+ final PackageSetting updatedSystemPs = isUpdatedSystemApp
+ ? scanResult.mRequest.mDisabledPkgSetting == null
+ ? scanResult.mRequest.mOldPkgSetting
+ : scanResult.mRequest.mDisabledPkgSetting
+ : null;
+ if (isUpdatedSystemApp && (updatedSystemPs.getPkg() == null
+ || updatedSystemPs.getPkg().getLibraryNames() == null)) {
+ Slog.w(TAG, "Package " + parsedPackage.getPackageName()
+ + " declares libraries that are not declared on the system image; skipping");
+ return null;
+ }
+ final ArrayList<SharedLibraryInfo> infos =
+ new ArrayList<>(scanResult.mDynamicSharedLibraryInfos.size());
+ for (SharedLibraryInfo info : scanResult.mDynamicSharedLibraryInfos) {
+ final String name = info.getName();
+ if (isUpdatedSystemApp) {
+ // New library entries can only be added through the
+ // system image. This is important to get rid of a lot
+ // of nasty edge cases: for example if we allowed a non-
+ // system update of the app to add a library, then uninstalling
+ // the update would make the library go away, and assumptions
+ // we made such as through app install filtering would now
+ // have allowed apps on the device which aren't compatible
+ // with it. Better to just have the restriction here, be
+ // conservative, and create many fewer cases that can negatively
+ // impact the user experience.
+ if (!updatedSystemPs.getPkg().getLibraryNames().contains(name)) {
+ Slog.w(TAG, "Package " + parsedPackage.getPackageName()
+ + " declares library " + name
+ + " that is not declared on system image; skipping");
+ continue;
+ }
+ }
+ synchronized (mPm.mLock) {
+ if (getSharedLibraryInfo(name, SharedLibraryInfo.VERSION_UNDEFINED) != null) {
+ Slog.w(TAG, "Package " + parsedPackage.getPackageName() + " declares library "
+ + name + " that already exists; skipping");
+ continue;
+ }
+ }
+ infos.add(info);
+ }
+ return infos;
+ }
+
+ /**
+ * Collects shared library infos that are being used by the given package.
+ *
+ * @param pkg The package using shared libraries.
+ * @param availablePackages The available packages which are installed and being installed,
+ * @param newLibraries Shared libraries defined by packages which are being installed.
+ * @return A list of shared library infos
+ */
+ ArrayList<SharedLibraryInfo> collectSharedLibraryInfos(@Nullable AndroidPackage pkg,
+ @NonNull Map<String, AndroidPackage> availablePackages,
+ @Nullable final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> newLibraries)
+ throws PackageManagerException {
+ if (pkg == null) {
+ return null;
+ }
+ final PlatformCompat platformCompat = mInjector.getCompatibility();
+ // The collection used here must maintain the order of addition (so
+ // that libraries are searched in the correct order) and must have no
+ // duplicates.
+ ArrayList<SharedLibraryInfo> usesLibraryInfos = null;
+ if (!pkg.getUsesLibraries().isEmpty()) {
+ usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesLibraries(), null, null,
+ pkg.getPackageName(), "shared", true, pkg.getTargetSdkVersion(), null,
+ availablePackages, newLibraries);
+ }
+ if (!pkg.getUsesStaticLibraries().isEmpty()) {
+ usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesStaticLibraries(),
+ pkg.getUsesStaticLibrariesVersions(), pkg.getUsesStaticLibrariesCertDigests(),
+ pkg.getPackageName(), "static shared", true, pkg.getTargetSdkVersion(),
+ usesLibraryInfos, availablePackages, newLibraries);
+ }
+ if (!pkg.getUsesOptionalLibraries().isEmpty()) {
+ usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesOptionalLibraries(), null, null,
+ pkg.getPackageName(), "shared", false, pkg.getTargetSdkVersion(),
+ usesLibraryInfos, availablePackages, newLibraries);
+ }
+ if (platformCompat.isChangeEnabledInternal(ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES,
+ pkg.getPackageName(), pkg.getTargetSdkVersion())) {
+ if (!pkg.getUsesNativeLibraries().isEmpty()) {
+ usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesNativeLibraries(), null,
+ null, pkg.getPackageName(), "native shared", true,
+ pkg.getTargetSdkVersion(), usesLibraryInfos, availablePackages,
+ newLibraries);
+ }
+ if (!pkg.getUsesOptionalNativeLibraries().isEmpty()) {
+ usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesOptionalNativeLibraries(),
+ null, null, pkg.getPackageName(), "native shared", false,
+ pkg.getTargetSdkVersion(), usesLibraryInfos, availablePackages,
+ newLibraries);
+ }
+ }
+ if (!pkg.getUsesSdkLibraries().isEmpty()) {
+ usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesSdkLibraries(),
+ pkg.getUsesSdkLibrariesVersionsMajor(), pkg.getUsesSdkLibrariesCertDigests(),
+ pkg.getPackageName(), "sdk", true, pkg.getTargetSdkVersion(), usesLibraryInfos,
+ availablePackages, newLibraries);
+ }
+ return usesLibraryInfos;
+ }
+
+ private ArrayList<SharedLibraryInfo> collectSharedLibraryInfos(
+ @NonNull List<String> requestedLibraries,
+ @Nullable long[] requiredVersions, @Nullable String[][] requiredCertDigests,
+ @NonNull String packageName, @NonNull String libraryType, boolean required,
+ int targetSdk, @Nullable ArrayList<SharedLibraryInfo> outUsedLibraries,
+ @NonNull final Map<String, AndroidPackage> availablePackages,
+ @Nullable final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> newLibraries)
+ throws PackageManagerException {
+ final int libCount = requestedLibraries.size();
+ for (int i = 0; i < libCount; i++) {
+ final String libName = requestedLibraries.get(i);
+ final long libVersion = requiredVersions != null ? requiredVersions[i]
+ : SharedLibraryInfo.VERSION_UNDEFINED;
+ final SharedLibraryInfo libraryInfo;
+ synchronized (mPm.mLock) {
+ libraryInfo = SharedLibraryUtils.getSharedLibraryInfo(
+ libName, libVersion, mSharedLibraries, newLibraries);
+ }
+ if (libraryInfo == null) {
+ if (required) {
+ throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
+ "Package " + packageName + " requires unavailable " + libraryType
+ + " library " + libName + "; failing!");
+ } else if (DEBUG_SHARED_LIBRARIES) {
+ Slog.i(TAG, "Package " + packageName + " desires unavailable " + libraryType
+ + " library " + libName + "; ignoring!");
+ }
+ } else {
+ if (requiredVersions != null && requiredCertDigests != null) {
+ if (libraryInfo.getLongVersion() != requiredVersions[i]) {
+ throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
+ "Package " + packageName + " requires unavailable " + libraryType
+ + " library " + libName + " version "
+ + libraryInfo.getLongVersion() + "; failing!");
+ }
+ AndroidPackage pkg = availablePackages.get(libraryInfo.getPackageName());
+ SigningDetails libPkg = pkg == null ? null : pkg.getSigningDetails();
+ if (libPkg == null) {
+ throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
+ "Package " + packageName + " requires unavailable " + libraryType
+ + " library; failing!");
+ }
+ final String[] expectedCertDigests = requiredCertDigests[i];
+ if (expectedCertDigests.length > 1) {
+ // For apps targeting O MR1 we require explicit enumeration of all certs.
+ final String[] libCertDigests = (targetSdk >= Build.VERSION_CODES.O_MR1)
+ ? PackageUtils.computeSignaturesSha256Digests(
+ libPkg.getSignatures())
+ : PackageUtils.computeSignaturesSha256Digests(
+ new Signature[]{libPkg.getSignatures()[0]});
+
+ // Take a shortcut if sizes don't match. Note that if an app doesn't
+ // target O we don't parse the "additional-certificate" tags similarly
+ // how we only consider all certs only for apps targeting O (see above).
+ // Therefore, the size check is safe to make.
+ if (expectedCertDigests.length != libCertDigests.length) {
+ throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
+ "Package " + packageName + " requires differently signed "
+ + libraryType + " library; failing!");
+ }
+
+ // Use a predictable order as signature order may vary
+ Arrays.sort(libCertDigests);
+ Arrays.sort(expectedCertDigests);
+
+ final int certCount = libCertDigests.length;
+ for (int j = 0; j < certCount; j++) {
+ if (!libCertDigests[j].equalsIgnoreCase(expectedCertDigests[j])) {
+ throw new PackageManagerException(
+ INSTALL_FAILED_MISSING_SHARED_LIBRARY,
+ "Package " + packageName + " requires differently signed "
+ + libraryType + " library; failing!");
+ }
+ }
+ } else {
+ // lib signing cert could have rotated beyond the one expected, check to see
+ // if the new one has been blessed by the old
+ byte[] digestBytes = HexEncoding.decode(
+ expectedCertDigests[0], false /* allowSingleChar */);
+ if (!libPkg.hasSha256Certificate(digestBytes)) {
+ throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
+ "Package " + packageName + " requires differently signed "
+ + libraryType + " library; failing!");
+ }
+ }
+ }
+ if (outUsedLibraries == null) {
+ outUsedLibraries = new ArrayList<>();
+ }
+ outUsedLibraries.add(libraryInfo);
+ }
+ }
+ return outUsedLibraries;
+ }
+
+ /**
* Dump all shared libraries.
*/
@GuardedBy("mPm.mLock")
diff --git a/services/core/java/com/android/server/pm/SharedLibraryHelper.java b/services/core/java/com/android/server/pm/SharedLibraryHelper.java
deleted file mode 100644
index dd8fad0..0000000
--- a/services/core/java/com/android/server/pm/SharedLibraryHelper.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.pm;
-
-import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SHARED_LIBRARY;
-
-import static com.android.server.pm.PackageManagerService.TAG;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.compat.annotation.ChangeId;
-import android.compat.annotation.EnabledAfter;
-import android.content.pm.SharedLibraryInfo;
-import android.content.pm.Signature;
-import android.content.pm.SigningDetails;
-import android.os.Build;
-import android.util.PackageUtils;
-import android.util.Slog;
-
-import com.android.server.compat.PlatformCompat;
-import com.android.server.pm.parsing.pkg.AndroidPackage;
-import com.android.server.pm.parsing.pkg.ParsedPackage;
-import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.utils.WatchedLongSparseArray;
-
-import libcore.util.HexEncoding;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-final class SharedLibraryHelper {
- private static final boolean DEBUG_SHARED_LIBRARIES = false;
-
- /**
- * Apps targeting Android S and above need to declare dependencies to the public native
- * shared libraries that are defined by the device maker using {@code uses-native-library} tag
- * in its {@code AndroidManifest.xml}.
- *
- * If any of the dependencies cannot be satisfied, i.e. one of the dependency doesn't exist,
- * the package manager rejects to install the app. The dependency can be specified as optional
- * using {@code android:required} attribute in the tag, in which case failing to satisfy the
- * dependency doesn't stop the installation.
- * <p>Once installed, an app is provided with only the native shared libraries that are
- * specified in the app manifest. {@code dlopen}ing a native shared library that doesn't appear
- * in the app manifest will fail even if it actually exists on the device.
- */
- @ChangeId
- @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.R)
- private static final long ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES = 142191088;
-
- /**
- * Compare the newly scanned package with current system state to see which of its declared
- * shared libraries should be allowed to be added to the system.
- */
- public static List<SharedLibraryInfo> getAllowedSharedLibInfos(
- ScanResult scanResult,
- Map<String, WatchedLongSparseArray<SharedLibraryInfo>> existingSharedLibraries) {
- // Let's used the parsed package as scanResult.pkgSetting may be null
- final ParsedPackage parsedPackage = scanResult.mRequest.mParsedPackage;
- if (scanResult.mSdkSharedLibraryInfo == null && scanResult.mStaticSharedLibraryInfo == null
- && scanResult.mDynamicSharedLibraryInfos == null) {
- return null;
- }
-
- // Any app can add new SDKs and static shared libraries.
- if (scanResult.mSdkSharedLibraryInfo != null) {
- return Collections.singletonList(scanResult.mSdkSharedLibraryInfo);
- }
- if (scanResult.mStaticSharedLibraryInfo != null) {
- return Collections.singletonList(scanResult.mStaticSharedLibraryInfo);
- }
- final boolean hasDynamicLibraries = parsedPackage.isSystem()
- && scanResult.mDynamicSharedLibraryInfos != null;
- if (!hasDynamicLibraries) {
- return null;
- }
- final boolean isUpdatedSystemApp = scanResult.mPkgSetting.getPkgState()
- .isUpdatedSystemApp();
- // We may not yet have disabled the updated package yet, so be sure to grab the
- // current setting if that's the case.
- final PackageSetting updatedSystemPs = isUpdatedSystemApp
- ? scanResult.mRequest.mDisabledPkgSetting == null
- ? scanResult.mRequest.mOldPkgSetting
- : scanResult.mRequest.mDisabledPkgSetting
- : null;
- if (isUpdatedSystemApp && (updatedSystemPs.getPkg() == null
- || updatedSystemPs.getPkg().getLibraryNames() == null)) {
- Slog.w(TAG, "Package " + parsedPackage.getPackageName()
- + " declares libraries that are not declared on the system image; skipping");
- return null;
- }
- final ArrayList<SharedLibraryInfo> infos =
- new ArrayList<>(scanResult.mDynamicSharedLibraryInfos.size());
- for (SharedLibraryInfo info : scanResult.mDynamicSharedLibraryInfos) {
- final String name = info.getName();
- if (isUpdatedSystemApp) {
- // New library entries can only be added through the
- // system image. This is important to get rid of a lot
- // of nasty edge cases: for example if we allowed a non-
- // system update of the app to add a library, then uninstalling
- // the update would make the library go away, and assumptions
- // we made such as through app install filtering would now
- // have allowed apps on the device which aren't compatible
- // with it. Better to just have the restriction here, be
- // conservative, and create many fewer cases that can negatively
- // impact the user experience.
- if (!updatedSystemPs.getPkg().getLibraryNames().contains(name)) {
- Slog.w(TAG, "Package " + parsedPackage.getPackageName()
- + " declares library " + name
- + " that is not declared on system image; skipping");
- continue;
- }
- }
- if (sharedLibExists(
- name, SharedLibraryInfo.VERSION_UNDEFINED, existingSharedLibraries)) {
- Slog.w(TAG, "Package " + parsedPackage.getPackageName() + " declares library "
- + name + " that already exists; skipping");
- continue;
- }
- infos.add(info);
- }
- return infos;
- }
-
- public static boolean sharedLibExists(final String name, final long version,
- Map<String, WatchedLongSparseArray<SharedLibraryInfo>> librarySource) {
- WatchedLongSparseArray<SharedLibraryInfo> versionedLib = librarySource.get(name);
- return versionedLib != null && versionedLib.indexOfKey(version) >= 0;
- }
-
- /**
- * Returns false if the adding shared library already exists in the map and so could not be
- * added.
- */
- public static boolean addSharedLibraryToPackageVersionMap(
- Map<String, WatchedLongSparseArray<SharedLibraryInfo>> target,
- SharedLibraryInfo library) {
- final String name = library.getName();
- if (target.containsKey(name)) {
- if (library.getType() != SharedLibraryInfo.TYPE_STATIC) {
- // We've already added this non-version-specific library to the map.
- return false;
- } else if (target.get(name).indexOfKey(library.getLongVersion()) >= 0) {
- // We've already added this version of a version-specific library to the map.
- return false;
- }
- } else {
- target.put(name, new WatchedLongSparseArray<>());
- }
- target.get(name).put(library.getLongVersion(), library);
- return true;
- }
-
- public static ArrayList<SharedLibraryInfo> collectSharedLibraryInfos(AndroidPackage pkg,
- Map<String, AndroidPackage> availablePackages,
- @NonNull final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> existingLibraries,
- @Nullable final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> newLibraries,
- PlatformCompat platformCompat) throws PackageManagerException {
- if (pkg == null) {
- return null;
- }
- // The collection used here must maintain the order of addition (so
- // that libraries are searched in the correct order) and must have no
- // duplicates.
- ArrayList<SharedLibraryInfo> usesLibraryInfos = null;
- if (!pkg.getUsesLibraries().isEmpty()) {
- usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesLibraries(), null, null,
- pkg.getPackageName(), "shared", true, pkg.getTargetSdkVersion(), null,
- availablePackages, existingLibraries, newLibraries);
- }
- if (!pkg.getUsesStaticLibraries().isEmpty()) {
- usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesStaticLibraries(),
- pkg.getUsesStaticLibrariesVersions(), pkg.getUsesStaticLibrariesCertDigests(),
- pkg.getPackageName(), "static shared", true, pkg.getTargetSdkVersion(),
- usesLibraryInfos, availablePackages, existingLibraries, newLibraries);
- }
- if (!pkg.getUsesOptionalLibraries().isEmpty()) {
- usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesOptionalLibraries(), null, null,
- pkg.getPackageName(), "shared", false, pkg.getTargetSdkVersion(),
- usesLibraryInfos, availablePackages, existingLibraries, newLibraries);
- }
- if (platformCompat.isChangeEnabledInternal(ENFORCE_NATIVE_SHARED_LIBRARY_DEPENDENCIES,
- pkg.getPackageName(), pkg.getTargetSdkVersion())) {
- if (!pkg.getUsesNativeLibraries().isEmpty()) {
- usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesNativeLibraries(), null,
- null, pkg.getPackageName(), "native shared", true,
- pkg.getTargetSdkVersion(), usesLibraryInfos, availablePackages,
- existingLibraries, newLibraries);
- }
- if (!pkg.getUsesOptionalNativeLibraries().isEmpty()) {
- usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesOptionalNativeLibraries(),
- null, null, pkg.getPackageName(), "native shared", false,
- pkg.getTargetSdkVersion(), usesLibraryInfos, availablePackages,
- existingLibraries, newLibraries);
- }
- }
- if (!pkg.getUsesSdkLibraries().isEmpty()) {
- usesLibraryInfos = collectSharedLibraryInfos(pkg.getUsesSdkLibraries(),
- pkg.getUsesSdkLibrariesVersionsMajor(), pkg.getUsesSdkLibrariesCertDigests(),
- pkg.getPackageName(), "sdk", true, pkg.getTargetSdkVersion(), usesLibraryInfos,
- availablePackages, existingLibraries, newLibraries);
- }
- return usesLibraryInfos;
- }
-
- public static ArrayList<SharedLibraryInfo> collectSharedLibraryInfos(
- @NonNull List<String> requestedLibraries,
- @Nullable long[] requiredVersions, @Nullable String[][] requiredCertDigests,
- @NonNull String packageName, @NonNull String libraryType, boolean required,
- int targetSdk, @Nullable ArrayList<SharedLibraryInfo> outUsedLibraries,
- @NonNull final Map<String, AndroidPackage> availablePackages,
- @NonNull final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> existingLibraries,
- @Nullable final Map<String, WatchedLongSparseArray<SharedLibraryInfo>> newLibraries)
- throws PackageManagerException {
- final int libCount = requestedLibraries.size();
- for (int i = 0; i < libCount; i++) {
- final String libName = requestedLibraries.get(i);
- final long libVersion = requiredVersions != null ? requiredVersions[i]
- : SharedLibraryInfo.VERSION_UNDEFINED;
- final SharedLibraryInfo libraryInfo =
- getSharedLibraryInfo(libName, libVersion, existingLibraries, newLibraries);
- if (libraryInfo == null) {
- if (required) {
- throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
- "Package " + packageName + " requires unavailable " + libraryType
- + " library " + libName + "; failing!");
- } else if (DEBUG_SHARED_LIBRARIES) {
- Slog.i(TAG, "Package " + packageName + " desires unavailable " + libraryType
- + " library " + libName + "; ignoring!");
- }
- } else {
- if (requiredVersions != null && requiredCertDigests != null) {
- if (libraryInfo.getLongVersion() != requiredVersions[i]) {
- throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
- "Package " + packageName + " requires unavailable " + libraryType
- + " library " + libName + " version "
- + libraryInfo.getLongVersion() + "; failing!");
- }
- AndroidPackage pkg = availablePackages.get(libraryInfo.getPackageName());
- SigningDetails libPkg = pkg == null ? null : pkg.getSigningDetails();
- if (libPkg == null) {
- throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
- "Package " + packageName + " requires unavailable " + libraryType
- + " library; failing!");
- }
- final String[] expectedCertDigests = requiredCertDigests[i];
- if (expectedCertDigests.length > 1) {
- // For apps targeting O MR1 we require explicit enumeration of all certs.
- final String[] libCertDigests = (targetSdk >= Build.VERSION_CODES.O_MR1)
- ? PackageUtils.computeSignaturesSha256Digests(
- libPkg.getSignatures())
- : PackageUtils.computeSignaturesSha256Digests(
- new Signature[]{libPkg.getSignatures()[0]});
-
- // Take a shortcut if sizes don't match. Note that if an app doesn't
- // target O we don't parse the "additional-certificate" tags similarly
- // how we only consider all certs only for apps targeting O (see above).
- // Therefore, the size check is safe to make.
- if (expectedCertDigests.length != libCertDigests.length) {
- throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
- "Package " + packageName + " requires differently signed "
- + libraryType + " library; failing!");
- }
-
- // Use a predictable order as signature order may vary
- Arrays.sort(libCertDigests);
- Arrays.sort(expectedCertDigests);
-
- final int certCount = libCertDigests.length;
- for (int j = 0; j < certCount; j++) {
- if (!libCertDigests[j].equalsIgnoreCase(expectedCertDigests[j])) {
- throw new PackageManagerException(
- INSTALL_FAILED_MISSING_SHARED_LIBRARY,
- "Package " + packageName + " requires differently signed "
- + libraryType + " library; failing!");
- }
- }
- } else {
- // lib signing cert could have rotated beyond the one expected, check to see
- // if the new one has been blessed by the old
- byte[] digestBytes = HexEncoding.decode(
- expectedCertDigests[0], false /* allowSingleChar */);
- if (!libPkg.hasSha256Certificate(digestBytes)) {
- throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY,
- "Package " + packageName + " requires differently signed "
- + libraryType + " library; failing!");
- }
- }
- }
- if (outUsedLibraries == null) {
- outUsedLibraries = new ArrayList<>();
- }
- outUsedLibraries.add(libraryInfo);
- }
- }
- return outUsedLibraries;
- }
-
- @Nullable
- public static SharedLibraryInfo getSharedLibraryInfo(String name, long version,
- Map<String, WatchedLongSparseArray<SharedLibraryInfo>> existingLibraries,
- @Nullable Map<String, WatchedLongSparseArray<SharedLibraryInfo>> newLibraries) {
- if (newLibraries != null) {
- final WatchedLongSparseArray<SharedLibraryInfo> versionedLib = newLibraries.get(name);
- SharedLibraryInfo info = null;
- if (versionedLib != null) {
- info = versionedLib.get(version);
- }
- if (info != null) {
- return info;
- }
- }
- final WatchedLongSparseArray<SharedLibraryInfo> versionedLib = existingLibraries.get(name);
- if (versionedLib == null) {
- return null;
- }
- return versionedLib.get(version);
- }
-
- public static List<SharedLibraryInfo> findSharedLibraries(PackageStateInternal pkgSetting) {
- if (!pkgSetting.getTransientState().getUsesLibraryInfos().isEmpty()) {
- ArrayList<SharedLibraryInfo> retValue = new ArrayList<>();
- Set<String> collectedNames = new HashSet<>();
- for (SharedLibraryInfo info : pkgSetting.getTransientState().getUsesLibraryInfos()) {
- findSharedLibrariesRecursive(info, retValue, collectedNames);
- }
- return retValue;
- } else {
- return Collections.emptyList();
- }
- }
-
- private static void findSharedLibrariesRecursive(SharedLibraryInfo info,
- ArrayList<SharedLibraryInfo> collected, Set<String> collectedNames) {
- if (!collectedNames.contains(info.getName())) {
- collectedNames.add(info.getName());
- collected.add(info);
-
- if (info.getDependencies() != null) {
- for (SharedLibraryInfo dep : info.getDependencies()) {
- findSharedLibrariesRecursive(dep, collected, collectedNames);
- }
- }
- }
- }
-
-}
diff --git a/services/core/java/com/android/server/pm/SharedLibraryUtils.java b/services/core/java/com/android/server/pm/SharedLibraryUtils.java
new file mode 100644
index 0000000..274870d
--- /dev/null
+++ b/services/core/java/com/android/server/pm/SharedLibraryUtils.java
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ */
+
+package com.android.server.pm;
+
+import android.annotation.Nullable;
+import android.content.pm.SharedLibraryInfo;
+
+import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.utils.WatchedLongSparseArray;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+final class SharedLibraryUtils {
+
+ /**
+ * Returns false if the adding shared library already exists in the map and so could not be
+ * added.
+ */
+ public static boolean addSharedLibraryToPackageVersionMap(
+ Map<String, WatchedLongSparseArray<SharedLibraryInfo>> target,
+ SharedLibraryInfo library) {
+ final String name = library.getName();
+ if (target.containsKey(name)) {
+ if (library.getType() != SharedLibraryInfo.TYPE_STATIC) {
+ // We've already added this non-version-specific library to the map.
+ return false;
+ } else if (target.get(name).indexOfKey(library.getLongVersion()) >= 0) {
+ // We've already added this version of a version-specific library to the map.
+ return false;
+ }
+ } else {
+ target.put(name, new WatchedLongSparseArray<>());
+ }
+ target.get(name).put(library.getLongVersion(), library);
+ return true;
+ }
+
+ @Nullable
+ public static SharedLibraryInfo getSharedLibraryInfo(String name, long version,
+ Map<String, WatchedLongSparseArray<SharedLibraryInfo>> existingLibraries,
+ @Nullable Map<String, WatchedLongSparseArray<SharedLibraryInfo>> newLibraries) {
+ if (newLibraries != null) {
+ final WatchedLongSparseArray<SharedLibraryInfo> versionedLib = newLibraries.get(name);
+ SharedLibraryInfo info = null;
+ if (versionedLib != null) {
+ info = versionedLib.get(version);
+ }
+ if (info != null) {
+ return info;
+ }
+ }
+ final WatchedLongSparseArray<SharedLibraryInfo> versionedLib = existingLibraries.get(name);
+ if (versionedLib == null) {
+ return null;
+ }
+ return versionedLib.get(version);
+ }
+
+ public static List<SharedLibraryInfo> findSharedLibraries(PackageStateInternal pkgSetting) {
+ if (!pkgSetting.getTransientState().getUsesLibraryInfos().isEmpty()) {
+ ArrayList<SharedLibraryInfo> retValue = new ArrayList<>();
+ Set<String> collectedNames = new HashSet<>();
+ for (SharedLibraryInfo info : pkgSetting.getTransientState().getUsesLibraryInfos()) {
+ findSharedLibrariesRecursive(info, retValue, collectedNames);
+ }
+ return retValue;
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ private static void findSharedLibrariesRecursive(SharedLibraryInfo info,
+ ArrayList<SharedLibraryInfo> collected, Set<String> collectedNames) {
+ if (!collectedNames.contains(info.getName())) {
+ collectedNames.add(info.getName());
+ collected.add(info);
+
+ if (info.getDependencies() != null) {
+ for (SharedLibraryInfo dep : info.getDependencies()) {
+ findSharedLibrariesRecursive(dep, collected, collectedNames);
+ }
+ }
+ }
+ }
+
+}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 167ad3b..fb3ca91 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -3537,8 +3537,11 @@
Slog.wtf(LOG_TAG, "Seeing both legacy and current local restrictions in xml");
}
} else if (legacyLocalRestrictions != null) {
- mDevicePolicyLocalUserRestrictions.put(id,
- new RestrictionsSet(id, legacyLocalRestrictions));
+ RestrictionsSet legacyLocalRestrictionsSet =
+ legacyLocalRestrictions.isEmpty()
+ ? new RestrictionsSet()
+ : new RestrictionsSet(id, legacyLocalRestrictions);
+ mDevicePolicyLocalUserRestrictions.put(id, legacyLocalRestrictionsSet);
}
if (globalRestrictions != null) {
mDevicePolicyGlobalUserRestrictions.updateRestrictions(id,
@@ -4478,7 +4481,7 @@
userData.info.flags |= UserInfo.FLAG_EPHEMERAL;
writeUserLP(userData);
- return UserManager.REMOVE_RESULT_SET_EPHEMERAL;
+ return UserManager.REMOVE_RESULT_DEFERRED;
}
} finally {
Binder.restoreCallingIdentity(ident);
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index b15e495..60d2fc1 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -217,6 +217,11 @@
NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.NEARBY_WIFI_DEVICES);
}
+ private static final Set<String> NOTIFICATION_PERMISSIONS = new ArraySet<>();
+ static {
+ NOTIFICATION_PERMISSIONS.add(Manifest.permission.POST_NOTIFICATIONS);
+ }
+
private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1;
private static final String ACTION_TRACK = "com.android.fitness.TRACK";
@@ -378,18 +383,43 @@
grantPermissionsToSysComponentsAndPrivApps(pm, userId);
grantDefaultSystemHandlerPermissions(pm, userId);
+ grantSignatureAppsNotificationPermissions(pm, userId);
grantDefaultPermissionExceptions(pm, userId);
// Apply delayed state
pm.apply();
}
+ private void grantSignatureAppsNotificationPermissions(PackageManagerWrapper pm, int userId) {
+ Log.i(TAG, "Granting Notification permissions to platform signature apps for user "
+ + userId);
+ List<PackageInfo> packages = mContext.getPackageManager().getInstalledPackagesAsUser(
+ DEFAULT_PACKAGE_INFO_QUERY_FLAGS, UserHandle.USER_SYSTEM);
+ for (PackageInfo pkg : packages) {
+ if (pkg == null || !pkg.applicationInfo.isSystemApp()
+ || !pkg.applicationInfo.isSignedWithPlatformKey()) {
+ continue;
+ }
+ grantRuntimePermissionsForSystemPackage(pm, userId, pkg, NOTIFICATION_PERMISSIONS);
+ }
+
+ }
+
private void grantRuntimePermissionsForSystemPackage(PackageManagerWrapper pm,
int userId, PackageInfo pkg) {
+ grantRuntimePermissionsForSystemPackage(pm, userId, pkg, null);
+ }
+
+ private void grantRuntimePermissionsForSystemPackage(PackageManagerWrapper pm,
+ int userId, PackageInfo pkg, Set<String> filterPermissions) {
+ if (ArrayUtils.isEmpty(pkg.requestedPermissions)) {
+ return;
+ }
Set<String> permissions = new ArraySet<>();
for (String permission : pkg.requestedPermissions) {
final PermissionInfo perm = pm.getPermissionInfo(permission);
- if (perm == null) {
+ if (perm == null
+ || (filterPermissions != null && !filterPermissions.contains(permission))) {
continue;
}
if (perm.isRuntime()) {
@@ -547,23 +577,31 @@
String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
syncAdapterPackagesProvider.getPackages(CalendarContract.AUTHORITY, userId) : null;
+ // PermissionController
+ grantSystemFixedPermissionsToSystemPackage(pm,
+ mContext.getPackageManager().getPermissionControllerPackageName(), userId,
+ NOTIFICATION_PERMISSIONS);
+
// Installer
grantSystemFixedPermissionsToSystemPackage(pm,
ArrayUtils.firstOrNull(getKnownPackages(
PackageManagerInternal.PACKAGE_INSTALLER, userId)),
- userId, STORAGE_PERMISSIONS);
+ userId, STORAGE_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// Verifier
final String verifier = ArrayUtils.firstOrNull(getKnownPackages(
PackageManagerInternal.PACKAGE_VERIFIER, userId));
grantSystemFixedPermissionsToSystemPackage(pm, verifier, userId, STORAGE_PERMISSIONS);
- grantPermissionsToSystemPackage(pm, verifier, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS);
+ grantPermissionsToSystemPackage(pm, verifier, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS,
+ NOTIFICATION_PERMISSIONS);
// SetupWizard
final String setupWizardPackage = ArrayUtils.firstOrNull(getKnownPackages(
PackageManagerInternal.PACKAGE_SETUP_WIZARD, userId));
grantPermissionsToSystemPackage(pm, setupWizardPackage, userId, PHONE_PERMISSIONS,
CONTACTS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, CAMERA_PERMISSIONS);
+ grantSystemFixedPermissionsToSystemPackage(pm, setupWizardPackage, userId,
+ NOTIFICATION_PERMISSIONS);
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0)
|| mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE,
0)) {
@@ -585,12 +623,12 @@
// Media provider
grantSystemFixedPermissionsToSystemPackage(pm,
getDefaultProviderAuthorityPackage(MediaStore.AUTHORITY, userId), userId,
- STORAGE_PERMISSIONS);
+ STORAGE_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// Downloads provider
grantSystemFixedPermissionsToSystemPackage(pm,
getDefaultProviderAuthorityPackage("downloads", userId), userId,
- STORAGE_PERMISSIONS);
+ STORAGE_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// Downloads UI
grantSystemFixedPermissionsToSystemPackage(pm,
@@ -649,7 +687,7 @@
// Cell Broadcast Receiver
grantSystemFixedPermissionsToSystemPackage(pm,
getDefaultSystemHandlerActivityPackage(pm, Intents.SMS_CB_RECEIVED_ACTION, userId),
- userId, SMS_PERMISSIONS, NEARBY_DEVICES_PERMISSIONS);
+ userId, SMS_PERMISSIONS, NEARBY_DEVICES_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// Carrier Provisioning Service
grantPermissionsToSystemPackage(pm,
@@ -661,7 +699,7 @@
grantPermissionsToSystemPackage(pm,
getDefaultSystemHandlerActivityPackageForCategory(pm,
Intent.CATEGORY_APP_CALENDAR, userId),
- userId, CALENDAR_PERMISSIONS, CONTACTS_PERMISSIONS);
+ userId, CALENDAR_PERMISSIONS, CONTACTS_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// Calendar provider
String calendarProvider =
@@ -762,7 +800,8 @@
grantPermissionsToSystemPackage(pm, packageName, userId,
CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS,
PHONE_PERMISSIONS, SMS_PERMISSIONS, CAMERA_PERMISSIONS,
- SENSORS_PERMISSIONS, STORAGE_PERMISSIONS, NEARBY_DEVICES_PERMISSIONS);
+ SENSORS_PERMISSIONS, STORAGE_PERMISSIONS, NEARBY_DEVICES_PERMISSIONS,
+ NOTIFICATION_PERMISSIONS);
grantSystemFixedPermissionsToSystemPackage(pm, packageName, userId,
ALWAYS_LOCATION_PERMISSIONS, ACTIVITY_RECOGNITION_PERMISSIONS);
}
@@ -791,7 +830,7 @@
.addCategory(Intent.CATEGORY_LAUNCHER_APP);
grantPermissionsToSystemPackage(pm,
getDefaultSystemHandlerActivityPackage(pm, homeIntent, userId), userId,
- ALWAYS_LOCATION_PERMISSIONS);
+ ALWAYS_LOCATION_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// Watches
if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) {
@@ -816,7 +855,7 @@
// Print Spooler
grantSystemFixedPermissionsToSystemPackage(pm, PrintManager.PRINT_SPOOLER_PACKAGE_NAME,
- userId, ALWAYS_LOCATION_PERMISSIONS);
+ userId, ALWAYS_LOCATION_PERMISSIONS, NOTIFICATION_PERMISSIONS);
// EmergencyInfo
grantSystemFixedPermissionsToSystemPackage(pm,
@@ -920,12 +959,13 @@
mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0);
if (isPhonePermFixed) {
grantSystemFixedPermissionsToSystemPackage(pm, dialerPackage, userId,
- PHONE_PERMISSIONS);
+ PHONE_PERMISSIONS, NOTIFICATION_PERMISSIONS);
} else {
grantPermissionsToSystemPackage(pm, dialerPackage, userId, PHONE_PERMISSIONS);
}
grantPermissionsToSystemPackage(pm, dialerPackage, userId,
- CONTACTS_PERMISSIONS, SMS_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
+ CONTACTS_PERMISSIONS, SMS_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS,
+ NOTIFICATION_PERMISSIONS);
boolean isAndroidAutomotive =
mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, 0);
if (isAndroidAutomotive) {
@@ -937,7 +977,8 @@
String smsPackage, int userId) {
grantPermissionsToSystemPackage(pm, smsPackage, userId,
PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS,
- STORAGE_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
+ STORAGE_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS,
+ NOTIFICATION_PERMISSIONS);
}
private void grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(PackageManagerWrapper pm,
@@ -1337,7 +1378,9 @@
pm.grantPermission(permission, pkg, user);
}
- pm.updatePermissionFlags(permission, pkg, newFlags, newFlags, user);
+ // clear the REVIEW_REQUIRED flag, if set
+ int flagMask = newFlags | PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
+ pm.updatePermissionFlags(permission, pkg, flagMask, newFlags, user);
}
// If a component gets a permission for being the default handler A
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index a3b6b82..85e54f3 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -66,9 +66,11 @@
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.Preconditions;
import com.android.internal.util.function.TriFunction;
import com.android.server.LocalServices;
import com.android.server.pm.UserManagerInternal;
+import com.android.server.pm.UserManagerService;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.permission.PermissionManagerServiceInternal.HotwordDetectionServiceProvider;
@@ -549,6 +551,12 @@
}
@Override
+ public void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId) {
+ mPermissionManagerServiceImpl.revokePostNotificationPermissionWithoutKillForTest(
+ packageName, userId);
+ }
+
+ @Override
public boolean shouldShowRequestPermissionRationale(String packageName, String permissionName,
int userId) {
return mPermissionManagerServiceImpl.shouldShowRequestPermissionRationale(packageName,
@@ -678,8 +686,23 @@
@Override
public void onPackageInstalled(@NonNull AndroidPackage pkg, int previousAppId,
- @NonNull PackageInstalledParams params, @UserIdInt int userId) {
- mPermissionManagerServiceImpl.onPackageInstalled(pkg, previousAppId, params, userId);
+ @NonNull PackageInstalledParams params, @UserIdInt int rawUserId) {
+ Objects.requireNonNull(pkg, "pkg");
+ Objects.requireNonNull(params, "params");
+ Preconditions.checkArgument(rawUserId >= UserHandle.USER_SYSTEM
+ || rawUserId == UserHandle.USER_ALL, "userId");
+
+ mPermissionManagerServiceImpl.onPackageInstalled(pkg, previousAppId, params, rawUserId);
+ final int[] userIds = rawUserId == UserHandle.USER_ALL ? getAllUserIds()
+ : new int[] { rawUserId };
+ for (final int userId : userIds) {
+ final int autoRevokePermissionsMode = params.getAutoRevokePermissionsMode();
+ if (autoRevokePermissionsMode == AppOpsManager.MODE_ALLOWED
+ || autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED) {
+ setAutoRevokeExemptedInternal(pkg,
+ autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED, userId);
+ }
+ }
}
@Override
@@ -780,6 +803,15 @@
}
/**
+ * Returns all relevant user ids. This list include the current set of created user ids as well
+ * as pre-created user ids.
+ * @return user ids for created users and pre-created users
+ */
+ private int[] getAllUserIds() {
+ return UserManagerService.getInstance().getUserIdsIncludingPreCreated();
+ }
+
+ /**
* Interface to intercept permission checks and optionally pass through to the original
* implementation.
*/
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
index c9fd122..21cb2c9 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java
@@ -19,8 +19,6 @@
import static android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
-import static android.app.AppOpsManager.MODE_ALLOWED;
-import static android.app.AppOpsManager.MODE_IGNORED;
import static android.content.pm.PackageManager.FLAGS_PERMISSION_RESTRICTION_ANY_EXEMPT;
import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION;
import static android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED;
@@ -63,7 +61,6 @@
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
-import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.compat.annotation.ChangeId;
@@ -170,6 +167,10 @@
private static final String TAG = "PackageManager";
private static final String LOG_TAG = PermissionManagerServiceImpl.class.getSimpleName();
+ private static final String SKIP_KILL_APP_REASON_NOTIFICATION_TEST = "skip permission revoke "
+ + "app kill for notification test";
+
+
private static final long BACKUP_TIMEOUT_MILLIS = SECONDS.toMillis(60);
// For automotive products, CarService enforces allow-listing of the privileged permissions
@@ -198,14 +199,19 @@
/** All nearby devices permissions */
private static final List<String> NEARBY_DEVICES_PERMISSIONS = new ArrayList<>();
- // TODO: This is a placeholder. Replace with actual implementation
- private static final List<String> NOTIFICATION_PERMISSIONS = new ArrayList<>();
-
/**
- * All permissions that should be granted with the REVOKE_WHEN_REQUESTED flag, if they are
- * implicitly added to a package
+ * All notification permissions.
+ * Notification permission state is treated differently from other permissions. Notification
+ * permission get the REVIEW_REQUIRED flag set for S- apps, or for T+ apps on updating to T or
+ * restoring a pre-T backup. The permission and app op remain denied. The flag will be read by
+ * the notification system, and allow apps to send notifications, until cleared.
+ * The flag is cleared for S- apps by the system showing a permission request prompt, and the
+ * user clicking "allow" or "deny" in the dialog. For T+ apps, the flag is cleared upon the
+ * first activity launch.
+ *
+ * @see PermissionPolicyInternal#showNotificationPromptIfNeeded(String, int, int)
*/
- private static final List<String> IMPLICIT_GRANTED_PERMISSIONS = new ArrayList<>();
+ private static final List<String> NOTIFICATION_PERMISSIONS = new ArrayList<>();
/** If the permission of the value is granted, so is the key */
private static final Map<String, String> FULLER_PERMISSION_MAP = new HashMap<>();
@@ -221,7 +227,7 @@
NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_ADVERTISE);
NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_CONNECT);
NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_SCAN);
- IMPLICIT_GRANTED_PERMISSIONS.add(Manifest.permission.POST_NOTIFICATIONS);
+ NOTIFICATION_PERMISSIONS.add(Manifest.permission.POST_NOTIFICATIONS);
}
/** Set of source package names for Privileged Permission Allowlist */
@@ -244,9 +250,6 @@
/** Permission controller: User space permission management */
private PermissionControllerManager mPermissionControllerManager;
- /** App ops manager */
- private final AppOpsManager mAppOpsManager;
-
/**
* Built-in permissions. Read from system configuration files. Mapping is from
* UID to permission name.
@@ -321,11 +324,15 @@
mPackageManagerInt.writeSettings(true);
}
@Override
- public void onPermissionRevoked(int uid, int userId, String reason) {
+ public void onPermissionRevoked(int uid, int userId, String reason, boolean overrideKill) {
mOnPermissionChangeListeners.onPermissionsChanged(uid);
// Critical; after this call the application should never have the permission
mPackageManagerInt.writeSettings(false);
+ if (overrideKill) {
+ return;
+ }
+
final int appId = UserHandle.getAppId(uid);
if (reason == null) {
mHandler.post(() -> killUid(appId, userId, KILL_APP_REASON_PERMISSIONS_REVOKED));
@@ -374,7 +381,6 @@
mContext = context;
mPackageManagerInt = LocalServices.getService(PackageManagerInternal.class);
mUserManagerInt = LocalServices.getService(UserManagerInternal.class);
- mAppOpsManager = context.getSystemService(AppOpsManager.class);
mPrivilegedPermissionAllowlistSourcePackageNames.add(PLATFORM_PACKAGE_NAME);
// PackageManager.hasSystemFeature() is not used here because PackageManagerService
@@ -1440,9 +1446,29 @@
reason, mDefaultPermissionCallback);
}
+ @Override
+ public void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ final boolean overridePolicy =
+ checkUidPermission(callingUid, ADJUST_RUNTIME_PERMISSIONS_POLICY)
+ == PackageManager.PERMISSION_GRANTED;
+ mContext.enforceCallingPermission(
+ android.Manifest.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL, "");
+ revokeRuntimePermissionInternal(packageName, Manifest.permission.POST_NOTIFICATIONS,
+ overridePolicy, true, callingUid, userId,
+ SKIP_KILL_APP_REASON_NOTIFICATION_TEST, mDefaultPermissionCallback);
+ }
+
private void revokeRuntimePermissionInternal(String packageName, String permName,
- boolean overridePolicy, int callingUid, final int userId, String reason,
- PermissionCallback callback) {
+ boolean overridePolicy, int callingUid, final int userId,
+ String reason, PermissionCallback callback) {
+ revokeRuntimePermissionInternal(packageName, permName, overridePolicy, false, callingUid,
+ userId, reason, callback);
+ }
+
+ private void revokeRuntimePermissionInternal(String packageName, String permName,
+ boolean overridePolicy, boolean overrideKill, int callingUid, final int userId,
+ String reason, PermissionCallback callback) {
if (PermissionManager.DEBUG_TRACE_PERMISSION_UPDATES
&& PermissionManager.shouldTraceGrant(packageName, permName, userId)) {
Log.i(TAG, "System is revoking " + packageName + " "
@@ -1554,7 +1580,7 @@
if (callback != null) {
if (isRuntimePermission) {
callback.onPermissionRevoked(UserHandle.getUid(userId, pkg.getUid()), userId,
- reason);
+ reason, overrideKill);
} else {
mDefaultPermissionCallback.onInstallPermissionRevoked();
}
@@ -2594,9 +2620,12 @@
// Cache newImplicitPermissions before modifing permissionsState as for the
// shared uids the original and new state are the same object
+ // TODO(205888750): remove the line for LEGACY_REVIEW once propagated through
+ // droidfood
if (!origState.hasPermissionState(permName)
&& (pkg.getImplicitPermissions().contains(permName)
- || (permName.equals(Manifest.permission.ACTIVITY_RECOGNITION)))) {
+ || (permName.equals(Manifest.permission.ACTIVITY_RECOGNITION)))
+ || NOTIFICATION_PERMISSIONS.contains(permName)) {
if (pkg.getImplicitPermissions().contains(permName)) {
// If permName is an implicit permission, try to auto-grant
newImplicitPermissions.add(permName);
@@ -2754,9 +2783,11 @@
}
// Remove review flag as it is not necessary anymore
- if ((flags & FLAG_PERMISSION_REVIEW_REQUIRED) != 0) {
- flags &= ~FLAG_PERMISSION_REVIEW_REQUIRED;
- wasChanged = true;
+ if (!NOTIFICATION_PERMISSIONS.contains(perm)) {
+ if ((flags & FLAG_PERMISSION_REVIEW_REQUIRED) != 0) {
+ flags &= ~FLAG_PERMISSION_REVIEW_REQUIRED;
+ wasChanged = true;
+ }
}
if ((flags & FLAG_PERMISSION_REVOKED_COMPAT) != 0
@@ -3117,28 +3148,37 @@
inheritPermissionStateToNewImplicitPermissionLocked(sourcePerms, newPerm, ps,
pkg);
}
- } else if (IMPLICIT_GRANTED_PERMISSIONS.contains(newPerm)
- && !origPs.hasPermissionState(newPerm)) {
+ } else if (NOTIFICATION_PERMISSIONS.contains(newPerm)) {
+ //&& (origPs.getPermissionState(newPerm) == null) {
+ // TODO(b/205888750): add back line about origPs once propagated through droidfood
Permission bp = mRegistry.getPermission(newPerm);
if (bp == null) {
throw new IllegalStateException("Unknown new permission " + newPerm);
}
- if ((ps.getPermissionState(newPerm).getFlags()
- & FLAG_PERMISSION_REVIEW_REQUIRED) != 0) {
- // No need to grant if review is required
- continue;
+ // TODO(b/205888750): remove the line for REVOKE_WHEN_REQUESTED once propagated
+ // through droidfood
+ if (!isUserSetOrPregrantedOrFixed(ps.getPermissionFlags(newPerm))) {
+ updatedUserIds = ArrayUtils.appendInt(updatedUserIds, userId);
+ ps.updatePermissionFlags(bp, PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED
+ | FLAG_PERMISSION_REVOKE_WHEN_REQUESTED,
+ PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED);
+ // TODO(b/205888750): remove revoke once propagated through droidfood
+ if (ps.isPermissionGranted(newPerm)) {
+ ps.revokePermission(bp);
+ }
}
- updatedUserIds = ArrayUtils.appendInt(updatedUserIds, userId);
- ps.updatePermissionFlags(bp,
- FLAG_PERMISSION_REVOKE_WHEN_REQUESTED,
- FLAG_PERMISSION_REVOKE_WHEN_REQUESTED);
- ps.grantPermission(bp);
}
}
return updatedUserIds;
}
+ private boolean isUserSetOrPregrantedOrFixed(int flags) {
+ return (flags & (FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED
+ | FLAG_PERMISSION_POLICY_FIXED | FLAG_PERMISSION_SYSTEM_FIXED
+ | FLAG_PERMISSION_GRANTED_BY_DEFAULT | FLAG_PERMISSION_GRANTED_BY_ROLE)) != 0;
+ }
+
@NonNull
@Override
public List<SplitPermissionInfoParcelable> getSplitPermissions() {
@@ -4323,9 +4363,9 @@
updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, false)
);
- mSystemReady = true;
-
synchronized (mLock) {
+ mSystemReady = true;
+
if (mPrivappPermissionsViolations != null) {
throw new IllegalStateException("Signature|privileged permissions not in "
+ "privapp-permissions allowlist: " + mPrivappPermissionsViolations);
@@ -4905,15 +4945,6 @@
addAllowlistedRestrictedPermissionsInternal(pkg,
params.getAllowlistedRestrictedPermissions(),
FLAG_PERMISSION_WHITELIST_INSTALLER, userId);
- final int autoRevokePermissionsMode = params.getAutoRevokePermissionsMode();
- if (autoRevokePermissionsMode == AppOpsManager.MODE_ALLOWED
- || autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED) {
- // TODO: theianchen Bug: 182523293
- // We should move this portion of code that's calling
- // setAutoRevokeExemptedInternal() into the old PMS
- setAutoRevokeExemptedInternal(pkg,
- autoRevokePermissionsMode == AppOpsManager.MODE_IGNORED, userId);
- }
grantRequestedRuntimePermissionsInternal(pkg, params.getGrantedPermissions(), userId);
}
}
@@ -5182,25 +5213,6 @@
onPackageUninstalledInternal(packageName, appId, pkg, sharedUserPkgs, userIds);
}
- private boolean setAutoRevokeExemptedInternal(@NonNull AndroidPackage pkg, boolean exempted,
- @UserIdInt int userId) {
- final int packageUid = UserHandle.getUid(userId, pkg.getUid());
- if (mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_AUTO_REVOKE_MANAGED_BY_INSTALLER,
- packageUid, pkg.getPackageName()) != MODE_ALLOWED) {
- // Allowlist user set - don't override
- return false;
- }
-
- final long identity = Binder.clearCallingIdentity();
- try {
- mAppOpsManager.setMode(AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, packageUid,
- pkg.getPackageName(), exempted ? MODE_IGNORED : MODE_ALLOWED);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- return true;
- }
-
/**
* Callbacks invoked when interesting actions have been taken on a permission.
* <p>
@@ -5213,7 +5225,11 @@
public void onPermissionChanged() {}
public void onPermissionGranted(int uid, @UserIdInt int userId) {}
public void onInstallPermissionGranted() {}
- public void onPermissionRevoked(int uid, @UserIdInt int userId, String reason) {}
+ public void onPermissionRevoked(int uid, @UserIdInt int userId, String reason) {
+ onPermissionRevoked(uid, userId, reason, false);
+ }
+ public void onPermissionRevoked(int uid, @UserIdInt int userId, String reason,
+ boolean overrideKill) {}
public void onInstallPermissionRevoked() {}
public void onPermissionUpdated(@UserIdInt int[] updatedUserIds, boolean sync) {}
public void onPermissionUpdatedNotifyListener(@UserIdInt int[] updatedUserIds, boolean sync,
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java
index d2018f2..3771f03 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java
@@ -318,6 +318,15 @@
String reason);
/**
+ * Revoke the POST_NOTIFICATIONS permission, without killing the app. This method must ONLY BE
+ * USED in CTS or local tests.
+ *
+ * @param packageName The package to be revoked
+ * @param userId The user for which to revoke
+ */
+ void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId);
+
+ /**
* Get whether you should show UI with rationale for requesting a permission. You should do this
* only if you do not have the permission and the context in which the permission is requested
* does not clearly communicate to the user what would be the benefit from grating this
diff --git a/services/core/java/com/android/server/policy/PermissionPolicyInternal.java b/services/core/java/com/android/server/policy/PermissionPolicyInternal.java
index 6084c67..20b7ccd 100644
--- a/services/core/java/com/android/server/policy/PermissionPolicyInternal.java
+++ b/services/core/java/com/android/server/policy/PermissionPolicyInternal.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.app.TaskInfo;
import android.content.Intent;
/**
@@ -52,6 +53,25 @@
@Nullable String callingPackage);
/**
+ * Check whether a notification permission prompt should be shown for the given package. A
+ * prompt should be shown if the app targets S-, is currently running in a visible, focused
+ * task, has the REVIEW_REQUIRED flag set on its implicit notification permission, and has
+ * created at least one notification channel (even if it has since been deleted).
+ * @param packageName The package whose permission is being checked
+ * @param userId The user for whom the package is being started
+ * @param taskId The task the notification prompt should be attached to
+ */
+ public abstract void showNotificationPromptIfNeeded(@NonNull String packageName, int userId,
+ int taskId);
+
+ /**
+ * Determine if a particular task is in the proper state to show a system-triggered permission
+ * prompt. A prompt can be shown if the task is focused, visible, and running.
+ * @param taskInfo The task to be checked
+ */
+ public abstract boolean canShowPermissionPromptForTask(@Nullable TaskInfo taskInfo);
+
+ /**
* @return Whether the policy is initialized for a user.
*/
public abstract boolean isInitialized(@UserIdInt int userId);
diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java
index ad43514..c9a8701 100644
--- a/services/core/java/com/android/server/policy/PermissionPolicyService.java
+++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java
@@ -16,6 +16,7 @@
package com.android.server.policy;
+import static android.Manifest.permission.POST_NOTIFICATIONS;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_FOREGROUND;
import static android.app.AppOpsManager.MODE_IGNORED;
@@ -25,16 +26,24 @@
import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKED_COMPAT;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
+import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.app.ActivityOptions;
+import android.app.ActivityTaskManager;
import android.app.AppOpsManager;
import android.app.AppOpsManagerInternal;
+import android.app.TaskInfo;
+import android.app.compat.CompatChanges;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledSince;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -43,6 +52,7 @@
import android.content.pm.PackageManagerInternal.PackageListObserver;
import android.content.pm.PermissionInfo;
import android.os.Build;
+import android.os.Bundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -53,6 +63,7 @@
import android.telecom.TelecomManager;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.Log;
import android.util.LongSparseLongArray;
import android.util.Pair;
import android.util.Slog;
@@ -67,17 +78,21 @@
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import com.android.server.notification.NotificationManagerInternal;
import com.android.server.pm.UserManagerInternal;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback;
import com.android.server.utils.TimingsTraceAndSlog;
+import com.android.server.wm.ActivityInterceptorCallback;
+import com.android.server.wm.ActivityTaskManagerInternal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.concurrent.ExecutionException;
/**
@@ -89,11 +104,15 @@
*/
public final class PermissionPolicyService extends SystemService {
private static final String LOG_TAG = PermissionPolicyService.class.getSimpleName();
+ private static final String SYSTEM_PKG = "android";
private static final boolean DEBUG = false;
private static final long USER_SENSITIVE_UPDATE_DELAY_MS = 60000;
private final Object mLock = new Object();
+ @GuardedBy("mLock")
+ private boolean mBootCompleted = false;
+
private IAppOpsCallback mAppOpsCallback;
/** Whether the user is started but not yet stopped */
@@ -118,24 +137,39 @@
@GuardedBy("mLock")
private final SparseBooleanArray mIsUidSyncScheduled = new SparseBooleanArray();
+ /**
+ * This change reflects the presence of the new Notification Permission
+ */
+ @ChangeId
+ @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
+ private static final long NOTIFICATION_PERM_CHANGE_ID = 194833441L;
+
private List<String> mAppOpPermissions;
+ private Context mContext;
+ private PackageManagerInternal mPackageManagerInternal;
+ private NotificationManagerInternal mNotificationManager;
+ private PermissionManagerServiceInternal mPermissionManagerService;
+ private final PackageManager mPackageManager;
+
public PermissionPolicyService(@NonNull Context context) {
super(context);
+ mContext = context;
+ mPackageManager = context.getPackageManager();
LocalServices.addService(PermissionPolicyInternal.class, new Internal());
}
@Override
public void onStart() {
- final PackageManagerInternal packageManagerInternal = LocalServices.getService(
+ mPackageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
- final PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService(
+ PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService(
PermissionManagerServiceInternal.class);
final IAppOpsService appOpsService = IAppOpsService.Stub.asInterface(
ServiceManager.getService(Context.APP_OPS_SERVICE));
- packageManagerInternal.getPackageList(new PackageListObserver() {
+ mPackageManagerInternal.getPackageList(new PackageListObserver() {
@Override
public void onPackageAdded(String packageName, int uid) {
final int userId = UserHandle.getUserId(uid);
@@ -207,10 +241,10 @@
final PermissionInfo appOpPermissionInfo = appOpPermissionInfos.get(i);
switch (appOpPermissionInfo.name) {
- case android.Manifest.permission.ACCESS_NOTIFICATIONS:
- case android.Manifest.permission.MANAGE_IPSEC_TUNNELS:
+ case Manifest.permission.ACCESS_NOTIFICATIONS:
+ case Manifest.permission.MANAGE_IPSEC_TUNNELS:
continue;
- case android.Manifest.permission.REQUEST_INSTALL_PACKAGES:
+ case Manifest.permission.REQUEST_INSTALL_PACKAGES:
// Settings allows the user to control the app op if it's not in the default
// mode, regardless of whether the app has requested the permission, so we
// should not reset it.
@@ -251,7 +285,7 @@
}
int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
// If there is no valid package for the given UID, return immediately
- if (packageManagerInternal.getPackage(uid) == null) {
+ if (mPackageManagerInternal.getPackage(uid) == null) {
return;
}
@@ -343,6 +377,18 @@
}
}
}
+
+ if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
+ ((Internal) LocalServices.getService(PermissionPolicyInternal.class))
+ .onActivityManagerReady();
+ }
+
+ if (phase == SystemService.PHASE_BOOT_COMPLETED) {
+ synchronized (mLock) {
+ mBootCompleted = true;
+ }
+ }
+
}
/**
@@ -748,10 +794,12 @@
String permissionName = permissionInfo.name;
String packageName = packageInfo.packageName;
+ UserHandle user = UserHandle.getUserHandleForUid(packageInfo.applicationInfo.uid);
int permissionFlags = mPackageManager.getPermissionFlags(permissionName,
packageName, mContext.getUser());
boolean isReviewRequired = (permissionFlags & FLAG_PERMISSION_REVIEW_REQUIRED) != 0;
- if (isReviewRequired) {
+ if (isReviewRequired && !CompatChanges.isChangeEnabled(
+ NOTIFICATION_PERM_CHANGE_ID, packageName, user)) {
return;
}
@@ -953,6 +1001,33 @@
private class Internal extends PermissionPolicyInternal {
+ private ActivityInterceptorCallback mActivityInterceptorCallback =
+ new ActivityInterceptorCallback() {
+ @Nullable
+ @Override
+ public ActivityInterceptorCallback.ActivityInterceptResult intercept(
+ ActivityInterceptorInfo info) {
+ return null;
+ }
+
+ @Override
+ public void onActivityLaunched(TaskInfo taskInfo, ActivityInfo activityInfo) {
+ super.onActivityLaunched(taskInfo, activityInfo);
+ clearNotificationReviewFlagsIfNeeded(activityInfo.packageName,
+ UserHandle.of(taskInfo.userId));
+ showNotificationPromptIfNeeded(activityInfo.packageName,
+ taskInfo.userId, taskInfo.taskId);
+ }
+ };
+
+ private void onActivityManagerReady() {
+ ActivityTaskManagerInternal atm =
+ LocalServices.getService(ActivityTaskManagerInternal.class);
+ atm.registerActivityStartInterceptor(
+ ActivityInterceptorCallback.PERMISSION_POLICY_ORDERED_ID,
+ mActivityInterceptorCallback);
+ }
+
@Override
public boolean checkStartActivity(@NonNull Intent intent, int callingUid,
@Nullable String callingPackage) {
@@ -962,9 +1037,53 @@
+ callingPackage + " (uid=" + callingUid + ")");
return false;
}
+
+ if (PackageManager.ACTION_REQUEST_PERMISSIONS_FOR_OTHER.equals(intent.getAction())
+ && (callingUid != Process.SYSTEM_UID || !SYSTEM_PKG.equals(callingPackage))) {
+ return false;
+ }
+
return true;
}
+ public void showNotificationPromptIfNeeded(@NonNull String packageName, int userId,
+ int taskId) {
+ UserHandle user = UserHandle.of(userId);
+ if (packageName == null || taskId == ActivityTaskManager.INVALID_TASK_ID
+ || !shouldForceShowNotificationPermissionRequest(packageName, user)) {
+ return;
+ }
+
+ launchNotificationPermissionRequestDialog(packageName, user, taskId);
+ }
+
+ private void clearNotificationReviewFlagsIfNeeded(String packageName, UserHandle userId) {
+ if (!CompatChanges.isChangeEnabled(NOTIFICATION_PERM_CHANGE_ID, packageName, userId)) {
+ return;
+ }
+ mPackageManager.updatePermissionFlags(POST_NOTIFICATIONS, packageName,
+ FLAG_PERMISSION_REVIEW_REQUIRED, 0, userId);
+ }
+
+ private void launchNotificationPermissionRequestDialog(String pkgName, UserHandle user,
+ int taskId) {
+ Intent grantPermission = mPackageManager
+ .buildRequestPermissionsIntent(new String[] { POST_NOTIFICATIONS });
+ grantPermission.setAction(
+ PackageManager.ACTION_REQUEST_PERMISSIONS_FOR_OTHER);
+ grantPermission.putExtra(Intent.EXTRA_PACKAGE_NAME, pkgName);
+
+ ActivityOptions options = new ActivityOptions(new Bundle());
+ options.setTaskOverlay(true, false);
+ options.setLaunchTaskId(taskId);
+ try {
+ mContext.startActivityAsUser(grantPermission, options.toBundle(), user);
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "couldn't start grant permission dialog"
+ + "for other package " + pkgName, e);
+ }
+ }
+
@Override
public boolean isInitialized(int userId) {
return isStarted(userId);
@@ -977,6 +1096,12 @@
}
}
+ @Override
+ public boolean canShowPermissionPromptForTask(@Nullable TaskInfo taskInfo) {
+ return taskInfo != null && taskInfo.isFocused && taskInfo.isVisible
+ && taskInfo.isRunning;
+ }
+
/**
* Check if the intent action is removed for the calling package (often based on target SDK
* version). If the action is removed, we'll silently cancel the activity launch.
@@ -1010,5 +1135,49 @@
return false;
}
}
+
+ private boolean shouldForceShowNotificationPermissionRequest(@NonNull String pkgName,
+ @NonNull UserHandle user) {
+ AndroidPackage pkg = mPackageManagerInternal.getPackage(pkgName);
+ if (pkg == null || pkg.getPackageName() == null
+ || Objects.equals(pkgName, mPackageManager.getPermissionControllerPackageName())
+ || pkg.getTargetSdkVersion() < Build.VERSION_CODES.M) {
+ Slog.w(LOG_TAG, "Cannot check for Notification prompt, no package for "
+ + pkgName + " or pkg is Permission Controller");
+ return false;
+ }
+
+ synchronized (mLock) {
+ if (!mBootCompleted) {
+ return false;
+ }
+ }
+
+ try {
+ if (Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.NOTIFICATION_PERMISSION_ENABLED, UserHandle.USER_SYSTEM)
+ == 0) {
+ return false;
+ }
+ } catch (Settings.SettingNotFoundException e) {
+ return false;
+ }
+
+ if (!pkg.getRequestedPermissions().contains(POST_NOTIFICATIONS)
+ || CompatChanges.isChangeEnabled(NOTIFICATION_PERM_CHANGE_ID,
+ pkg.getPackageName(), user)) {
+ return false;
+ }
+
+ int uid = user.getUid(pkg.getUid());
+ if (mNotificationManager == null) {
+ mNotificationManager = LocalServices.getService(NotificationManagerInternal.class);
+ }
+ boolean hasCreatedNotificationChannels = mNotificationManager
+ .getNumNotificationChannelsForPackage(pkg.getPackageName(), uid, true) > 0;
+ boolean needsReview = (mPackageManager.getPermissionFlags(POST_NOTIFICATIONS, pkgName,
+ user) & FLAG_PERMISSION_REVIEW_REQUIRED) != 0;
+ return hasCreatedNotificationChannels && needsReview;
+ }
}
}
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index 70a804b..73ec2cd 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -545,7 +545,7 @@
/**
* Called when there has been user activity.
*/
- public void onUserActivity(int event, int uid) {
+ public void onUserActivity(int displayGroupId, int event, int uid) {
if (DEBUG) {
Slog.d(TAG, "onUserActivity: event=" + event + ", uid=" + uid);
}
@@ -560,7 +560,8 @@
if (!mUserActivityPending) {
mUserActivityPending = true;
Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY);
- msg.arg1 = event;
+ msg.arg1 = displayGroupId;
+ msg.arg2 = event;
msg.setAsynchronous(true);
mHandler.sendMessage(msg);
}
@@ -633,14 +634,15 @@
/**
* Called when the screen policy changes.
*/
- public void onScreenPolicyUpdate(int newPolicy) {
+ public void onScreenPolicyUpdate(int displayGroupId, int newPolicy) {
if (DEBUG) {
Slog.d(TAG, "onScreenPolicyUpdate: newPolicy=" + newPolicy);
}
synchronized (mLock) {
Message msg = mHandler.obtainMessage(MSG_SCREEN_POLICY);
- msg.arg1 = newPolicy;
+ msg.arg1 = displayGroupId;
+ msg.arg2 = newPolicy;
msg.setAsynchronous(true);
mHandler.sendMessage(msg);
}
@@ -675,7 +677,7 @@
mSuspendBlocker.release();
}
- private void sendUserActivity(int event) {
+ private void sendUserActivity(int displayGroupId, int event) {
synchronized (mLock) {
if (!mUserActivityPending) {
return;
@@ -686,7 +688,7 @@
tm.notifyUserActivity();
mPolicy.userActivity();
mFaceDownDetector.userActivity(event);
- mScreenUndimDetector.userActivity();
+ mScreenUndimDetector.userActivity(displayGroupId);
}
void postEnhancedDischargePredictionBroadcast(long delayMs) {
@@ -840,8 +842,8 @@
mSuspendBlocker.release();
}
- private void screenPolicyChanging(int screenPolicy) {
- mScreenUndimDetector.recordScreenPolicy(screenPolicy);
+ private void screenPolicyChanging(int displayGroupId, int screenPolicy) {
+ mScreenUndimDetector.recordScreenPolicy(displayGroupId, screenPolicy);
}
private void lockProfile(@UserIdInt int userId) {
@@ -866,7 +868,7 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_USER_ACTIVITY:
- sendUserActivity(msg.arg1);
+ sendUserActivity(msg.arg1, msg.arg2);
break;
case MSG_BROADCAST:
sendNextBroadcast();
@@ -885,7 +887,7 @@
showWiredChargingStarted(msg.arg1);
break;
case MSG_SCREEN_POLICY:
- screenPolicyChanging(msg.arg1);
+ screenPolicyChanging(msg.arg1, msg.arg2);
break;
}
}
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 1455326..4b2770c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -49,6 +49,7 @@
import android.database.ContentObserver;
import android.hardware.SensorManager;
import android.hardware.SystemSensorManager;
+import android.hardware.devicestate.DeviceStateManager;
import android.hardware.display.AmbientDisplayConfiguration;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
@@ -60,6 +61,7 @@
import android.os.BatterySaverPolicyConfig;
import android.os.Binder;
import android.os.Handler;
+import android.os.HandlerExecutor;
import android.os.IBinder;
import android.os.IPowerManager;
import android.os.Looper;
@@ -1151,6 +1153,9 @@
PowerManager.GO_TO_SLEEP_REASON_QUIESCENT,
PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE, Process.SYSTEM_UID);
}
+
+ mContext.getSystemService(DeviceStateManager.class).registerCallback(
+ new HandlerExecutor(mHandler), new DeviceStateListener());
}
}
}
@@ -1792,7 +1797,7 @@
mLastInteractivePowerHintTime = eventTime;
}
- mNotifier.onUserActivity(event, uid);
+ mNotifier.onUserActivity(powerGroup.getGroupId(), event, uid);
mAttentionDetector.onUserActivity(eventTime, event);
if (mUserInactiveOverrideFromWindowManager) {
@@ -3372,7 +3377,7 @@
final boolean ready = mDisplayManagerInternal.requestPowerState(groupId,
displayPowerRequest, mRequestWaitForNegativeProximity);
- mNotifier.onScreenPolicyUpdate(displayPowerRequest.policy);
+ mNotifier.onScreenPolicyUpdate(groupId, displayPowerRequest.policy);
if (DEBUG_SPEW) {
Slog.d(TAG, "updateDisplayPowerStateLocked: displayReady=" + ready
@@ -6349,4 +6354,25 @@
return interceptPowerKeyDownInternal(event);
}
}
+
+ /**
+ * Listens to changes in device state and updates the interactivity time.
+ * Any changes to the device state are treated as user interactions.
+ */
+ class DeviceStateListener implements DeviceStateManager.DeviceStateCallback {
+ private int mDeviceState = DeviceStateManager.INVALID_DEVICE_STATE;
+
+ @Override
+ public void onStateChanged(int deviceState) {
+ if (mDeviceState != deviceState) {
+ mDeviceState = deviceState;
+ // Device-state interactions are applied to the default display so that they
+ // are reflected only with the default power group.
+ userActivityInternal(Display.DEFAULT_DISPLAY, mClock.uptimeMillis(),
+ PowerManager.USER_ACTIVITY_EVENT_DEVICE_STATE, /* flags= */0,
+ Process.SYSTEM_UID);
+ }
+ }
+ };
+
}
diff --git a/services/core/java/com/android/server/power/ScreenUndimDetector.java b/services/core/java/com/android/server/power/ScreenUndimDetector.java
index 951bc1f..c4929c2 100644
--- a/services/core/java/com/android/server/power/ScreenUndimDetector.java
+++ b/services/core/java/com/android/server/power/ScreenUndimDetector.java
@@ -28,6 +28,7 @@
import android.os.SystemClock;
import android.provider.DeviceConfig;
import android.util.Slog;
+import android.view.Display;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
@@ -123,8 +124,8 @@
* Launches a message that figures out the screen transitions and detects user undims. Must be
* called by the parent that is trying to update the screen policy.
*/
- public void recordScreenPolicy(int newPolicy) {
- if (newPolicy == mCurrentScreenPolicy) {
+ public void recordScreenPolicy(int displayGroupId, int newPolicy) {
+ if (displayGroupId != Display.DEFAULT_DISPLAY_GROUP || newPolicy == mCurrentScreenPolicy) {
return;
}
@@ -268,7 +269,10 @@
* The user interacted with the screen after an undim, indicating the phone is in use.
* We use this event for logging.
*/
- public void userActivity() {
+ public void userActivity(int displayGroupId) {
+ if (displayGroupId != Display.DEFAULT_DISPLAY) {
+ return;
+ }
if (mUndimOccurredTime != 1 && mInteractionAfterUndimTime == -1) {
mInteractionAfterUndimTime = mClock.getCurrentTime();
}
diff --git a/services/core/java/com/android/server/powerstats/PowerStatsLogger.java b/services/core/java/com/android/server/powerstats/PowerStatsLogger.java
index ef0079e..ca67597 100644
--- a/services/core/java/com/android/server/powerstats/PowerStatsLogger.java
+++ b/services/core/java/com/android/server/powerstats/PowerStatsLogger.java
@@ -35,7 +35,6 @@
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
-
import com.android.server.powerstats.PowerStatsHALWrapper.IPowerStatsHALWrapper;
import com.android.server.powerstats.ProtoStreamUtils.ChannelUtils;
import com.android.server.powerstats.ProtoStreamUtils.EnergyConsumerResultUtils;
@@ -313,12 +312,12 @@
return mStartWallTime;
}
- public PowerStatsLogger(Context context, File dataStoragePath,
+ public PowerStatsLogger(Context context, Looper looper, File dataStoragePath,
String meterFilename, String meterCacheFilename,
String modelFilename, String modelCacheFilename,
String residencyFilename, String residencyCacheFilename,
IPowerStatsHALWrapper powerStatsHALWrapper) {
- super(Looper.getMainLooper());
+ super(looper);
mStartWallTime = currentTimeMillis() - SystemClock.elapsedRealtime();
if (DEBUG) Slog.d(TAG, "mStartWallTime: " + mStartWallTime);
mPowerStatsHALWrapper = powerStatsHALWrapper;
diff --git a/services/core/java/com/android/server/powerstats/PowerStatsService.java b/services/core/java/com/android/server/powerstats/PowerStatsService.java
index bb52c1d..9953ca8 100644
--- a/services/core/java/com/android/server/powerstats/PowerStatsService.java
+++ b/services/core/java/com/android/server/powerstats/PowerStatsService.java
@@ -28,6 +28,7 @@
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
+import android.os.Looper;
import android.os.UserHandle;
import android.power.PowerStatsInternal;
import android.util.Slog;
@@ -79,6 +80,9 @@
private StatsPullAtomCallbackImpl mPullAtomCallback;
@Nullable
private PowerStatsInternal mPowerStatsInternal;
+ @Nullable
+ @GuardedBy("this")
+ private Looper mLooper;
@VisibleForTesting
static class Injector {
@@ -127,12 +131,12 @@
}
}
- PowerStatsLogger createPowerStatsLogger(Context context, File dataStoragePath,
- String meterFilename, String meterCacheFilename,
+ PowerStatsLogger createPowerStatsLogger(Context context, Looper looper,
+ File dataStoragePath, String meterFilename, String meterCacheFilename,
String modelFilename, String modelCacheFilename,
String residencyFilename, String residencyCacheFilename,
IPowerStatsHALWrapper powerStatsHALWrapper) {
- return new PowerStatsLogger(context, dataStoragePath,
+ return new PowerStatsLogger(context, looper, dataStoragePath,
meterFilename, meterCacheFilename,
modelFilename, modelCacheFilename,
residencyFilename, residencyCacheFilename,
@@ -229,11 +233,11 @@
mDataStoragePath = mInjector.createDataStoragePath();
// Only start logger and triggers if initialization is successful.
- mPowerStatsLogger = mInjector.createPowerStatsLogger(mContext, mDataStoragePath,
- mInjector.createMeterFilename(), mInjector.createMeterCacheFilename(),
- mInjector.createModelFilename(), mInjector.createModelCacheFilename(),
- mInjector.createResidencyFilename(), mInjector.createResidencyCacheFilename(),
- getPowerStatsHal());
+ mPowerStatsLogger = mInjector.createPowerStatsLogger(mContext, getLooper(),
+ mDataStoragePath, mInjector.createMeterFilename(),
+ mInjector.createMeterCacheFilename(), mInjector.createModelFilename(),
+ mInjector.createModelCacheFilename(), mInjector.createResidencyFilename(),
+ mInjector.createResidencyCacheFilename(), getPowerStatsHal());
mBatteryTrigger = mInjector.createBatteryTrigger(mContext, mPowerStatsLogger);
mTimerTrigger = mInjector.createTimerTrigger(mContext, mPowerStatsLogger);
} else {
@@ -245,6 +249,17 @@
return mInjector.getPowerStatsHALWrapperImpl();
}
+ private Looper getLooper() {
+ synchronized (this) {
+ if (mLooper == null) {
+ HandlerThread thread = new HandlerThread(TAG);
+ thread.start();
+ return thread.getLooper();
+ }
+ return mLooper;
+ }
+ }
+
public PowerStatsService(Context context) {
this(context, new Injector());
}
@@ -260,9 +275,7 @@
private final Handler mHandler;
LocalService() {
- HandlerThread thread = new HandlerThread(TAG);
- thread.start();
- mHandler = new Handler(thread.getLooper());
+ mHandler = new Handler(getLooper());
}
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index b1cc517..7f50cd6 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -28,18 +28,11 @@
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.NetworkIdentity.OEM_PAID;
import static android.net.NetworkIdentity.OEM_PRIVATE;
-import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
-import static android.net.NetworkStats.METERED_ALL;
import static android.net.NetworkStats.METERED_YES;
-import static android.net.NetworkStats.ROAMING_ALL;
import static android.net.NetworkTemplate.MATCH_ETHERNET;
-import static android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD;
-import static android.net.NetworkTemplate.MATCH_WIFI_WILDCARD;
-import static android.net.NetworkTemplate.NETWORK_TYPE_ALL;
+import static android.net.NetworkTemplate.MATCH_MOBILE;
+import static android.net.NetworkTemplate.MATCH_WIFI;
import static android.net.NetworkTemplate.OEM_MANAGED_ALL;
-import static android.net.NetworkTemplate.buildTemplateMobileWildcard;
-import static android.net.NetworkTemplate.buildTemplateMobileWithRatType;
-import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
import static android.net.NetworkTemplate.getAllCollapsedRatTypes;
import static android.os.Debug.getIonHeapsSizeKb;
import static android.os.Process.LAST_SHARED_APPLICATION_GID;
@@ -1179,9 +1172,10 @@
}
case FrameworkStatsLog.BYTES_TRANSFER_BY_TAG_AND_METERED: {
final NetworkStats wifiStats = getUidNetworkStatsSnapshotForTemplate(
- buildTemplateWifiWildcard(), /*includeTags=*/true);
+ new NetworkTemplate.Builder(MATCH_WIFI).build(), /*includeTags=*/true);
final NetworkStats cellularStats = getUidNetworkStatsSnapshotForTemplate(
- buildTemplateMobileWildcard(), /*includeTags=*/true);
+ new NetworkTemplate.Builder(MATCH_MOBILE)
+ .setMeteredness(METERED_YES).build(), /*includeTags=*/true);
if (wifiStats != null && cellularStats != null) {
final NetworkStats stats = wifiStats.add(cellularStats);
ret.add(new NetworkStatsExt(sliceNetworkStatsByUidTagAndMetered(stats),
@@ -1333,8 +1327,8 @@
@NonNull private List<NetworkStatsExt> getDataUsageBytesTransferSnapshotForOemManaged() {
final List<Pair<Integer, Integer>> matchRulesAndTransports = List.of(
new Pair(MATCH_ETHERNET, TRANSPORT_ETHERNET),
- new Pair(MATCH_MOBILE_WILDCARD, TRANSPORT_CELLULAR),
- new Pair(MATCH_WIFI_WILDCARD, TRANSPORT_WIFI)
+ new Pair(MATCH_MOBILE, TRANSPORT_CELLULAR),
+ new Pair(MATCH_WIFI, TRANSPORT_WIFI)
);
final int[] oemManagedTypes = new int[] {OEM_PAID | OEM_PRIVATE, OEM_PAID, OEM_PRIVATE};
@@ -1343,12 +1337,11 @@
for (Pair<Integer, Integer> ruleAndTransport : matchRulesAndTransports) {
final Integer matchRule = ruleAndTransport.first;
for (final int oemManaged : oemManagedTypes) {
- /* A null subscriberId will set wildcard=true, since we aren't trying to select a
- specific ssid or subscriber. */
- final NetworkTemplate template = new NetworkTemplate(matchRule,
- /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null,
- METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL,
- oemManaged);
+ // Subscriber Ids and Wifi Network Keys will not be set since the purpose is to
+ // slice statistics of different OEM managed networks among all network types.
+ // Thus, specifying networks through their identifiers are not needed.
+ final NetworkTemplate template = new NetworkTemplate.Builder(matchRule)
+ .setOemManaged(oemManaged).build();
final NetworkStats stats = getUidNetworkStatsSnapshotForTemplate(template, false);
final Integer transport = ruleAndTransport.second;
if (stats != null) {
@@ -1367,10 +1360,18 @@
* Create a snapshot of NetworkStats for a given transport.
*/
@Nullable private NetworkStats getUidNetworkStatsSnapshotForTransport(int transport) {
- final NetworkTemplate template = (transport == TRANSPORT_CELLULAR)
- ? NetworkTemplate.buildTemplateMobileWithRatType(
- /*subscriptionId=*/null, NETWORK_TYPE_ALL, METERED_YES)
- : NetworkTemplate.buildTemplateWifiWildcard();
+ NetworkTemplate template = null;
+ switch (transport) {
+ case TRANSPORT_CELLULAR:
+ template = new NetworkTemplate.Builder(MATCH_MOBILE)
+ .setMeteredness(METERED_YES).build();
+ break;
+ case TRANSPORT_WIFI:
+ template = new NetworkTemplate.Builder(MATCH_WIFI).build();
+ break;
+ default:
+ Log.wtf(TAG, "Unexpected transport.");
+ }
return getUidNetworkStatsSnapshotForTemplate(template, /*includeTags=*/false);
}
@@ -1409,8 +1410,10 @@
final List<NetworkStatsExt> ret = new ArrayList<>();
for (final int ratType : getAllCollapsedRatTypes()) {
final NetworkTemplate template =
- buildTemplateMobileWithRatType(subInfo.subscriberId, ratType,
- METERED_YES);
+ new NetworkTemplate.Builder(MATCH_MOBILE)
+ .setSubscriberIds(Set.of(subInfo.subscriberId))
+ .setRatType(ratType)
+ .setMeteredness(METERED_YES).build();
final NetworkStats stats =
getUidNetworkStatsSnapshotForTemplate(template, /*includeTags=*/false);
if (stats != null) {
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index cdab91b..411f3dc 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -136,7 +136,8 @@
@Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName);
/** @see com.android.internal.statusbar.IStatusBar#showTransient */
- void showTransient(int displayId, @InternalInsetsType int[] types);
+ void showTransient(int displayId, @InternalInsetsType int[] types,
+ boolean isGestureOnSystemBar);
/** @see com.android.internal.statusbar.IStatusBar#abortTransient */
void abortTransient(int displayId, @InternalInsetsType int[] types);
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 54ec884..17f5566 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -567,11 +567,12 @@
}
@Override
- public void showTransient(int displayId, @InternalInsetsType int[] types) {
+ public void showTransient(int displayId, @InternalInsetsType int[] types,
+ boolean isGestureOnSystemBar) {
getUiState(displayId).showTransient(types);
if (mBar != null) {
try {
- mBar.showTransient(displayId, types);
+ mBar.showTransient(displayId, types, isGestureOnSystemBar);
} catch (RemoteException ex) { }
}
}
diff --git a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
index a31c56a..a17e792 100644
--- a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
+++ b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
@@ -21,6 +21,7 @@
import static android.telephony.CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+import static android.telephony.TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -38,15 +39,19 @@
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
+import android.telephony.TelephonyManager.CarrierPrivilegesListener;
import android.util.ArrayMap;
import android.util.ArraySet;
+import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.util.IndentingPrintWriter;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -92,6 +97,10 @@
@NonNull private final Map<Integer, Integer> mReadySubIdsBySlotId = new HashMap<>();
@NonNull private final OnSubscriptionsChangedListener mSubscriptionChangedListener;
+ @NonNull
+ private final List<CarrierPrivilegesListener> mCarrierPrivilegesChangedListeners =
+ new ArrayList<>();
+
@NonNull private TelephonySubscriptionSnapshot mCurrentSnapshot;
public TelephonySubscriptionTracker(
@@ -126,22 +135,71 @@
};
}
- /** Registers the receivers, and starts tracking subscriptions. */
+ /**
+ * Registers the receivers, and starts tracking subscriptions.
+ *
+ * <p>Must always be run on the VcnManagementService thread.
+ */
public void register() {
final HandlerExecutor executor = new HandlerExecutor(mHandler);
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(ACTION_CARRIER_CONFIG_CHANGED);
+ filter.addAction(ACTION_MULTI_SIM_CONFIG_CHANGED);
- mContext.registerReceiver(
- this, new IntentFilter(ACTION_CARRIER_CONFIG_CHANGED), null, mHandler);
+ mContext.registerReceiver(this, filter, null, mHandler);
mSubscriptionManager.addOnSubscriptionsChangedListener(
executor, mSubscriptionChangedListener);
mTelephonyManager.registerTelephonyCallback(executor, mActiveDataSubIdListener);
+
+ registerCarrierPrivilegesListeners();
}
- /** Unregisters the receivers, and stops tracking subscriptions. */
+ private void registerCarrierPrivilegesListeners() {
+ final HandlerExecutor executor = new HandlerExecutor(mHandler);
+ final int modemCount = mTelephonyManager.getActiveModemCount();
+ try {
+ for (int i = 0; i < modemCount; i++) {
+ CarrierPrivilegesListener carrierPrivilegesListener =
+ new CarrierPrivilegesListener() {
+ @Override
+ public void onCarrierPrivilegesChanged(
+ @NonNull List<String> privilegedPackageNames,
+ @NonNull int[] privilegedUids) {
+ // Re-trigger the synchronous check (which is also very cheap due
+ // to caching in CarrierPrivilegesTracker). This allows consistency
+ // with the onSubscriptionsChangedListener and broadcasts.
+ handleSubscriptionsChanged();
+ }
+ };
+
+ mTelephonyManager.addCarrierPrivilegesListener(
+ i, executor, carrierPrivilegesListener);
+ mCarrierPrivilegesChangedListeners.add(carrierPrivilegesListener);
+ }
+ } catch (IllegalArgumentException e) {
+ Slog.wtf(TAG, "Encounted exception registering carrier privileges listeners", e);
+ }
+ }
+
+ /**
+ * Unregisters the receivers, and stops tracking subscriptions.
+ *
+ * <p>Must always be run on the VcnManagementService thread.
+ */
public void unregister() {
mContext.unregisterReceiver(this);
mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionChangedListener);
mTelephonyManager.unregisterTelephonyCallback(mActiveDataSubIdListener);
+
+ unregisterCarrierPrivilegesListeners();
+ }
+
+ private void unregisterCarrierPrivilegesListeners() {
+ for (CarrierPrivilegesListener carrierPrivilegesListener :
+ mCarrierPrivilegesChangedListeners) {
+ mTelephonyManager.removeCarrierPrivilegesListener(carrierPrivilegesListener);
+ }
+ mCarrierPrivilegesChangedListeners.clear();
}
/**
@@ -178,8 +236,6 @@
// group.
if (subInfo.getSimSlotIndex() != INVALID_SIM_SLOT_INDEX
&& mReadySubIdsBySlotId.values().contains(subInfo.getSubscriptionId())) {
- // TODO (b/172619301): Cache based on callbacks from CarrierPrivilegesTracker
-
final TelephonyManager subIdSpecificTelephonyManager =
mTelephonyManager.createForSubscriptionId(subInfo.getSubscriptionId());
@@ -214,12 +270,39 @@
*/
@Override
public void onReceive(Context context, Intent intent) {
- // Accept sticky broadcasts; if CARRIER_CONFIG_CHANGED was previously broadcast and it
- // already was for an identified carrier, we can stop waiting for initial load to complete
- if (!ACTION_CARRIER_CONFIG_CHANGED.equals(intent.getAction())) {
- return;
+ switch (intent.getAction()) {
+ case ACTION_CARRIER_CONFIG_CHANGED:
+ handleActionCarrierConfigChanged(context, intent);
+ break;
+ case ACTION_MULTI_SIM_CONFIG_CHANGED:
+ handleActionMultiSimConfigChanged(context, intent);
+ break;
+ default:
+ Slog.v(TAG, "Unknown intent received with action: " + intent.getAction());
+ }
+ }
+
+ private void handleActionMultiSimConfigChanged(Context context, Intent intent) {
+ unregisterCarrierPrivilegesListeners();
+
+ // Clear invalid slotIds from the mReadySubIdsBySlotId map.
+ final int modemCount = mTelephonyManager.getActiveModemCount();
+ final Iterator<Integer> slotIdIterator = mReadySubIdsBySlotId.keySet().iterator();
+ while (slotIdIterator.hasNext()) {
+ final int slotId = slotIdIterator.next();
+
+ if (slotId >= modemCount) {
+ slotIdIterator.remove();
+ }
}
+ registerCarrierPrivilegesListeners();
+ handleSubscriptionsChanged();
+ }
+
+ private void handleActionCarrierConfigChanged(Context context, Intent intent) {
+ // Accept sticky broadcasts; if CARRIER_CONFIG_CHANGED was previously broadcast and it
+ // already was for an identified carrier, we can stop waiting for initial load to complete
final int subId = intent.getIntExtra(EXTRA_SUBSCRIPTION_INDEX, INVALID_SUBSCRIPTION_ID);
final int slotId = intent.getIntExtra(EXTRA_SLOT_INDEX, INVALID_SIM_SLOT_INDEX);
diff --git a/services/core/java/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java b/services/core/java/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java
index 4576957..6db25b7 100644
--- a/services/core/java/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java
+++ b/services/core/java/com/android/server/vcn/routeselection/NetworkPriorityClassifier.java
@@ -20,8 +20,10 @@
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_TEST;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
-import static android.net.vcn.VcnUnderlyingNetworkPriority.NETWORK_QUALITY_ANY;
-import static android.net.vcn.VcnUnderlyingNetworkPriority.NETWORK_QUALITY_OK;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_FORBIDDEN;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_REQUIRED;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.NETWORK_QUALITY_ANY;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.NETWORK_QUALITY_OK;
import static com.android.server.VcnManagementService.LOCAL_LOG;
@@ -29,10 +31,10 @@
import android.annotation.Nullable;
import android.net.NetworkCapabilities;
import android.net.TelephonyNetworkSpecifier;
-import android.net.vcn.VcnCellUnderlyingNetworkPriority;
+import android.net.vcn.VcnCellUnderlyingNetworkTemplate;
import android.net.vcn.VcnManager;
-import android.net.vcn.VcnUnderlyingNetworkPriority;
-import android.net.vcn.VcnWifiUnderlyingNetworkPriority;
+import android.net.vcn.VcnUnderlyingNetworkTemplate;
+import android.net.vcn.VcnWifiUnderlyingNetworkTemplate;
import android.os.ParcelUuid;
import android.os.PersistableBundle;
import android.telephony.SubscriptionManager;
@@ -44,7 +46,7 @@
import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot;
import com.android.server.vcn.VcnContext;
-import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Set;
/** @hide */
@@ -76,7 +78,7 @@
public static int calculatePriorityClass(
VcnContext vcnContext,
UnderlyingNetworkRecord networkRecord,
- LinkedHashSet<VcnUnderlyingNetworkPriority> underlyingNetworkPriorities,
+ List<VcnUnderlyingNetworkTemplate> underlyingNetworkTemplates,
ParcelUuid subscriptionGroup,
TelephonySubscriptionSnapshot snapshot,
UnderlyingNetworkRecord currentlySelected,
@@ -94,7 +96,7 @@
}
int priorityIndex = 0;
- for (VcnUnderlyingNetworkPriority nwPriority : underlyingNetworkPriorities) {
+ for (VcnUnderlyingNetworkTemplate nwPriority : underlyingNetworkTemplates) {
if (checkMatchesPriorityRule(
vcnContext,
nwPriority,
@@ -113,7 +115,7 @@
@VisibleForTesting(visibility = Visibility.PRIVATE)
public static boolean checkMatchesPriorityRule(
VcnContext vcnContext,
- VcnUnderlyingNetworkPriority networkPriority,
+ VcnUnderlyingNetworkTemplate networkPriority,
UnderlyingNetworkRecord networkRecord,
ParcelUuid subscriptionGroup,
TelephonySubscriptionSnapshot snapshot,
@@ -122,7 +124,11 @@
// TODO: Check Network Quality reported by metric monitors/probers.
final NetworkCapabilities caps = networkRecord.networkCapabilities;
- if (!networkPriority.allowMetered() && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)) {
+
+ final int meteredMatch = networkPriority.getMetered();
+ final boolean isMetered = !caps.hasCapability(NET_CAPABILITY_NOT_METERED);
+ if (meteredMatch == MATCH_REQUIRED && !isMetered
+ || meteredMatch == MATCH_FORBIDDEN && isMetered) {
return false;
}
@@ -130,32 +136,32 @@
return true;
}
- if (networkPriority instanceof VcnWifiUnderlyingNetworkPriority) {
+ if (networkPriority instanceof VcnWifiUnderlyingNetworkTemplate) {
return checkMatchesWifiPriorityRule(
- (VcnWifiUnderlyingNetworkPriority) networkPriority,
+ (VcnWifiUnderlyingNetworkTemplate) networkPriority,
networkRecord,
currentlySelected,
carrierConfig);
}
- if (networkPriority instanceof VcnCellUnderlyingNetworkPriority) {
+ if (networkPriority instanceof VcnCellUnderlyingNetworkTemplate) {
return checkMatchesCellPriorityRule(
vcnContext,
- (VcnCellUnderlyingNetworkPriority) networkPriority,
+ (VcnCellUnderlyingNetworkTemplate) networkPriority,
networkRecord,
subscriptionGroup,
snapshot);
}
logWtf(
- "Got unknown VcnUnderlyingNetworkPriority class: "
+ "Got unknown VcnUnderlyingNetworkTemplate class: "
+ networkPriority.getClass().getSimpleName());
return false;
}
@VisibleForTesting(visibility = Visibility.PRIVATE)
public static boolean checkMatchesWifiPriorityRule(
- VcnWifiUnderlyingNetworkPriority networkPriority,
+ VcnWifiUnderlyingNetworkTemplate networkPriority,
UnderlyingNetworkRecord networkRecord,
UnderlyingNetworkRecord currentlySelected,
PersistableBundle carrierConfig) {
@@ -171,7 +177,8 @@
return false;
}
- if (networkPriority.getSsid() != null && networkPriority.getSsid() != caps.getSsid()) {
+ if (!networkPriority.getSsids().isEmpty()
+ && !networkPriority.getSsids().contains(caps.getSsid())) {
return false;
}
@@ -202,7 +209,7 @@
@VisibleForTesting(visibility = Visibility.PRIVATE)
public static boolean checkMatchesCellPriorityRule(
VcnContext vcnContext,
- VcnCellUnderlyingNetworkPriority networkPriority,
+ VcnCellUnderlyingNetworkTemplate networkPriority,
UnderlyingNetworkRecord networkRecord,
ParcelUuid subscriptionGroup,
TelephonySubscriptionSnapshot snapshot) {
@@ -226,26 +233,31 @@
.getSystemService(TelephonyManager.class)
.createForSubscriptionId(subId);
- if (!networkPriority.getAllowedOperatorPlmnIds().isEmpty()) {
+ if (!networkPriority.getOperatorPlmnIds().isEmpty()) {
final String plmnId = subIdSpecificTelephonyMgr.getNetworkOperator();
- if (!networkPriority.getAllowedOperatorPlmnIds().contains(plmnId)) {
+ if (!networkPriority.getOperatorPlmnIds().contains(plmnId)) {
return false;
}
}
- if (!networkPriority.getAllowedSpecificCarrierIds().isEmpty()) {
+ if (!networkPriority.getSimSpecificCarrierIds().isEmpty()) {
final int carrierId = subIdSpecificTelephonyMgr.getSimSpecificCarrierId();
- if (!networkPriority.getAllowedSpecificCarrierIds().contains(carrierId)) {
+ if (!networkPriority.getSimSpecificCarrierIds().contains(carrierId)) {
return false;
}
}
- if (!networkPriority.allowRoaming() && !caps.hasCapability(NET_CAPABILITY_NOT_ROAMING)) {
+ final int roamingMatch = networkPriority.getRoaming();
+ final boolean isRoaming = !caps.hasCapability(NET_CAPABILITY_NOT_ROAMING);
+ if (roamingMatch == MATCH_REQUIRED && !isRoaming
+ || roamingMatch == MATCH_FORBIDDEN && isRoaming) {
return false;
}
- if (networkPriority.requireOpportunistic()) {
- if (!isOpportunistic(snapshot, caps.getSubscriptionIds())) {
+ final int opportunisticMatch = networkPriority.getOpportunistic();
+ final boolean isOpportunistic = isOpportunistic(snapshot, caps.getSubscriptionIds());
+ if (opportunisticMatch == MATCH_REQUIRED) {
+ if (!isOpportunistic) {
return false;
}
@@ -265,6 +277,8 @@
.contains(SubscriptionManager.getActiveDataSubscriptionId())) {
return false;
}
+ } else if (opportunisticMatch == MATCH_FORBIDDEN && !isOpportunistic) {
+ return false;
}
return true;
diff --git a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkController.java b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkController.java
index cd124ee..ca2e449 100644
--- a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkController.java
+++ b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkController.java
@@ -33,7 +33,7 @@
import android.net.NetworkRequest;
import android.net.TelephonyNetworkSpecifier;
import android.net.vcn.VcnGatewayConnectionConfig;
-import android.net.vcn.VcnUnderlyingNetworkPriority;
+import android.net.vcn.VcnUnderlyingNetworkTemplate;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.ParcelUuid;
@@ -498,10 +498,10 @@
pw.println(
"Currently selected: " + (mCurrentRecord == null ? null : mCurrentRecord.network));
- pw.println("VcnUnderlyingNetworkPriority list:");
+ pw.println("VcnUnderlyingNetworkTemplate list:");
pw.increaseIndent();
int index = 0;
- for (VcnUnderlyingNetworkPriority priority :
+ for (VcnUnderlyingNetworkTemplate priority :
mConnectionConfig.getVcnUnderlyingNetworkPriorities()) {
pw.println("Priority index: " + index);
priority.dump(pw);
diff --git a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkRecord.java b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkRecord.java
index 27ba854..c0488b1 100644
--- a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkRecord.java
+++ b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkRecord.java
@@ -21,7 +21,7 @@
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
-import android.net.vcn.VcnUnderlyingNetworkPriority;
+import android.net.vcn.VcnUnderlyingNetworkTemplate;
import android.os.ParcelUuid;
import android.os.PersistableBundle;
@@ -32,7 +32,7 @@
import com.android.server.vcn.VcnContext;
import java.util.Comparator;
-import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Objects;
/**
@@ -77,7 +77,7 @@
static Comparator<UnderlyingNetworkRecord> getComparator(
VcnContext vcnContext,
- LinkedHashSet<VcnUnderlyingNetworkPriority> underlyingNetworkPriorities,
+ List<VcnUnderlyingNetworkTemplate> underlyingNetworkTemplates,
ParcelUuid subscriptionGroup,
TelephonySubscriptionSnapshot snapshot,
UnderlyingNetworkRecord currentlySelected,
@@ -87,7 +87,7 @@
NetworkPriorityClassifier.calculatePriorityClass(
vcnContext,
left,
- underlyingNetworkPriorities,
+ underlyingNetworkTemplates,
subscriptionGroup,
snapshot,
currentlySelected,
@@ -96,7 +96,7 @@
NetworkPriorityClassifier.calculatePriorityClass(
vcnContext,
right,
- underlyingNetworkPriorities,
+ underlyingNetworkTemplates,
subscriptionGroup,
snapshot,
currentlySelected,
@@ -133,7 +133,7 @@
void dump(
VcnContext vcnContext,
IndentingPrintWriter pw,
- LinkedHashSet<VcnUnderlyingNetworkPriority> underlyingNetworkPriorities,
+ List<VcnUnderlyingNetworkTemplate> underlyingNetworkTemplates,
ParcelUuid subscriptionGroup,
TelephonySubscriptionSnapshot snapshot,
UnderlyingNetworkRecord currentlySelected,
@@ -145,7 +145,7 @@
NetworkPriorityClassifier.calculatePriorityClass(
vcnContext,
this,
- underlyingNetworkPriorities,
+ underlyingNetworkTemplates,
subscriptionGroup,
snapshot,
currentlySelected,
diff --git a/services/core/java/com/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter.java b/services/core/java/com/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter.java
index 0690d3b..8189e74 100644
--- a/services/core/java/com/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter.java
+++ b/services/core/java/com/android/server/vibrator/ClippingAmplitudeAndFrequencyAdapter.java
@@ -21,18 +21,16 @@
import android.os.vibrator.StepSegment;
import android.os.vibrator.VibrationEffectSegment;
import android.util.MathUtils;
+import android.util.Range;
import java.util.List;
/**
- * Adapter that clips frequency values to {@link VibratorInfo#getFrequencyRange()} and
+ * Adapter that clips frequency values to {@link VibratorInfo#getFrequencyRangeHz()} and
* amplitude values to respective {@link VibratorInfo#getMaxAmplitude}.
*
- * <p>Devices with no frequency control will collapse all frequencies to zero and leave
- * amplitudes unchanged.
- *
- * <p>The frequency value returned in segments will be absolute, converted with
- * {@link VibratorInfo#getAbsoluteFrequency(float)}.
+ * <p>Devices with no frequency control will collapse all frequencies to the resonant frequency and
+ * leave amplitudes unchanged.
*/
final class ClippingAmplitudeAndFrequencyAdapter
implements VibrationEffectAdapters.SegmentsAdapter<VibratorInfo> {
@@ -52,29 +50,39 @@
}
private StepSegment apply(StepSegment segment, VibratorInfo info) {
- float clampedFrequency = clampFrequency(info, segment.getFrequency());
+ float clampedFrequency = clampFrequency(info, segment.getFrequencyHz());
return new StepSegment(
clampAmplitude(info, clampedFrequency, segment.getAmplitude()),
- info.getAbsoluteFrequency(clampedFrequency),
+ clampedFrequency,
(int) segment.getDuration());
}
private RampSegment apply(RampSegment segment, VibratorInfo info) {
- float clampedStartFrequency = clampFrequency(info, segment.getStartFrequency());
- float clampedEndFrequency = clampFrequency(info, segment.getEndFrequency());
+ float clampedStartFrequency = clampFrequency(info, segment.getStartFrequencyHz());
+ float clampedEndFrequency = clampFrequency(info, segment.getEndFrequencyHz());
return new RampSegment(
clampAmplitude(info, clampedStartFrequency, segment.getStartAmplitude()),
clampAmplitude(info, clampedEndFrequency, segment.getEndAmplitude()),
- info.getAbsoluteFrequency(clampedStartFrequency),
- info.getAbsoluteFrequency(clampedEndFrequency),
+ clampedStartFrequency,
+ clampedEndFrequency,
(int) segment.getDuration());
}
- private float clampFrequency(VibratorInfo info, float frequency) {
- return info.getFrequencyRange().clamp(frequency);
+ private float clampFrequency(VibratorInfo info, float frequencyHz) {
+ Range<Float> frequencyRangeHz = info.getFrequencyRangeHz();
+ if (frequencyHz == 0 || frequencyRangeHz == null) {
+ return info.getResonantFrequency();
+ }
+ return frequencyRangeHz.clamp(frequencyHz);
}
- private float clampAmplitude(VibratorInfo info, float frequency, float amplitude) {
- return MathUtils.min(amplitude, info.getMaxAmplitude(frequency));
+ private float clampAmplitude(VibratorInfo info, float frequencyHz, float amplitude) {
+ Range<Float> frequencyRangeHz = info.getFrequencyRangeHz();
+ if (frequencyRangeHz == null) {
+ // No frequency range was specified, leave amplitude unchanged, the frequency will be
+ // clamped to the device's resonant frequency.
+ return amplitude;
+ }
+ return MathUtils.min(amplitude, info.getMaxAmplitude(frequencyHz));
}
}
diff --git a/services/core/java/com/android/server/vibrator/RampDownAdapter.java b/services/core/java/com/android/server/vibrator/RampDownAdapter.java
index e97ed4c..8fec162 100644
--- a/services/core/java/com/android/server/vibrator/RampDownAdapter.java
+++ b/services/core/java/com/android/server/vibrator/RampDownAdapter.java
@@ -90,13 +90,13 @@
if (previousSegment instanceof StepSegment) {
float previousAmplitude = ((StepSegment) previousSegment).getAmplitude();
- float previousFrequency = ((StepSegment) previousSegment).getFrequency();
+ float previousFrequency = ((StepSegment) previousSegment).getFrequencyHz();
replacementSegments =
createStepsDown(previousAmplitude, previousFrequency, offDuration);
} else if (previousSegment instanceof RampSegment) {
float previousAmplitude = ((RampSegment) previousSegment).getEndAmplitude();
- float previousFrequency = ((RampSegment) previousSegment).getEndFrequency();
+ float previousFrequency = ((RampSegment) previousSegment).getEndFrequencyHz();
if (offDuration <= mRampDownDuration) {
// Replace the zero amplitude segment with a ramp down of same duration, to
@@ -177,12 +177,12 @@
repeatIndex++;
if (lastSegment instanceof StepSegment) {
float previousAmplitude = ((StepSegment) lastSegment).getAmplitude();
- float previousFrequency = ((StepSegment) lastSegment).getFrequency();
+ float previousFrequency = ((StepSegment) lastSegment).getFrequencyHz();
segments.addAll(createStepsDown(previousAmplitude, previousFrequency,
Math.min(offDuration, mRampDownDuration)));
} else if (lastSegment instanceof RampSegment) {
float previousAmplitude = ((RampSegment) lastSegment).getEndAmplitude();
- float previousFrequency = ((RampSegment) lastSegment).getEndFrequency();
+ float previousFrequency = ((RampSegment) lastSegment).getEndFrequencyHz();
segments.add(createRampDown(previousAmplitude, previousFrequency,
Math.min(offDuration, mRampDownDuration)));
}
@@ -214,10 +214,10 @@
if (segment instanceof RampSegment) {
RampSegment ramp = (RampSegment) segment;
return new RampSegment(ramp.getStartAmplitude(), ramp.getEndAmplitude(),
- ramp.getStartFrequency(), ramp.getEndFrequency(), (int) newDuration);
+ ramp.getStartFrequencyHz(), ramp.getEndFrequencyHz(), (int) newDuration);
} else if (segment instanceof StepSegment) {
StepSegment step = (StepSegment) segment;
- return new StepSegment(step.getAmplitude(), step.getFrequency(), (int) newDuration);
+ return new StepSegment(step.getAmplitude(), step.getFrequencyHz(), (int) newDuration);
}
return segment;
}
diff --git a/services/core/java/com/android/server/vibrator/RampToStepAdapter.java b/services/core/java/com/android/server/vibrator/RampToStepAdapter.java
index 64624a2..c592a70 100644
--- a/services/core/java/com/android/server/vibrator/RampToStepAdapter.java
+++ b/services/core/java/com/android/server/vibrator/RampToStepAdapter.java
@@ -21,6 +21,7 @@
import android.os.vibrator.RampSegment;
import android.os.vibrator.StepSegment;
import android.os.vibrator.VibrationEffectSegment;
+import android.util.MathUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -52,7 +53,7 @@
if (!(segment instanceof RampSegment)) {
continue;
}
- List<StepSegment> steps = apply((RampSegment) segment);
+ List<StepSegment> steps = apply(info, (RampSegment) segment);
segments.remove(i);
segments.addAll(i, steps);
int addedSegments = steps.size() - 1;
@@ -65,11 +66,12 @@
return repeatIndex;
}
- private List<StepSegment> apply(RampSegment ramp) {
+ private List<StepSegment> apply(VibratorInfo info, RampSegment ramp) {
if (Float.compare(ramp.getStartAmplitude(), ramp.getEndAmplitude()) == 0) {
// Amplitude is the same, so return a single step to simulate this ramp.
return Arrays.asList(
- new StepSegment(ramp.getStartAmplitude(), ramp.getStartFrequency(),
+ new StepSegment(ramp.getStartAmplitude(),
+ fillEmptyFrequency(info, ramp.getStartFrequencyHz()),
(int) ramp.getDuration()));
}
@@ -77,17 +79,21 @@
int stepCount = (int) (ramp.getDuration() + mStepDuration - 1) / mStepDuration;
for (int i = 0; i < stepCount - 1; i++) {
float pos = (float) i / stepCount;
+ // Fill zero frequency values with the device resonant frequency before interpolating.
+ float startFrequencyHz = fillEmptyFrequency(info, ramp.getStartFrequencyHz());
+ float endFrequencyHz = fillEmptyFrequency(info, ramp.getEndFrequencyHz());
steps.add(new StepSegment(
- interpolate(ramp.getStartAmplitude(), ramp.getEndAmplitude(), pos),
- interpolate(ramp.getStartFrequency(), ramp.getEndFrequency(), pos),
+ MathUtils.lerp(ramp.getStartAmplitude(), ramp.getEndAmplitude(), pos),
+ MathUtils.lerp(startFrequencyHz, endFrequencyHz, pos),
mStepDuration));
}
int duration = (int) ramp.getDuration() - mStepDuration * (stepCount - 1);
- steps.add(new StepSegment(ramp.getEndAmplitude(), ramp.getEndFrequency(), duration));
+ float endFrequencyHz = fillEmptyFrequency(info, ramp.getEndFrequencyHz());
+ steps.add(new StepSegment(ramp.getEndAmplitude(), endFrequencyHz, duration));
return steps;
}
- private static float interpolate(float start, float end, float position) {
- return start + position * (end - start);
+ private static float fillEmptyFrequency(VibratorInfo info, float frequencyHz) {
+ return frequencyHz == 0 ? info.getResonantFrequency() : frequencyHz;
}
}
diff --git a/services/core/java/com/android/server/vibrator/StepToRampAdapter.java b/services/core/java/com/android/server/vibrator/StepToRampAdapter.java
index 6f5adac..5ace389 100644
--- a/services/core/java/com/android/server/vibrator/StepToRampAdapter.java
+++ b/services/core/java/com/android/server/vibrator/StepToRampAdapter.java
@@ -21,6 +21,7 @@
import android.os.vibrator.RampSegment;
import android.os.vibrator.StepSegment;
import android.os.vibrator.VibrationEffectSegment;
+import android.util.MathUtils;
import java.util.ArrayList;
import java.util.List;
@@ -41,18 +42,18 @@
// The vibrator does not have PWLE capability, so keep the segments unchanged.
return repeatIndex;
}
- convertStepsToRamps(segments);
+ convertStepsToRamps(info, segments);
repeatIndex = splitLongRampSegments(info, segments, repeatIndex);
return repeatIndex;
}
- private void convertStepsToRamps(List<VibrationEffectSegment> segments) {
+ private void convertStepsToRamps(VibratorInfo info, List<VibrationEffectSegment> segments) {
int segmentCount = segments.size();
// Convert steps that require frequency control to ramps.
for (int i = 0; i < segmentCount; i++) {
VibrationEffectSegment segment = segments.get(i);
- if (isStep(segment) && ((StepSegment) segment).getFrequency() != 0) {
- segments.set(i, convertStepToRamp((StepSegment) segment));
+ if (isStep(segment) && ((StepSegment) segment).getFrequencyHz() != 0) {
+ segments.set(i, convertStepToRamp(info, (StepSegment) segment));
}
}
// Convert steps that are next to ramps to also become ramps, so they can be composed
@@ -60,10 +61,10 @@
for (int i = 0; i < segmentCount; i++) {
if (segments.get(i) instanceof RampSegment) {
for (int j = i - 1; j >= 0 && isStep(segments.get(j)); j--) {
- segments.set(j, convertStepToRamp((StepSegment) segments.get(j)));
+ segments.set(j, convertStepToRamp(info, (StepSegment) segments.get(j)));
}
for (int j = i + 1; j < segmentCount && isStep(segments.get(j)); j++) {
- segments.set(j, convertStepToRamp((StepSegment) segments.get(j)));
+ segments.set(j, convertStepToRamp(info, (StepSegment) segments.get(j)));
}
}
}
@@ -92,7 +93,7 @@
continue;
}
segments.remove(i);
- segments.addAll(i, splitRampSegment(ramp, splits));
+ segments.addAll(i, splitRampSegment(info, ramp, splits));
int addedSegments = splits - 1;
if (repeatIndex > i) {
repeatIndex += addedSegments;
@@ -104,31 +105,40 @@
return repeatIndex;
}
- private static RampSegment convertStepToRamp(StepSegment segment) {
+ private static RampSegment convertStepToRamp(VibratorInfo info, StepSegment segment) {
+ float frequencyHz = fillEmptyFrequency(info, segment.getFrequencyHz());
return new RampSegment(segment.getAmplitude(), segment.getAmplitude(),
- segment.getFrequency(), segment.getFrequency(), (int) segment.getDuration());
+ frequencyHz, frequencyHz, (int) segment.getDuration());
}
- private static List<RampSegment> splitRampSegment(RampSegment ramp, int splits) {
+ private static List<RampSegment> splitRampSegment(VibratorInfo info, RampSegment ramp,
+ int splits) {
List<RampSegment> ramps = new ArrayList<>(splits);
+ float startFrequencyHz = fillEmptyFrequency(info, ramp.getStartFrequencyHz());
+ float endFrequencyHz = fillEmptyFrequency(info, ramp.getEndFrequencyHz());
long splitDuration = ramp.getDuration() / splits;
float previousAmplitude = ramp.getStartAmplitude();
- float previousFrequency = ramp.getStartFrequency();
+ float previousFrequency = startFrequencyHz;
long accumulatedDuration = 0;
for (int i = 1; i < splits; i++) {
accumulatedDuration += splitDuration;
+ float durationRatio = (float) accumulatedDuration / ramp.getDuration();
+ float interpolatedFrequency =
+ MathUtils.lerp(startFrequencyHz, endFrequencyHz, durationRatio);
+ float interpolatedAmplitude =
+ MathUtils.lerp(ramp.getStartAmplitude(), ramp.getEndAmplitude(), durationRatio);
RampSegment rampSplit = new RampSegment(
- previousAmplitude, interpolateAmplitude(ramp, accumulatedDuration),
- previousFrequency, interpolateFrequency(ramp, accumulatedDuration),
+ previousAmplitude, interpolatedAmplitude,
+ previousFrequency, interpolatedFrequency,
(int) splitDuration);
ramps.add(rampSplit);
previousAmplitude = rampSplit.getEndAmplitude();
- previousFrequency = rampSplit.getEndFrequency();
+ previousFrequency = rampSplit.getEndFrequencyHz();
}
ramps.add(new RampSegment(previousAmplitude, ramp.getEndAmplitude(), previousFrequency,
- ramp.getEndFrequency(), (int) (ramp.getDuration() - accumulatedDuration)));
+ endFrequencyHz, (int) (ramp.getDuration() - accumulatedDuration)));
return ramps;
}
@@ -137,18 +147,7 @@
return segment instanceof StepSegment;
}
- private static float interpolateAmplitude(RampSegment ramp, long duration) {
- return interpolate(ramp.getStartAmplitude(), ramp.getEndAmplitude(), duration,
- ramp.getDuration());
- }
-
- private static float interpolateFrequency(RampSegment ramp, long duration) {
- return interpolate(ramp.getStartFrequency(), ramp.getEndFrequency(), duration,
- ramp.getDuration());
- }
-
- private static float interpolate(float start, float end, long duration, long totalDuration) {
- float position = (float) duration / totalDuration;
- return start + position * (end - start);
+ private static float fillEmptyFrequency(VibratorInfo info, float frequencyHz) {
+ return frequencyHz == 0 ? info.getResonantFrequency() : frequencyHz;
}
}
diff --git a/services/core/java/com/android/server/vibrator/Vibration.java b/services/core/java/com/android/server/vibrator/Vibration.java
index 1d6e158..0c15ee7 100644
--- a/services/core/java/com/android/server/vibrator/Vibration.java
+++ b/services/core/java/com/android/server/vibrator/Vibration.java
@@ -373,7 +373,7 @@
final long token = proto.start(fieldId);
proto.write(StepSegmentProto.DURATION, segment.getDuration());
proto.write(StepSegmentProto.AMPLITUDE, segment.getAmplitude());
- proto.write(StepSegmentProto.FREQUENCY, segment.getFrequency());
+ proto.write(StepSegmentProto.FREQUENCY, segment.getFrequencyHz());
proto.end(token);
}
@@ -382,8 +382,8 @@
proto.write(RampSegmentProto.DURATION, segment.getDuration());
proto.write(RampSegmentProto.START_AMPLITUDE, segment.getStartAmplitude());
proto.write(RampSegmentProto.END_AMPLITUDE, segment.getEndAmplitude());
- proto.write(RampSegmentProto.START_FREQUENCY, segment.getStartFrequency());
- proto.write(RampSegmentProto.END_FREQUENCY, segment.getEndFrequency());
+ proto.write(RampSegmentProto.START_FREQUENCY, segment.getStartFrequencyHz());
+ proto.write(RampSegmentProto.END_FREQUENCY, segment.getEndFrequencyHz());
proto.end(token);
}
diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java
index 1ee115d..df6ffa2 100644
--- a/services/core/java/com/android/server/vibrator/VibrationSettings.java
+++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java
@@ -16,13 +16,16 @@
package com.android.server.vibrator;
+import static android.os.VibrationAttributes.USAGE_ACCESSIBILITY;
import static android.os.VibrationAttributes.USAGE_ALARM;
import static android.os.VibrationAttributes.USAGE_COMMUNICATION_REQUEST;
import static android.os.VibrationAttributes.USAGE_HARDWARE_FEEDBACK;
+import static android.os.VibrationAttributes.USAGE_MEDIA;
import static android.os.VibrationAttributes.USAGE_NOTIFICATION;
import static android.os.VibrationAttributes.USAGE_PHYSICAL_EMULATION;
import static android.os.VibrationAttributes.USAGE_RINGTONE;
import static android.os.VibrationAttributes.USAGE_TOUCH;
+import static android.os.VibrationAttributes.USAGE_UNKNOWN;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -44,8 +47,11 @@
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
+import android.os.Vibrator.VibrationIntensity;
+import android.os.vibrator.VibrationConfig;
import android.provider.Settings;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
@@ -109,53 +115,31 @@
private final List<OnVibratorSettingsChanged> mListeners = new ArrayList<>();
private final SparseArray<VibrationEffect> mFallbackEffects;
- private final int mRampStepDuration;
- private final int mRampDownDuration;
+ private final VibrationConfig mVibrationConfig;
@GuardedBy("mLock")
@Nullable
- private Vibrator mVibrator;
- @GuardedBy("mLock")
- @Nullable
private AudioManager mAudioManager;
@GuardedBy("mLock")
private boolean mVibrateInputDevices;
@GuardedBy("mLock")
- private boolean mVibrateWhenRinging;
- @GuardedBy("mLock")
- private boolean mApplyRampingRinger;
- @GuardedBy("mLock")
- private int mHapticFeedbackIntensity;
- @GuardedBy("mLock")
- private int mHardwareFeedbackIntensity;
- @GuardedBy("mLock")
- private int mNotificationIntensity;
- @GuardedBy("mLock")
- private int mRingIntensity;
+ private SparseIntArray mCurrentVibrationIntensities = new SparseIntArray();
@GuardedBy("mLock")
private boolean mBatterySaverMode;
VibrationSettings(Context context, Handler handler) {
- this(context, handler,
- context.getResources().getInteger(
- com.android.internal.R.integer.config_vibrationWaveformRampDownDuration),
- context.getResources().getInteger(
- com.android.internal.R.integer.config_vibrationWaveformRampStepDuration));
+ this(context, handler, new VibrationConfig(context.getResources()));
}
@VisibleForTesting
- VibrationSettings(Context context, Handler handler, int rampDownDuration,
- int rampStepDuration) {
+ VibrationSettings(Context context, Handler handler, VibrationConfig config) {
mContext = context;
+ mVibrationConfig = config;
mSettingObserver = new SettingsObserver(handler);
mUidObserver = new UidObserver();
mUserReceiver = new UserObserver();
- // TODO(b/191150049): move these to vibrator static config file
- mRampDownDuration = rampDownDuration;
- mRampStepDuration = rampStepDuration;
-
VibrationEffect clickEffect = createEffectFromResource(
com.android.internal.R.array.config_virtualKeyVibePattern);
VibrationEffect doubleClickEffect = createEffectFromResource(
@@ -179,7 +163,6 @@
public void onSystemReady() {
synchronized (mLock) {
- mVibrator = mContext.getSystemService(Vibrator.class);
mAudioManager = mContext.getSystemService(AudioManager.class);
}
try {
@@ -214,12 +197,21 @@
IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
mContext.registerReceiver(mUserReceiver, filter, Context.RECEIVER_NOT_EXPORTED);
+ // Listen to all settings that might affect the result of Vibrator.getVibrationIntensity.
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES));
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_WHEN_RINGING));
registerSettingsObserver(Settings.System.getUriFor(Settings.System.APPLY_RAMPING_RINGER));
+ registerSettingsObserver(Settings.System.getUriFor(
+ Settings.System.HAPTIC_FEEDBACK_ENABLED));
+ registerSettingsObserver(
+ Settings.System.getUriFor(Settings.System.ALARM_VIBRATION_INTENSITY));
registerSettingsObserver(
Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_INTENSITY));
registerSettingsObserver(
+ Settings.System.getUriFor(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY));
+ registerSettingsObserver(
+ Settings.System.getUriFor(Settings.System.MEDIA_VIBRATION_INTENSITY));
+ registerSettingsObserver(
Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY));
registerSettingsObserver(
Settings.System.getUriFor(Settings.System.RING_VIBRATION_INTENSITY));
@@ -253,7 +245,7 @@
* devices without PWLE support.
*/
public int getRampStepDuration() {
- return mRampStepDuration;
+ return mVibrationConfig.getRampStepDurationMs();
}
/**
@@ -261,7 +253,7 @@
* when a vibration is cancelled or finished at non-zero amplitude.
*/
public int getRampDownDuration() {
- return mRampDownDuration;
+ return mVibrationConfig.getRampDownDurationMs();
}
/**
@@ -270,25 +262,8 @@
* @param usageHint one of VibrationAttributes.USAGE_*
* @return The vibration intensity, one of Vibrator.VIBRATION_INTENSITY_*
*/
- public int getDefaultIntensity(int usageHint) {
- if (usageHint == USAGE_ALARM) {
- return Vibrator.VIBRATION_INTENSITY_HIGH;
- }
- synchronized (mLock) {
- if (mVibrator != null) {
- switch (usageHint) {
- case USAGE_RINGTONE:
- return mVibrator.getDefaultRingVibrationIntensity();
- case USAGE_NOTIFICATION:
- return mVibrator.getDefaultNotificationVibrationIntensity();
- case USAGE_TOUCH:
- case USAGE_HARDWARE_FEEDBACK:
- case USAGE_PHYSICAL_EMULATION:
- return mVibrator.getDefaultHapticFeedbackIntensity();
- }
- }
- }
- return Vibrator.VIBRATION_INTENSITY_MEDIUM;
+ public int getDefaultIntensity(@VibrationAttributes.Usage int usageHint) {
+ return mVibrationConfig.getDefaultVibrationIntensity(usageHint);
}
/**
@@ -297,23 +272,10 @@
* @param usageHint one of VibrationAttributes.USAGE_*
* @return The vibration intensity, one of Vibrator.VIBRATION_INTENSITY_*
*/
- public int getCurrentIntensity(int usageHint) {
+ public int getCurrentIntensity(@VibrationAttributes.Usage int usageHint) {
+ int defaultIntensity = getDefaultIntensity(usageHint);
synchronized (mLock) {
- switch (usageHint) {
- case USAGE_RINGTONE:
- return mRingIntensity;
- case USAGE_NOTIFICATION:
- return mNotificationIntensity;
- case USAGE_TOUCH:
- return mHapticFeedbackIntensity;
- case USAGE_HARDWARE_FEEDBACK:
- case USAGE_PHYSICAL_EMULATION:
- return mHardwareFeedbackIntensity;
- case USAGE_ALARM:
- return Vibrator.VIBRATION_INTENSITY_HIGH;
- default:
- return Vibrator.VIBRATION_INTENSITY_MEDIUM;
- }
+ return mCurrentVibrationIntensities.get(usageHint, defaultIntensity);
}
}
@@ -371,7 +333,7 @@
* for touch and ringtone usages only. All other usages are allowed by this method.
*/
@GuardedBy("mLock")
- private boolean shouldVibrateForRingerModeLocked(int usageHint) {
+ private boolean shouldVibrateForRingerModeLocked(@VibrationAttributes.Usage int usageHint) {
// If audio manager was not loaded yet then assume most restrictive mode.
int ringerMode = (mAudioManager == null)
? AudioManager.RINGER_MODE_SILENT
@@ -379,18 +341,9 @@
switch (usageHint) {
case USAGE_TOUCH:
- // Touch feedback disabled when phone is on silent mode.
- return ringerMode != AudioManager.RINGER_MODE_SILENT;
case USAGE_RINGTONE:
- switch (ringerMode) {
- case AudioManager.RINGER_MODE_SILENT:
- return false;
- case AudioManager.RINGER_MODE_VIBRATE:
- return true;
- default:
- // Ringtone vibrations also depend on 2 other settings:
- return mVibrateWhenRinging || mApplyRampingRinger;
- }
+ // Touch feedback and ringtone disabled when phone is on silent mode.
+ return ringerMode != AudioManager.RINGER_MODE_SILENT;
default:
// All other usages ignore ringer mode settings.
return true;
@@ -401,64 +354,89 @@
@VisibleForTesting
void updateSettings() {
synchronized (mLock) {
- mVibrateWhenRinging = getSystemSetting(Settings.System.VIBRATE_WHEN_RINGING, 0) != 0;
- mApplyRampingRinger = getSystemSetting(Settings.System.APPLY_RAMPING_RINGER, 0) != 0;
- mHapticFeedbackIntensity = getSystemSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- getDefaultIntensity(USAGE_TOUCH));
- mHardwareFeedbackIntensity = getSystemSetting(
- Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY,
- getHardwareFeedbackIntensityWhenSettingIsMissing(mHapticFeedbackIntensity));
- mNotificationIntensity = getSystemSetting(
- Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- getDefaultIntensity(USAGE_NOTIFICATION));
- mRingIntensity = getSystemSetting(Settings.System.RING_VIBRATION_INTENSITY,
+ mVibrateInputDevices = loadSystemSetting(Settings.System.VIBRATE_INPUT_DEVICES, 0) > 0;
+
+ int alarmIntensity = toIntensity(
+ loadSystemSetting(Settings.System.ALARM_VIBRATION_INTENSITY, -1),
+ getDefaultIntensity(USAGE_ALARM));
+ int defaultHapticFeedbackIntensity = getDefaultIntensity(USAGE_TOUCH);
+ int hapticFeedbackIntensity = toIntensity(
+ loadSystemSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, -1),
+ defaultHapticFeedbackIntensity);
+ int positiveHapticFeedbackIntensity = toPositiveIntensity(
+ hapticFeedbackIntensity, defaultHapticFeedbackIntensity);
+ int hardwareFeedbackIntensity = toIntensity(
+ loadSystemSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, -1),
+ positiveHapticFeedbackIntensity);
+ int mediaIntensity = toIntensity(
+ loadSystemSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, -1),
+ getDefaultIntensity(USAGE_MEDIA));
+ int defaultNotificationIntensity = getDefaultIntensity(USAGE_NOTIFICATION);
+ int notificationIntensity = toIntensity(
+ loadSystemSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, -1),
+ defaultNotificationIntensity);
+ int positiveNotificationIntensity = toPositiveIntensity(
+ notificationIntensity, defaultNotificationIntensity);
+ int ringIntensity = toIntensity(
+ loadSystemSetting(Settings.System.RING_VIBRATION_INTENSITY, -1),
getDefaultIntensity(USAGE_RINGTONE));
- mVibrateInputDevices = getSystemSetting(Settings.System.VIBRATE_INPUT_DEVICES, 0) > 0;
+
+
+ mCurrentVibrationIntensities.clear();
+ mCurrentVibrationIntensities.put(USAGE_ALARM, alarmIntensity);
+ mCurrentVibrationIntensities.put(USAGE_NOTIFICATION, notificationIntensity);
+ mCurrentVibrationIntensities.put(USAGE_MEDIA, mediaIntensity);
+ mCurrentVibrationIntensities.put(USAGE_UNKNOWN, mediaIntensity);
+
+ // Communication request is not disabled by the notification setting.
+ mCurrentVibrationIntensities.put(USAGE_COMMUNICATION_REQUEST,
+ positiveNotificationIntensity);
+
+ if (!loadBooleanSetting(Settings.System.VIBRATE_WHEN_RINGING)
+ && !loadBooleanSetting(Settings.System.APPLY_RAMPING_RINGER)) {
+ // Make sure deprecated boolean setting still disables ringtone vibrations.
+ mCurrentVibrationIntensities.put(USAGE_RINGTONE, Vibrator.VIBRATION_INTENSITY_OFF);
+ } else {
+ mCurrentVibrationIntensities.put(USAGE_RINGTONE, ringIntensity);
+ }
+
+ // This should adapt the behavior preceding the introduction of this new setting
+ // key, which is to apply HAPTIC_FEEDBACK_INTENSITY, unless it's disabled.
+ mCurrentVibrationIntensities.put(USAGE_HARDWARE_FEEDBACK, hardwareFeedbackIntensity);
+ mCurrentVibrationIntensities.put(USAGE_PHYSICAL_EMULATION, hardwareFeedbackIntensity);
+
+ if (!loadBooleanSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED)) {
+ // Make sure deprecated boolean setting still disables touch vibrations.
+ mCurrentVibrationIntensities.put(USAGE_TOUCH, Vibrator.VIBRATION_INTENSITY_OFF);
+ } else {
+ mCurrentVibrationIntensities.put(USAGE_TOUCH, hapticFeedbackIntensity);
+ }
+
+ // A11y is not disabled by any haptic feedback setting.
+ mCurrentVibrationIntensities.put(USAGE_ACCESSIBILITY, positiveHapticFeedbackIntensity);
}
notifyListeners();
}
- /**
- * Return the value to be used for {@link Settings.System#HARDWARE_HAPTIC_FEEDBACK_INTENSITY}
- * when the value was not set by the user.
- *
- * <p>This should adapt the behavior preceding the introduction of this new setting key, which
- * is to apply {@link Settings.System#HAPTIC_FEEDBACK_INTENSITY} unless it's disabled.
- */
- private int getHardwareFeedbackIntensityWhenSettingIsMissing(int hapticFeedbackIntensity) {
- if (hapticFeedbackIntensity == Vibrator.VIBRATION_INTENSITY_OFF) {
- return getDefaultIntensity(USAGE_HARDWARE_FEEDBACK);
- }
- return hapticFeedbackIntensity;
- }
-
@Override
public String toString() {
synchronized (mLock) {
+ StringBuilder vibrationIntensitiesString = new StringBuilder("{");
+ for (int i = 0; i < mCurrentVibrationIntensities.size(); i++) {
+ int usage = mCurrentVibrationIntensities.keyAt(i);
+ int intensity = mCurrentVibrationIntensities.valueAt(i);
+ vibrationIntensitiesString.append(VibrationAttributes.usageToString(usage))
+ .append("=(").append(intensityToString(intensity))
+ .append(",default:").append(intensityToString(getDefaultIntensity(usage)))
+ .append("), ");
+ }
+ vibrationIntensitiesString.append('}');
return "VibrationSettings{"
- + "mVibrateInputDevices=" + mVibrateInputDevices
- + ", mVibrateWhenRinging=" + mVibrateWhenRinging
- + ", mApplyRampingRinger=" + mApplyRampingRinger
+ + "mVibratorConfig=" + mVibrationConfig
+ + ", mVibrateInputDevices=" + mVibrateInputDevices
+ ", mBatterySaverMode=" + mBatterySaverMode
+ ", mProcStatesCache=" + mUidObserver.mProcStatesCache
- + ", mHapticChannelMaxVibrationAmplitude="
- + getHapticChannelMaxVibrationAmplitude()
- + ", mRampStepDuration=" + mRampStepDuration
- + ", mRampDownDuration=" + mRampDownDuration
- + ", mHardwareHapticFeedbackIntensity="
- + intensityToString(getCurrentIntensity(USAGE_HARDWARE_FEEDBACK))
- + ", mHapticFeedbackIntensity="
- + intensityToString(getCurrentIntensity(USAGE_TOUCH))
- + ", mHapticFeedbackDefaultIntensity="
- + intensityToString(getDefaultIntensity(USAGE_TOUCH))
- + ", mNotificationIntensity="
- + intensityToString(getCurrentIntensity(USAGE_NOTIFICATION))
- + ", mNotificationDefaultIntensity="
- + intensityToString(getDefaultIntensity(USAGE_NOTIFICATION))
- + ", mRingIntensity="
- + intensityToString(getCurrentIntensity(USAGE_RINGTONE))
- + ", mRingDefaultIntensity="
- + intensityToString(getDefaultIntensity(USAGE_RINGTONE))
+ + ", mVibrationIntensities=" + vibrationIntensitiesString
+ '}';
}
}
@@ -466,16 +444,28 @@
/** Write current settings into given {@link ProtoOutputStream}. */
public void dumpProto(ProtoOutputStream proto) {
synchronized (mLock) {
+ proto.write(VibratorManagerServiceDumpProto.ALARM_INTENSITY,
+ getCurrentIntensity(USAGE_ALARM));
+ proto.write(VibratorManagerServiceDumpProto.ALARM_DEFAULT_INTENSITY,
+ getDefaultIntensity(USAGE_ALARM));
+ proto.write(VibratorManagerServiceDumpProto.HARDWARE_FEEDBACK_INTENSITY,
+ getCurrentIntensity(USAGE_HARDWARE_FEEDBACK));
+ proto.write(VibratorManagerServiceDumpProto.HARDWARE_FEEDBACK_DEFAULT_INTENSITY,
+ getDefaultIntensity(USAGE_HARDWARE_FEEDBACK));
proto.write(VibratorManagerServiceDumpProto.HAPTIC_FEEDBACK_INTENSITY,
- mHapticFeedbackIntensity);
+ getCurrentIntensity(USAGE_TOUCH));
proto.write(VibratorManagerServiceDumpProto.HAPTIC_FEEDBACK_DEFAULT_INTENSITY,
getDefaultIntensity(USAGE_TOUCH));
+ proto.write(VibratorManagerServiceDumpProto.MEDIA_INTENSITY,
+ getCurrentIntensity(USAGE_MEDIA));
+ proto.write(VibratorManagerServiceDumpProto.MEDIA_DEFAULT_INTENSITY,
+ getDefaultIntensity(USAGE_MEDIA));
proto.write(VibratorManagerServiceDumpProto.NOTIFICATION_INTENSITY,
- mNotificationIntensity);
+ getCurrentIntensity(USAGE_NOTIFICATION));
proto.write(VibratorManagerServiceDumpProto.NOTIFICATION_DEFAULT_INTENSITY,
getDefaultIntensity(USAGE_NOTIFICATION));
proto.write(VibratorManagerServiceDumpProto.RING_INTENSITY,
- mRingIntensity);
+ getCurrentIntensity(USAGE_RINGTONE));
proto.write(VibratorManagerServiceDumpProto.RING_DEFAULT_INTENSITY,
getDefaultIntensity(USAGE_RINGTONE));
}
@@ -506,13 +496,29 @@
}
}
- private float getHapticChannelMaxVibrationAmplitude() {
- synchronized (mLock) {
- return mVibrator == null ? Float.NaN : mVibrator.getHapticChannelMaximumAmplitude();
+ @VibrationIntensity
+ private int toPositiveIntensity(int value, @VibrationIntensity int defaultValue) {
+ if (value == Vibrator.VIBRATION_INTENSITY_OFF) {
+ return defaultValue;
}
+ return toIntensity(value, defaultValue);
}
- private int getSystemSetting(String settingName, int defaultValue) {
+ @VibrationIntensity
+ private int toIntensity(int value, @VibrationIntensity int defaultValue) {
+ if ((value < Vibrator.VIBRATION_INTENSITY_OFF)
+ || (value > Vibrator.VIBRATION_INTENSITY_HIGH)) {
+ return defaultValue;
+ }
+ return value;
+ }
+
+ private boolean loadBooleanSetting(String settingKey) {
+ return Settings.System.getIntForUser(mContext.getContentResolver(),
+ settingKey, 0, UserHandle.USER_CURRENT) != 0;
+ }
+
+ private int loadSystemSetting(String settingName, int defaultValue) {
return Settings.System.getIntForUser(mContext.getContentResolver(),
settingName, defaultValue, UserHandle.USER_CURRENT);
}
diff --git a/services/core/java/com/android/server/vibrator/VibratorController.java b/services/core/java/com/android/server/vibrator/VibratorController.java
index 4a1b95b..47b3e1a 100644
--- a/services/core/java/com/android/server/vibrator/VibratorController.java
+++ b/services/core/java/com/android/server/vibrator/VibratorController.java
@@ -36,8 +36,6 @@
/** Controls a single vibrator. */
final class VibratorController {
private static final String TAG = "VibratorController";
- // TODO(b/167947076): load suggested range from config
- private static final int SUGGESTED_FREQUENCY_SAFE_RANGE = 200;
private final Object mLock = new Object();
@@ -74,8 +72,7 @@
mNativeWrapper = nativeWrapper;
mNativeWrapper.init(vibratorId, listener);
VibratorInfo.Builder vibratorInfoBuilder = new VibratorInfo.Builder(vibratorId);
- mVibratorInfoLoadSuccessful = mNativeWrapper.getInfo(SUGGESTED_FREQUENCY_SAFE_RANGE,
- vibratorInfoBuilder);
+ mVibratorInfoLoadSuccessful = mNativeWrapper.getInfo(vibratorInfoBuilder);
mVibratorInfo = vibratorInfoBuilder.build();
if (!mVibratorInfoLoadSuccessful) {
@@ -126,8 +123,7 @@
}
int vibratorId = mVibratorInfo.getId();
VibratorInfo.Builder vibratorInfoBuilder = new VibratorInfo.Builder(vibratorId);
- mVibratorInfoLoadSuccessful = mNativeWrapper.getInfo(SUGGESTED_FREQUENCY_SAFE_RANGE,
- vibratorInfoBuilder);
+ mVibratorInfoLoadSuccessful = mNativeWrapper.getInfo(vibratorInfoBuilder);
mVibratorInfo = vibratorInfoBuilder.build();
if (!mVibratorInfoLoadSuccessful) {
Slog.e(TAG, "Failed retry of HAL getInfo for vibrator " + vibratorId);
@@ -419,8 +415,7 @@
private static native void alwaysOnDisable(long nativePtr, long id);
- private static native boolean getInfo(long nativePtr, float suggestedFrequencyRange,
- VibratorInfo.Builder infoBuilder);
+ private static native boolean getInfo(long nativePtr, VibratorInfo.Builder infoBuilder);
private long mNativePtr = 0;
@@ -490,8 +485,8 @@
/**
* Loads device vibrator metadata and returns true if all metadata was loaded successfully.
*/
- public boolean getInfo(float suggestedFrequencyRange, VibratorInfo.Builder infoBuilder) {
- return getInfo(mNativePtr, suggestedFrequencyRange, infoBuilder);
+ public boolean getInfo(VibratorInfo.Builder infoBuilder) {
+ return getInfo(mNativePtr, infoBuilder);
}
}
}
diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
index 478e86e..27566b3 100644
--- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java
+++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java
@@ -1756,17 +1756,23 @@
}
if (hasFrequencies) {
frequencies.add(Float.parseFloat(getNextArgRequired()));
- } else {
- frequencies.add(0f);
}
}
VibrationEffect.WaveformBuilder waveform = VibrationEffect.startWaveform();
for (int i = 0; i < durations.size(); i++) {
if (isContinuous) {
- waveform.addRamp(amplitudes.get(i), frequencies.get(i), durations.get(i));
+ if (hasFrequencies) {
+ waveform.addRamp(amplitudes.get(i), frequencies.get(i), durations.get(i));
+ } else {
+ waveform.addRamp(amplitudes.get(i), durations.get(i));
+ }
} else {
- waveform.addStep(amplitudes.get(i), frequencies.get(i), durations.get(i));
+ if (hasFrequencies) {
+ waveform.addStep(amplitudes.get(i), frequencies.get(i), durations.get(i));
+ } else {
+ waveform.addStep(amplitudes.get(i), durations.get(i));
+ }
}
}
composition.addEffect(waveform.build(repeat), delay);
@@ -1865,7 +1871,7 @@
pw.println(" If -c is provided, the waveform is continuous and will ramp");
pw.println(" between values; otherwise each entry is a fixed step.");
pw.println(" Duration is in milliseconds; amplitude is a scale of 1-255;");
- pw.println(" frequency is a relative value around resonant frequency 0;");
+ pw.println(" frequency is an absolute value in hertz;");
pw.println(" prebaked [-w delay] [-b] <effect-id>");
pw.println(" Vibrates with prebaked effect; ignored when device is on DND ");
pw.println(" (Do Not Disturb) mode; touch feedback strength user setting ");
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 0396a11..8f703c5 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -45,7 +45,6 @@
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowTracing.WINSCOPE_EXT;
-import static com.android.server.wm.utils.RegionUtils.forEachRect;
import android.accessibilityservice.AccessibilityTrace;
import android.animation.ObjectAnimator;
@@ -101,6 +100,7 @@
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.wm.AccessibilityWindowsPopulator.AccessibilityWindow;
import com.android.server.wm.WindowManagerInternal.AccessibilityControllerInternal;
import com.android.server.wm.WindowManagerInternal.MagnificationCallbacks;
import com.android.server.wm.WindowManagerInternal.WindowsForAccessibilityCallback;
@@ -133,19 +133,22 @@
private static final Rect EMPTY_RECT = new Rect();
private static final float[] sTempFloats = new float[9];
- private SparseArray<DisplayMagnifier> mDisplayMagnifiers = new SparseArray<>();
- private SparseArray<WindowsForAccessibilityObserver> mWindowsForAccessibilityObserver =
+ private final SparseArray<DisplayMagnifier> mDisplayMagnifiers = new SparseArray<>();
+ private final SparseArray<WindowsForAccessibilityObserver> mWindowsForAccessibilityObserver =
new SparseArray<>();
private SparseArray<IBinder> mFocusedWindow = new SparseArray<>();
private int mFocusedDisplay = -1;
private boolean mIsImeVisible = false;
// Set to true if initializing window population complete.
private boolean mAllObserversInitialized = true;
+ private final AccessibilityWindowsPopulator mAccessibilityWindowsPopulator;
AccessibilityController(WindowManagerService service) {
mService = service;
mAccessibilityTracing =
AccessibilityController.getAccessibilityControllerInternal(service);
+
+ mAccessibilityWindowsPopulator = new AccessibilityWindowsPopulator(mService, this);
}
boolean setMagnificationCallbacks(int displayId, MagnificationCallbacks callbacks) {
@@ -209,7 +212,9 @@
}
mWindowsForAccessibilityObserver.remove(displayId);
}
- observer = new WindowsForAccessibilityObserver(mService, displayId, callback);
+ mAccessibilityWindowsPopulator.setWindowsNotification(true);
+ observer = new WindowsForAccessibilityObserver(mService, displayId, callback,
+ mAccessibilityWindowsPopulator);
mWindowsForAccessibilityObserver.put(displayId, observer);
mAllObserversInitialized &= observer.mInitialized;
} else {
@@ -224,6 +229,10 @@
}
}
mWindowsForAccessibilityObserver.remove(displayId);
+
+ if (mWindowsForAccessibilityObserver.size() <= 0) {
+ mAccessibilityWindowsPopulator.setWindowsNotification(false);
+ }
}
}
@@ -309,11 +318,6 @@
if (displayMagnifier != null) {
displayMagnifier.onDisplaySizeChanged(displayContent);
}
- final WindowsForAccessibilityObserver windowsForA11yObserver =
- mWindowsForAccessibilityObserver.get(displayId);
- if (windowsForA11yObserver != null) {
- windowsForA11yObserver.scheduleComputeChangedWindows();
- }
}
void onAppWindowTransition(int displayId, int transition) {
@@ -341,11 +345,6 @@
if (displayMagnifier != null) {
displayMagnifier.onWindowTransition(windowState, transition);
}
- final WindowsForAccessibilityObserver windowsForA11yObserver =
- mWindowsForAccessibilityObserver.get(displayId);
- if (windowsForA11yObserver != null) {
- windowsForA11yObserver.scheduleComputeChangedWindows();
- }
}
void onWindowFocusChangedNot(int displayId) {
@@ -455,6 +454,19 @@
return null;
}
+ boolean getMagnificationSpecForDisplay(int displayId, MagnificationSpec outSpec) {
+ if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
+ mAccessibilityTracing.logTrace(TAG + ".getMagnificationSpecForDisplay",
+ FLAGS_MAGNIFICATION_CALLBACK, "displayId=" + displayId);
+ }
+ final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId);
+ if (displayMagnifier == null) {
+ return false;
+ }
+
+ return displayMagnifier.getMagnificationSpec(outSpec);
+ }
+
boolean hasCallbacks() {
if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK
| FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK)) {
@@ -756,6 +768,25 @@
return spec;
}
+ boolean getMagnificationSpec(MagnificationSpec outSpec) {
+ if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
+ mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationSpec",
+ FLAGS_MAGNIFICATION_CALLBACK);
+ }
+ MagnificationSpec spec = mMagnifedViewport.getMagnificationSpec();
+ if (spec == null) {
+ return false;
+ }
+
+ outSpec.setTo(spec);
+ if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
+ mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationSpec",
+ FLAGS_MAGNIFICATION_CALLBACK, "outSpec={" + outSpec + "}");
+ }
+
+ return true;
+ }
+
void getMagnificationRegion(Region outMagnificationRegion) {
if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) {
mAccessibilityTracing.logTrace(LOG_TAG + ".getMagnificationRegion",
@@ -1403,20 +1434,18 @@
private static final boolean DEBUG = false;
- private final SparseArray<WindowState> mTempWindowStates = new SparseArray<>();
+ private final List<AccessibilityWindow> mTempA11yWindows = new ArrayList<>();
private final Set<IBinder> mTempBinderSet = new ArraySet<>();
- private final RectF mTempRectF = new RectF();
-
- private final Matrix mTempMatrix = new Matrix();
-
private final Point mTempPoint = new Point();
private final Region mTempRegion = new Region();
private final Region mTempRegion1 = new Region();
+ private final Region mTempRegion2 = new Region();
+
private final WindowManagerService mService;
private final Handler mHandler;
@@ -1431,10 +1460,11 @@
// Set to true if initializing window population complete.
private boolean mInitialized;
+ private final AccessibilityWindowsPopulator mA11yWindowsPopulator;
WindowsForAccessibilityObserver(WindowManagerService windowManagerService,
- int displayId,
- WindowsForAccessibilityCallback callback) {
+ int displayId, WindowsForAccessibilityCallback callback,
+ AccessibilityWindowsPopulator accessibilityWindowsPopulator) {
mService = windowManagerService;
mCallback = callback;
mDisplayId = displayId;
@@ -1443,6 +1473,7 @@
AccessibilityController.getAccessibilityControllerInternal(mService);
mRecurringAccessibilityEventsIntervalMillis = ViewConfiguration
.getSendRecurringAccessibilityEventsInterval();
+ mA11yWindowsPopulator = accessibilityWindowsPopulator;
computeChangedWindows(true);
}
@@ -1466,52 +1497,6 @@
}
}
- boolean shellRootIsAbove(WindowState windowState, ShellRoot shellRoot) {
- int wsLayer = mService.mPolicy.getWindowLayerLw(windowState);
- int shellLayer = mService.mPolicy.getWindowLayerFromTypeLw(shellRoot.getWindowType(),
- true);
- return shellLayer >= wsLayer;
- }
-
- int addShellRootsIfAbove(WindowState windowState, ArrayList<ShellRoot> shellRoots,
- int shellRootIndex, List<WindowInfo> windows, Set<IBinder> addedWindows,
- Region unaccountedSpace, boolean focusedWindowAdded) {
- while (shellRootIndex < shellRoots.size()
- && shellRootIsAbove(windowState, shellRoots.get(shellRootIndex))) {
- ShellRoot shellRoot = shellRoots.get(shellRootIndex);
- shellRootIndex++;
- final WindowInfo info = shellRoot.getWindowInfo();
- if (info == null) {
- continue;
- }
-
- info.layer = addedWindows.size();
- windows.add(info);
- addedWindows.add(info.token);
- unaccountedSpace.op(info.regionInScreen, unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
- if (unaccountedSpace.isEmpty() && focusedWindowAdded) {
- break;
- }
- }
- return shellRootIndex;
- }
-
- private ArrayList<ShellRoot> getSortedShellRoots(
- SparseArray<ShellRoot> originalShellRoots) {
- ArrayList<ShellRoot> sortedShellRoots = new ArrayList<>(originalShellRoots.size());
- for (int i = originalShellRoots.size() - 1; i >= 0; --i) {
- sortedShellRoots.add(originalShellRoots.valueAt(i));
- }
-
- sortedShellRoots.sort((left, right) ->
- mService.mPolicy.getWindowLayerFromTypeLw(right.getWindowType(), true)
- - mService.mPolicy.getWindowLayerFromTypeLw(left.getWindowType(),
- true));
-
- return sortedShellRoots;
- }
-
/**
* Check if windows have changed, and send them to the accessibility subsystem if they have.
*
@@ -1561,44 +1546,29 @@
Region unaccountedSpace = mTempRegion;
unaccountedSpace.set(0, 0, screenWidth, screenHeight);
- final SparseArray<WindowState> visibleWindows = mTempWindowStates;
- populateVisibleWindowsOnScreen(visibleWindows);
+ final List<AccessibilityWindow> visibleWindows = mTempA11yWindows;
+ mA11yWindowsPopulator.populateVisibleWindowsOnScreenLocked(
+ mDisplayId, visibleWindows);
Set<IBinder> addedWindows = mTempBinderSet;
addedWindows.clear();
boolean focusedWindowAdded = false;
final int visibleWindowCount = visibleWindows.size();
- ArrayList<TaskFragment> skipRemainingWindowsForTaskFragments = new ArrayList<>();
-
- ArrayList<ShellRoot> shellRoots = getSortedShellRoots(dc.mShellRoots);
// Iterate until we figure out what is touchable for the entire screen.
- int shellRootIndex = 0;
- for (int i = visibleWindowCount - 1; i >= 0; i--) {
- final WindowState windowState = visibleWindows.valueAt(i);
- int prevShellRootIndex = shellRootIndex;
- shellRootIndex = addShellRootsIfAbove(windowState, shellRoots, shellRootIndex,
- windows, addedWindows, unaccountedSpace, focusedWindowAdded);
-
- // If a Shell Root was added, it could have accounted for all the space already.
- if (shellRootIndex > prevShellRootIndex && unaccountedSpace.isEmpty()
- && focusedWindowAdded) {
- break;
- }
-
- final Region regionInScreen = new Region();
- computeWindowRegionInScreen(windowState, regionInScreen);
- if (windowMattersToAccessibility(windowState,
- regionInScreen, unaccountedSpace,
- skipRemainingWindowsForTaskFragments)) {
- addPopulatedWindowInfo(windowState, regionInScreen, windows, addedWindows);
- if (windowMattersToUnaccountedSpaceComputation(windowState)) {
- updateUnaccountedSpace(windowState, regionInScreen, unaccountedSpace,
- skipRemainingWindowsForTaskFragments);
+ for (int i = 0; i < visibleWindowCount; i++) {
+ final AccessibilityWindow a11yWindow = visibleWindows.get(i);
+ final Region regionInWindow = new Region();
+ a11yWindow.getTouchableRegionInWindow(regionInWindow);
+ if (windowMattersToAccessibility(a11yWindow, regionInWindow,
+ unaccountedSpace)) {
+ addPopulatedWindowInfo(a11yWindow, regionInWindow, windows, addedWindows);
+ if (windowMattersToUnaccountedSpaceComputation(a11yWindow)) {
+ updateUnaccountedSpace(a11yWindow, unaccountedSpace);
}
- focusedWindowAdded |= windowState.isFocused();
- } else if (isUntouchableNavigationBar(windowState, mTempRegion1)) {
+ focusedWindowAdded |= a11yWindow.isFocused();
+ } else if (a11yWindow.isUntouchableNavigationBar()) {
// If this widow is navigation bar without touchable region, accounting the
// region of navigation bar inset because all touch events from this region
// would be received by launcher, i.e. this region is a un-touchable one
@@ -1647,47 +1617,39 @@
// Some windows should be excluded from unaccounted space computation, though they still
// should be reported
- private boolean windowMattersToUnaccountedSpaceComputation(WindowState windowState) {
+ private boolean windowMattersToUnaccountedSpaceComputation(AccessibilityWindow a11yWindow) {
// Do not account space of trusted non-touchable windows, except the split-screen
// divider.
// If it's not trusted, touch events are not sent to the windows behind it.
- if (((windowState.mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
- && (windowState.mAttrs.type != TYPE_DOCK_DIVIDER)
- && windowState.isTrustedOverlay()) {
+ if (((a11yWindow.getFlags() & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
+ && (a11yWindow.getType() != TYPE_DOCK_DIVIDER)
+ && a11yWindow.isTrustedOverlay()) {
return false;
}
- if (windowState.mAttrs.type
- == WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
+ if (a11yWindow.getType() == WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
return false;
}
return true;
}
- private boolean windowMattersToAccessibility(WindowState windowState,
- Region regionInScreen, Region unaccountedSpace,
- ArrayList<TaskFragment> skipRemainingWindowsForTaskFragments) {
- final RecentsAnimationController controller = mService.getRecentsAnimationController();
- if (controller != null && controller.shouldIgnoreForAccessibility(windowState)) {
+ private boolean windowMattersToAccessibility(AccessibilityWindow a11yWindow,
+ Region regionInScreen, Region unaccountedSpace) {
+ if (a11yWindow.ignoreRecentsAnimationForAccessibility()) {
return false;
}
- if (windowState.isFocused()) {
+ if (a11yWindow.isFocused()) {
return true;
}
- // If the window is part of a task that we're finished with - ignore.
- final TaskFragment taskFragment = windowState.getTaskFragment();
- if (taskFragment != null
- && skipRemainingWindowsForTaskFragments.contains(taskFragment)) {
- return false;
- }
-
// Ignore non-touchable windows, except the split-screen divider, which is
// occasionally non-touchable but still useful for identifying split-screen
- // mode.
- if (((windowState.mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
- && (windowState.mAttrs.type != TYPE_DOCK_DIVIDER)) {
+ // mode and the PIP menu.
+ if (((a11yWindow.getFlags()
+ & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
+ && (a11yWindow.getType() != TYPE_DOCK_DIVIDER
+ && !a11yWindow.isPIPMenu())) {
return false;
}
@@ -1697,88 +1659,36 @@
}
// Add windows of certain types not covered by modal windows.
- if (isReportedWindowType(windowState.mAttrs.type)) {
+ if (isReportedWindowType(a11yWindow.getType())) {
return true;
}
return false;
}
- private void updateUnaccountedSpace(WindowState windowState, Region regionInScreen,
- Region unaccountedSpace,
- ArrayList<TaskFragment> skipRemainingWindowsForTaskFragments) {
- // Account for the space this window takes if the window
- // is not an accessibility overlay which does not change
- // the reported windows.
- unaccountedSpace.op(regionInScreen, unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
-
- // If a window is modal it prevents other windows from being touched
- if ((windowState.mAttrs.flags & (WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL)) == 0) {
- if (!windowState.hasTapExcludeRegion()) {
- // Account for all space in the task, whether the windows in it are
- // touchable or not. The modal window blocks all touches from the task's
- // area.
- unaccountedSpace.op(windowState.getDisplayFrame(), unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
- } else {
- // If a window has tap exclude region, we need to account it.
- final Region displayRegion = new Region(windowState.getDisplayFrame());
- final Region tapExcludeRegion = new Region();
- windowState.getTapExcludeRegion(tapExcludeRegion);
- displayRegion.op(tapExcludeRegion, displayRegion,
- Region.Op.REVERSE_DIFFERENCE);
- unaccountedSpace.op(displayRegion, unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
- }
-
- final TaskFragment taskFragment = windowState.getTaskFragment();
- if (taskFragment != null) {
- // If the window is associated with a particular task, we can skip the
- // rest of the windows for that task.
- skipRemainingWindowsForTaskFragments.add(taskFragment);
- } else if (!windowState.hasTapExcludeRegion()) {
- // If the window is not associated with a particular task, then it is
- // globally modal. In this case we can skip all remaining windows when
- // it doesn't has tap exclude region.
- unaccountedSpace.setEmpty();
- }
- }
-
- // Account for the space of letterbox.
- if (windowState.areAppWindowBoundsLetterboxed()) {
- unaccountedSpace.op(getLetterboxBounds(windowState), unaccountedSpace,
+ private void updateUnaccountedSpace(AccessibilityWindow a11yWindow,
+ Region unaccountedSpace) {
+ if (a11yWindow.getType()
+ != WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY) {
+ // Account for the space this window takes if the window
+ // is not an accessibility overlay which does not change
+ // the reported windows.
+ final Region touchableRegion = mTempRegion2;
+ a11yWindow.getTouchableRegionInScreen(touchableRegion);
+ unaccountedSpace.op(touchableRegion, unaccountedSpace,
Region.Op.REVERSE_DIFFERENCE);
+ // Account for the space of letterbox.
+ final Region letterboxBounds = mTempRegion1;
+ if (a11yWindow.setLetterBoxBoundsIfNeeded(letterboxBounds)) {
+ unaccountedSpace.op(letterboxBounds,
+ unaccountedSpace, Region.Op.REVERSE_DIFFERENCE);
+ }
}
}
- private void computeWindowRegionInScreen(WindowState windowState, Region outRegion) {
- // Get the touchable frame.
- Region touchableRegion = mTempRegion1;
- windowState.getTouchableRegion(touchableRegion);
-
- // Map the frame to get what appears on the screen.
- Matrix matrix = mTempMatrix;
- populateTransformationMatrix(windowState, matrix);
-
- forEachRect(touchableRegion, rect -> {
- // Move to origin as all transforms are captured by the matrix.
- RectF windowFrame = mTempRectF;
- windowFrame.set(rect);
- windowFrame.offset(-windowState.getFrame().left, -windowState.getFrame().top);
-
- matrix.mapRect(windowFrame);
-
- // Union all rects.
- outRegion.union(new Rect((int) windowFrame.left, (int) windowFrame.top,
- (int) windowFrame.right, (int) windowFrame.bottom));
- });
- }
-
- private static void addPopulatedWindowInfo(WindowState windowState, Region regionInScreen,
- List<WindowInfo> out, Set<IBinder> tokenOut) {
- final WindowInfo window = windowState.getWindowInfo();
+ private static void addPopulatedWindowInfo(AccessibilityWindow a11yWindow,
+ Region regionInScreen, List<WindowInfo> out, Set<IBinder> tokenOut) {
+ final WindowInfo window = a11yWindow.getWindowInfo();
window.regionInScreen.set(regionInScreen);
window.layer = tokenOut.size();
out.add(window);
@@ -1805,23 +1715,6 @@
&& windowType != WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION);
}
- private void populateVisibleWindowsOnScreen(SparseArray<WindowState> outWindows) {
- final List<WindowState> tempWindowStatesList = new ArrayList<>();
- final DisplayContent dc = mService.mRoot.getDisplayContent(mDisplayId);
- if (dc == null) {
- return;
- }
-
- dc.forAllWindows(w -> {
- if (w.isVisible()) {
- tempWindowStatesList.add(w);
- }
- }, false /* traverseTopToBottom */);
- for (int i = 0; i < tempWindowStatesList.size(); i++) {
- outWindows.put(i, tempWindowStatesList.get(i));
- }
- }
-
private WindowState getTopFocusWindow() {
return mService.mRoot.getTopFocusedDisplayContent().mCurrentFocus;
}
diff --git a/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
new file mode 100644
index 0000000..f31ae06
--- /dev/null
+++ b/services/core/java/com/android/server/wm/AccessibilityWindowsPopulator.java
@@ -0,0 +1,625 @@
+/*
+ * 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.
+ */
+
+package com.android.server.wm;
+
+import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
+
+import static com.android.server.wm.utils.RegionUtils.forEachRect;
+
+import android.annotation.NonNull;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Region;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.view.IWindow;
+import android.view.InputWindowHandle;
+import android.view.MagnificationSpec;
+import android.view.WindowInfo;
+import android.view.WindowManager;
+import android.window.WindowInfosListener;
+
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class is the accessibility windows population adapter.
+ */
+public final class AccessibilityWindowsPopulator extends WindowInfosListener {
+
+ private static final String TAG = AccessibilityWindowsPopulator.class.getSimpleName();
+ // If the surface flinger callback is not coming within in 2 frames time, i.e. about
+ // 35ms, then assuming the windows become stable.
+ private static final int SURFACE_FLINGER_CALLBACK_WINDOWS_STABLE_TIMES_MS = 35;
+ // To avoid the surface flinger callbacks always comes within in 2 frames, then no windows
+ // are reported to the A11y framework, and the animation duration time is 500ms, so setting
+ // this value as the max timeout value to force computing changed windows.
+ private static final int WINDOWS_CHANGED_NOTIFICATION_MAX_DURATION_TIMES_MS = 500;
+
+ private static final float[] sTempFloats = new float[9];
+
+ private final WindowManagerService mService;
+ private final AccessibilityController mAccessibilityController;
+ @GuardedBy("mLock")
+ private final SparseArray<List<InputWindowHandle>> mInputWindowHandlesOnDisplays =
+ new SparseArray<>();
+ @GuardedBy("mLock")
+ private final SparseArray<Matrix> mMagnificationSpecInverseMatrix = new SparseArray<>();
+ @GuardedBy("mLock")
+ private final SparseArray<DisplayInfo> mDisplayInfos = new SparseArray<>();
+ @GuardedBy("mLock")
+ private final List<InputWindowHandle> mVisibleWindows = new ArrayList<>();
+ @GuardedBy("mLock")
+ private boolean mWindowsNotificationEnabled = false;
+ private final Object mLock = new Object();
+ private final Handler mHandler;
+
+ AccessibilityWindowsPopulator(WindowManagerService service,
+ AccessibilityController accessibilityController) {
+ mService = service;
+ mAccessibilityController = accessibilityController;
+ mHandler = new MyHandler(mService.mH.getLooper());
+
+ register();
+ }
+
+ /**
+ * Gets the visible windows list with the window layer on the specified display.
+ *
+ * @param displayId The display.
+ * @param outWindows The visible windows list. The z-order of each window in the list
+ * is from the top to bottom.
+ */
+ public void populateVisibleWindowsOnScreenLocked(int displayId,
+ List<AccessibilityWindow> outWindows) {
+ List<InputWindowHandle> inputWindowHandles;
+ final Matrix inverseMatrix = new Matrix();
+ final Matrix displayMatrix = new Matrix();
+
+ synchronized (mLock) {
+ inputWindowHandles = mInputWindowHandlesOnDisplays.get(displayId);
+ if (inputWindowHandles == null) {
+ outWindows.clear();
+
+ return;
+ }
+ inverseMatrix.set(mMagnificationSpecInverseMatrix.get(displayId));
+
+ final DisplayInfo displayInfo = mDisplayInfos.get(displayId);
+ if (displayInfo != null) {
+ displayMatrix.set(displayInfo.mTransform);
+ } else {
+ Slog.w(TAG, "The displayInfo of this displayId (" + displayId + ") called "
+ + "back from the surface fligner is null");
+ }
+ }
+
+ final DisplayContent dc = mService.mRoot.getDisplayContent(displayId);
+ final ShellRoot shellroot = dc.mShellRoots.get(WindowManager.SHELL_ROOT_LAYER_PIP);
+ final IBinder pipMenuIBinder =
+ shellroot != null ? shellroot.getAccessibilityWindowToken() : null;
+
+ for (final InputWindowHandle windowHandle : inputWindowHandles) {
+ final AccessibilityWindow accessibilityWindow =
+ AccessibilityWindow.initializeData(mService, windowHandle, inverseMatrix,
+ pipMenuIBinder, displayMatrix);
+
+ outWindows.add(accessibilityWindow);
+ }
+ }
+
+ @Override
+ public void onWindowInfosChanged(InputWindowHandle[] windowHandles,
+ DisplayInfo[] displayInfos) {
+ synchronized (mLock) {
+ mVisibleWindows.clear();
+ for (InputWindowHandle window : windowHandles) {
+ if (window.visible && window.getWindow() != null) {
+ mVisibleWindows.add(window);
+ }
+ }
+
+ mDisplayInfos.clear();
+ for (final DisplayInfo displayInfo : displayInfos) {
+ mDisplayInfos.put(displayInfo.mDisplayId, displayInfo);
+ }
+
+ if (mWindowsNotificationEnabled) {
+ if (!mHandler.hasMessages(
+ MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT)) {
+ mHandler.sendEmptyMessageDelayed(
+ MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT,
+ WINDOWS_CHANGED_NOTIFICATION_MAX_DURATION_TIMES_MS);
+ }
+ populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked();
+ }
+ }
+ }
+
+ /**
+ * Sets to notify the accessibilityController to compute changed windows on
+ * the display after populating the visible windows if the windows reported
+ * from the surface flinger changes.
+ *
+ * @param register {@code true} means starting windows population.
+ */
+ public void setWindowsNotification(boolean register) {
+ synchronized (mLock) {
+ if (mWindowsNotificationEnabled == register) {
+ return;
+ }
+ mWindowsNotificationEnabled = register;
+ if (mWindowsNotificationEnabled) {
+ populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked();
+ } else {
+ releaseResources();
+ }
+ }
+ }
+
+ private void populateVisibleWindowHandlesAndNotifyWindowsChangeIfNeededLocked() {
+ final SparseArray<List<InputWindowHandle>> tempWindowHandleList = new SparseArray<>();
+
+ for (final InputWindowHandle windowHandle : mVisibleWindows) {
+ List<InputWindowHandle> inputWindowHandles = tempWindowHandleList.get(
+ windowHandle.displayId);
+
+ if (inputWindowHandles == null) {
+ inputWindowHandles = new ArrayList<>();
+ tempWindowHandleList.put(windowHandle.displayId, inputWindowHandles);
+ generateMagnificationSpecInverseMatrixLocked(windowHandle.displayId);
+ }
+ inputWindowHandles.add(windowHandle);
+ }
+
+ final List<Integer> displayIdsForWindowsChanged = new ArrayList<>();
+
+ getDisplaysForWindowsChangedLocked(displayIdsForWindowsChanged, tempWindowHandleList,
+ mInputWindowHandlesOnDisplays);
+ // Clones all windows from the callback of the surface flinger.
+ mInputWindowHandlesOnDisplays.clear();
+ for (int i = 0; i < tempWindowHandleList.size(); i++) {
+ final int displayId = tempWindowHandleList.keyAt(i);
+ mInputWindowHandlesOnDisplays.put(displayId, tempWindowHandleList.get(displayId));
+ }
+
+ if (displayIdsForWindowsChanged.size() > 0) {
+ if (!mHandler.hasMessages(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED)) {
+ mHandler.obtainMessage(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED,
+ displayIdsForWindowsChanged).sendToTarget();
+ }
+
+ return;
+ }
+ mHandler.removeMessages(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE);
+ mHandler.sendEmptyMessageDelayed(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE,
+ SURFACE_FLINGER_CALLBACK_WINDOWS_STABLE_TIMES_MS);
+ }
+
+ private void getDisplaysForWindowsChangedLocked(List<Integer> outDisplayIdsForWindowsChanged,
+ SparseArray<List<InputWindowHandle>> newWindowsList,
+ SparseArray<List<InputWindowHandle>> oldWindowsList) {
+ for (int i = 0; i < newWindowsList.size(); i++) {
+ final int displayId = newWindowsList.keyAt(i);
+ final List<InputWindowHandle> newWindows = newWindowsList.get(displayId);
+ final List<InputWindowHandle> oldWindows = oldWindowsList.get(displayId);
+
+ if (hasWindowsChangedLocked(newWindows, oldWindows)) {
+ outDisplayIdsForWindowsChanged.add(displayId);
+ }
+ }
+ }
+
+ private boolean hasWindowsChangedLocked(List<InputWindowHandle> newWindows,
+ List<InputWindowHandle> oldWindows) {
+ if (oldWindows == null || oldWindows.size() != newWindows.size()) {
+ return true;
+ }
+
+ final int windowsCount = newWindows.size();
+ // Since we always traverse windows from high to low layer,
+ // the old and new windows at the same index should be the
+ // same, otherwise something changed.
+ for (int i = 0; i < windowsCount; i++) {
+ final InputWindowHandle newWindow = newWindows.get(i);
+ final InputWindowHandle oldWindow = oldWindows.get(i);
+
+ if (!newWindow.getWindow().asBinder().equals(oldWindow.getWindow().asBinder())) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private void generateMagnificationSpecInverseMatrixLocked(int displayId) {
+ MagnificationSpec spec = new MagnificationSpec();
+ if (!mAccessibilityController.getMagnificationSpecForDisplay(displayId, spec)) {
+ return;
+ }
+ sTempFloats[Matrix.MSCALE_X] = spec.scale;
+ sTempFloats[Matrix.MSKEW_Y] = 0;
+ sTempFloats[Matrix.MSKEW_X] = 0;
+ sTempFloats[Matrix.MSCALE_Y] = spec.scale;
+ sTempFloats[Matrix.MTRANS_X] = spec.offsetX;
+ sTempFloats[Matrix.MTRANS_Y] = spec.offsetY;
+ sTempFloats[Matrix.MPERSP_0] = 0;
+ sTempFloats[Matrix.MPERSP_1] = 0;
+ sTempFloats[Matrix.MPERSP_2] = 1;
+
+ final Matrix tempMatrix = new Matrix();
+ tempMatrix.setValues(sTempFloats);
+
+ final Matrix inverseMatrix = new Matrix();
+ final boolean result = tempMatrix.invert(inverseMatrix);
+
+ if (!result) {
+ Slog.e(TAG, "Can't inverse the magnification spec matrix with the "
+ + "magnification spec = " + spec + " on the displayId = " + displayId);
+ return;
+ }
+ mMagnificationSpecInverseMatrix.set(displayId, inverseMatrix);
+ }
+
+ private void notifyWindowsChanged(@NonNull List<Integer> displayIdsForWindowsChanged) {
+ mHandler.removeMessages(MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT);
+
+ for (int i = 0; i < displayIdsForWindowsChanged.size(); i++) {
+ mAccessibilityController.performComputeChangedWindowsNot(
+ displayIdsForWindowsChanged.get(i), false);
+ }
+ }
+
+ private void forceUpdateWindows() {
+ final List<Integer> displayIdsForWindowsChanged = new ArrayList<>();
+
+ synchronized (mLock) {
+ for (int i = 0; i < mInputWindowHandlesOnDisplays.size(); i++) {
+ final int displayId = mInputWindowHandlesOnDisplays.keyAt(i);
+ displayIdsForWindowsChanged.add(displayId);
+ }
+ }
+ notifyWindowsChanged(displayIdsForWindowsChanged);
+ }
+
+ @GuardedBy("mLock")
+ private void releaseResources() {
+ mInputWindowHandlesOnDisplays.clear();
+ mMagnificationSpecInverseMatrix.clear();
+ mVisibleWindows.clear();
+ mDisplayInfos.clear();
+ mWindowsNotificationEnabled = false;
+ mHandler.removeCallbacksAndMessages(null);
+ }
+
+ private class MyHandler extends Handler {
+ public static final int MESSAGE_NOTIFY_WINDOWS_CHANGED = 1;
+ public static final int MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE = 2;
+ public static final int MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT = 3;
+
+ MyHandler(Looper looper) {
+ super(looper, null, false);
+ }
+
+ @Override
+ public void handleMessage(Message message) {
+ switch (message.what) {
+ case MESSAGE_NOTIFY_WINDOWS_CHANGED: {
+ final List<Integer> displayIdsForWindowsChanged = (List<Integer>) message.obj;
+ notifyWindowsChanged(displayIdsForWindowsChanged);
+ } break;
+
+ case MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE: {
+ forceUpdateWindows();
+ } break;
+
+ case MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_TIMEOUT: {
+ Slog.w(TAG, "Windows change within in 2 frames continuously over 500 ms "
+ + "and notify windows changed immediately");
+ mHandler.removeMessages(
+ MyHandler.MESSAGE_NOTIFY_WINDOWS_CHANGED_BY_UI_STABLE);
+
+ forceUpdateWindows();
+ } break;
+ }
+ }
+ }
+
+ /**
+ * This class represents information about a window from the
+ * surface flinger to the accessibility framework.
+ */
+ public static class AccessibilityWindow {
+ private static final Region TEMP_REGION = new Region();
+ private static final RectF TEMP_RECTF = new RectF();
+ // Data
+ private IWindow mWindow;
+ private int mDisplayId;
+ private int mFlags;
+ private int mType;
+ private int mPrivateFlags;
+ private boolean mIsPIPMenu;
+ private boolean mIsFocused;
+ private boolean mShouldMagnify;
+ private boolean mIgnoreDuetoRecentsAnimation;
+ private boolean mIsTrustedOverlay;
+ private final Region mTouchableRegionInScreen = new Region();
+ private final Region mTouchableRegionInWindow = new Region();
+ private final Region mLetterBoxBounds = new Region();
+ private WindowInfo mWindowInfo;
+
+ /**
+ * Returns the instance after initializing the internal data.
+ * @param service The window manager service.
+ * @param inputWindowHandle The window from the surface flinger.
+ * @param inverseMatrix The magnification spec inverse matrix.
+ */
+ public static AccessibilityWindow initializeData(WindowManagerService service,
+ InputWindowHandle inputWindowHandle, Matrix inverseMatrix, IBinder pipIBinder,
+ Matrix displayMatrix) {
+ final IWindow window = inputWindowHandle.getWindow();
+ final WindowState windowState = window != null ? service.mWindowMap.get(
+ window.asBinder()) : null;
+
+ final AccessibilityWindow instance = new AccessibilityWindow();
+
+ instance.mWindow = inputWindowHandle.getWindow();
+ instance.mDisplayId = inputWindowHandle.displayId;
+ instance.mFlags = inputWindowHandle.layoutParamsFlags;
+ instance.mType = inputWindowHandle.layoutParamsType;
+ instance.mIsPIPMenu = inputWindowHandle.getWindow().asBinder().equals(pipIBinder);
+
+ // TODO (b/199357848): gets the private flag of the window from other way.
+ instance.mPrivateFlags = windowState != null ? windowState.mAttrs.privateFlags : 0;
+ // TODO (b/199358208) : using new way to implement the focused window.
+ instance.mIsFocused = windowState != null && windowState.isFocused();
+ instance.mShouldMagnify = windowState == null || windowState.shouldMagnify();
+
+ final RecentsAnimationController controller = service.getRecentsAnimationController();
+ instance.mIgnoreDuetoRecentsAnimation = windowState != null && controller != null
+ && controller.shouldIgnoreForAccessibility(windowState);
+ instance.mIsTrustedOverlay = inputWindowHandle.trustedOverlay;
+
+ // TODO (b/199358388) : gets the letterbox bounds of the window from other way.
+ if (windowState != null && windowState.areAppWindowBoundsLetterboxed()) {
+ getLetterBoxBounds(windowState, instance.mLetterBoxBounds);
+ }
+
+ final Rect windowFrame = new Rect(inputWindowHandle.frameLeft,
+ inputWindowHandle.frameTop, inputWindowHandle.frameRight,
+ inputWindowHandle.frameBottom);
+ getTouchableRegionInWindow(instance.mShouldMagnify, inputWindowHandle.touchableRegion,
+ instance.mTouchableRegionInWindow, windowFrame, inverseMatrix, displayMatrix);
+ getUnMagnifiedTouchableRegion(instance.mShouldMagnify,
+ inputWindowHandle.touchableRegion, instance.mTouchableRegionInScreen,
+ inverseMatrix, displayMatrix);
+ instance.mWindowInfo = windowState != null
+ ? windowState.getWindowInfo() : getWindowInfoForWindowlessWindows(instance);
+
+ return instance;
+ }
+
+ /**
+ * Returns the touchable region in the screen.
+ * @param outRegion The touchable region.
+ */
+ public void getTouchableRegionInScreen(Region outRegion) {
+ outRegion.set(mTouchableRegionInScreen);
+ }
+
+ /**
+ * Returns the touchable region in the window.
+ * @param outRegion The touchable region.
+ */
+ public void getTouchableRegionInWindow(Region outRegion) {
+ outRegion.set(mTouchableRegionInWindow);
+ }
+
+ /**
+ * @return the layout parameter flag {@link android.view.WindowManager.LayoutParams#flags}.
+ */
+ public int getFlags() {
+ return mFlags;
+ }
+
+ /**
+ * @return the layout parameter type {@link android.view.WindowManager.LayoutParams#type}.
+ */
+ public int getType() {
+ return mType;
+ }
+
+ /**
+ * @return the layout parameter private flag
+ * {@link android.view.WindowManager.LayoutParams#privateFlags}.
+ */
+ public int getPrivateFlag() {
+ return mPrivateFlags;
+ }
+
+ /**
+ * @return the windowInfo {@link WindowInfo}.
+ */
+ public WindowInfo getWindowInfo() {
+ return mWindowInfo;
+ }
+
+ /**
+ * Gets the letter box bounds if activity bounds are letterboxed
+ * or letterboxed for display cutout.
+ *
+ * @return {@code true} there's a letter box bounds.
+ */
+ public Boolean setLetterBoxBoundsIfNeeded(Region outBounds) {
+ if (mLetterBoxBounds.isEmpty()) {
+ return false;
+ }
+
+ outBounds.set(mLetterBoxBounds);
+ return true;
+ }
+
+ /**
+ * @return true if this window should be magnified.
+ */
+ public boolean shouldMagnify() {
+ return mShouldMagnify;
+ }
+
+ /**
+ * @return true if this window is focused.
+ */
+ public boolean isFocused() {
+ return mIsFocused;
+ }
+
+ /**
+ * @return true if it's running the recent animation but not the target app.
+ */
+ public boolean ignoreRecentsAnimationForAccessibility() {
+ return mIgnoreDuetoRecentsAnimation;
+ }
+
+ /**
+ * @return true if this window is the trusted overlay.
+ */
+ public boolean isTrustedOverlay() {
+ return mIsTrustedOverlay;
+ }
+
+ /**
+ * @return true if this window is the navigation bar with the gesture mode.
+ */
+ public boolean isUntouchableNavigationBar() {
+ if (mType != WindowManager.LayoutParams.TYPE_NAVIGATION_BAR) {
+ return false;
+ }
+
+ return mTouchableRegionInScreen.isEmpty();
+ }
+
+ /**
+ * @return true if this window is PIP menu.
+ */
+ public boolean isPIPMenu() {
+ return mIsPIPMenu;
+ }
+
+ private static void getTouchableRegionInWindow(boolean shouldMagnify, Region inRegion,
+ Region outRegion, Rect frame, Matrix inverseMatrix, Matrix displayMatrix) {
+ // Some modal windows, like the activity with Theme.dialog, has the full screen
+ // as its touchable region, but its window frame is smaller than the touchable
+ // region. The region we report should be the touchable area in the window frame
+ // for the consistency and match developers expectation.
+ // So we need to make the intersection between the frame and touchable region to
+ // obtain the real touch region in the screen.
+ Region touchRegion = TEMP_REGION;
+ touchRegion.set(inRegion);
+ touchRegion.op(frame, Region.Op.INTERSECT);
+
+ getUnMagnifiedTouchableRegion(shouldMagnify, touchRegion, outRegion, inverseMatrix,
+ displayMatrix);
+ }
+
+ /**
+ * Gets the un-magnified touchable region. If this window can be magnified and magnifying,
+ * we will transform the input touchable region by applying the inverse matrix of the
+ * magnification spec to get the un-magnified touchable region.
+ * @param shouldMagnify The window can be magnified.
+ * @param inRegion The touchable region of this window.
+ * @param outRegion The un-magnified touchable region of this window.
+ * @param inverseMatrix The inverse matrix of the magnification spec.
+ * @param displayMatrix The display transform matrix which takes display coordinates to
+ * logical display coordinates.
+ */
+ private static void getUnMagnifiedTouchableRegion(boolean shouldMagnify, Region inRegion,
+ Region outRegion, Matrix inverseMatrix, Matrix displayMatrix) {
+ if ((!shouldMagnify || inverseMatrix.isIdentity()) && displayMatrix.isIdentity()) {
+ outRegion.set(inRegion);
+ return;
+ }
+
+ forEachRect(inRegion, rect -> {
+ // Move to origin as all transforms are captured by the matrix.
+ RectF windowFrame = TEMP_RECTF;
+ windowFrame.set(rect);
+
+ inverseMatrix.mapRect(windowFrame);
+ displayMatrix.mapRect(windowFrame);
+ // Union all rects.
+ outRegion.union(new Rect((int) windowFrame.left, (int) windowFrame.top,
+ (int) windowFrame.right, (int) windowFrame.bottom));
+ });
+ }
+
+ private static WindowInfo getWindowInfoForWindowlessWindows(AccessibilityWindow window) {
+ WindowInfo windowInfo = WindowInfo.obtain();
+ windowInfo.displayId = window.mDisplayId;
+ windowInfo.type = window.mType;
+ windowInfo.token = window.mWindow.asBinder();
+ windowInfo.hasFlagWatchOutsideTouch = (window.mFlags
+ & WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH) != 0;
+ windowInfo.inPictureInPicture = false;
+
+ // There only are two windowless windows now, one is split window, and the other
+ // one is PIP.
+ if (windowInfo.type == TYPE_DOCK_DIVIDER) {
+ windowInfo.title = "Splitscreen Divider";
+ } else if (window.mIsPIPMenu) {
+ windowInfo.title = "Picture-in-Picture menu";
+ }
+ return windowInfo;
+ }
+
+ private static void getLetterBoxBounds(WindowState windowState, Region outRegion) {
+ final Rect letterboxInsets = windowState.mActivityRecord.getLetterboxInsets();
+ final Rect nonLetterboxRect = windowState.getBounds();
+
+ nonLetterboxRect.inset(letterboxInsets);
+ outRegion.set(windowState.getBounds());
+ outRegion.op(nonLetterboxRect, Region.Op.DIFFERENCE);
+ }
+
+ @Override
+ public String toString() {
+ String builder = "A11yWindow=[" + mWindow.asBinder()
+ + ", displayId=" + mDisplayId
+ + ", flag=0x" + Integer.toHexString(mFlags)
+ + ", type=" + mType
+ + ", privateFlag=0x" + Integer.toHexString(mPrivateFlags)
+ + ", focused=" + mIsFocused
+ + ", shouldMagnify=" + mShouldMagnify
+ + ", ignoreDuetoRecentsAnimation=" + mIgnoreDuetoRecentsAnimation
+ + ", isTrustedOverlay=" + mIsTrustedOverlay
+ + ", regionInScreen=" + mTouchableRegionInScreen
+ + ", touchableRegion=" + mTouchableRegionInWindow
+ + ", letterBoxBounds=" + mLetterBoxBounds
+ + ", isPIPMenu=" + mIsPIPMenu
+ + ", windowInfo=" + mWindowInfo
+ + "]";
+
+ return builder;
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/wm/ActivityInterceptorCallback.java b/services/core/java/com/android/server/wm/ActivityInterceptorCallback.java
index 30cd3c4..1bb9ca7 100644
--- a/services/core/java/com/android/server/wm/ActivityInterceptorCallback.java
+++ b/services/core/java/com/android/server/wm/ActivityInterceptorCallback.java
@@ -54,6 +54,7 @@
@IntDef(suffix = { "_ORDERED_ID" }, value = {
FIRST_ORDERED_ID,
COMMUNAL_MODE_ORDERED_ID,
+ PERMISSION_POLICY_ORDERED_ID,
LAST_ORDERED_ID // Update this when adding new ids
})
@Retention(RetentionPolicy.SOURCE)
@@ -70,10 +71,15 @@
public static final int COMMUNAL_MODE_ORDERED_ID = 1;
/**
+ * The identifier for {@link com.android.server.policy.PermissionPolicyService} interceptor
+ */
+ public static final int PERMISSION_POLICY_ORDERED_ID = 2;
+
+ /**
* The final id, used by the framework to determine the valid range of ids. Update this when
* adding new ids.
*/
- static final int LAST_ORDERED_ID = COMMUNAL_MODE_ORDERED_ID;
+ static final int LAST_ORDERED_ID = PERMISSION_POLICY_ORDERED_ID;
/**
* Data class for storing the various arguments needed for activity interception.
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index a9142ef..23508d9 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -687,4 +687,7 @@
/** Get the most recent task excluding the first running task (the one on the front most). */
public abstract ActivityManager.RecentTaskInfo getMostRecentTaskFromBackground();
+
+ /** Get the app tasks for a package */
+ public abstract List<ActivityManager.AppTask> getAppTasks(String pkgName, int uid);
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 15ebe28..ddd624d 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -135,6 +135,7 @@
import android.app.IActivityClientController;
import android.app.IActivityController;
import android.app.IActivityTaskManager;
+import android.app.IAppTask;
import android.app.IApplicationThread;
import android.app.IAssistDataReceiver;
import android.app.INotificationManager;
@@ -436,9 +437,9 @@
private static final long START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT =
START_AS_CALLER_TOKEN_TIMEOUT_IMPL + 20 * MINUTE_IN_MILLIS;
- // Activity tokens of system activities that are delegating their call to
- // #startActivityByCaller, keyed by the permissionToken granted to the delegate.
- final HashMap<IBinder, IBinder> mStartActivitySources = new HashMap<>();
+ // The component name of the delegated activities that are allowed to call
+ // #startActivityAsCaller with the one-time used permission token.
+ final HashMap<IBinder, ComponentName> mStartActivitySources = new HashMap<>();
// Permission tokens that have expired, but we remember for error reporting.
final ArrayList<IBinder> mExpiredStartAsCallerTokens = new ArrayList<>();
@@ -1512,7 +1513,7 @@
}
@Override
- public IBinder requestStartActivityPermissionToken(IBinder delegatorToken) {
+ public IBinder requestStartActivityPermissionToken(ComponentName componentName) {
int callingUid = Binder.getCallingUid();
if (UserHandle.getAppId(callingUid) != SYSTEM_UID) {
throw new SecurityException("Only the system process can request a permission token, "
@@ -1520,7 +1521,7 @@
}
IBinder permissionToken = new Binder();
synchronized (mGlobalLock) {
- mStartActivitySources.put(permissionToken, delegatorToken);
+ mStartActivitySources.put(permissionToken, componentName);
}
Message expireMsg = PooledLambda.obtainMessage(
@@ -1545,7 +1546,7 @@
// 1) The caller is an activity that is part of the core framework, and then only when it
// is running as the system.
// 2) The caller provides a valid permissionToken. Permission tokens are one-time use and
- // can only be requested by a system activity, which may then delegate this call to
+ // can only be requested from system uid, which may then delegate this call to
// another app.
final ActivityRecord sourceRecord;
final int targetUid;
@@ -1556,18 +1557,26 @@
if (resultTo == null) {
throw new SecurityException("Must be called from an activity");
}
- final IBinder sourceToken;
+
+ sourceRecord = ActivityRecord.isInAnyTask(resultTo);
+ if (sourceRecord == null) {
+ throw new SecurityException("Called with bad activity token: " + resultTo);
+ }
+ if (sourceRecord.app == null) {
+ throw new SecurityException("Called without a process attached to activity");
+ }
+
+ final ComponentName componentName;
if (permissionToken != null) {
// To even attempt to use a permissionToken, an app must also have this signature
// permission.
mAmInternal.enforceCallingPermission(
android.Manifest.permission.START_ACTIVITY_AS_CALLER,
"startActivityAsCaller");
- // If called with a permissionToken, we want the sourceRecord from the delegator
- // activity that requested this token.
- sourceToken = mStartActivitySources.remove(permissionToken);
- if (sourceToken == null) {
- // Invalid permissionToken, check if it recently expired.
+ // If called with a permissionToken, the caller must be the same component that
+ // was allowed to use the permissionToken.
+ componentName = mStartActivitySources.remove(permissionToken);
+ if (!sourceRecord.mActivityComponent.equals(componentName)) {
if (mExpiredStartAsCallerTokens.contains(permissionToken)) {
throw new SecurityException("Called with expired permission token: "
+ permissionToken);
@@ -1577,33 +1586,21 @@
}
}
} else {
- // This method was called directly by the source.
- sourceToken = resultTo;
- }
-
- sourceRecord = ActivityRecord.isInAnyTask(sourceToken);
- if (sourceRecord == null) {
- throw new SecurityException("Called with bad activity token: " + sourceToken);
- }
- if (sourceRecord.app == null) {
- throw new SecurityException("Called without a process attached to activity");
- }
-
- // Whether called directly or from a delegate, the source activity must be from the
- // android package.
- if (!sourceRecord.info.packageName.equals("android")) {
- throw new SecurityException("Must be called from an activity that is "
- + "declared in the android package");
- }
-
- if (UserHandle.getAppId(sourceRecord.app.mUid) != SYSTEM_UID) {
- // This is still okay, as long as this activity is running under the
- // uid of the original calling activity.
- if (sourceRecord.app.mUid != sourceRecord.launchedFromUid) {
- throw new SecurityException(
- "Calling activity in uid " + sourceRecord.app.mUid
- + " must be system uid or original calling uid "
- + sourceRecord.launchedFromUid);
+ // Whether called directly or from a delegate, the source activity must be from the
+ // android package.
+ if (!sourceRecord.info.packageName.equals("android")) {
+ throw new SecurityException("Must be called from an activity that is "
+ + "declared in the android package");
+ }
+ if (UserHandle.getAppId(sourceRecord.app.mUid) != SYSTEM_UID) {
+ // This is still okay, as long as this activity is running under the
+ // uid of the original calling activity.
+ if (sourceRecord.app.mUid != sourceRecord.launchedFromUid) {
+ throw new SecurityException(
+ "Calling activity in uid " + sourceRecord.app.mUid
+ + " must be system uid or original calling uid "
+ + sourceRecord.launchedFromUid);
+ }
}
}
if (ignoreTargetSecurity) {
@@ -2558,12 +2555,15 @@
@Override
public List<IBinder> getAppTasks(String callingPackage) {
- int callingUid = Binder.getCallingUid();
assertPackageMatchesCallingUid(callingPackage);
+ return getAppTasks(callingPackage, Binder.getCallingUid());
+ }
+
+ private List<IBinder> getAppTasks(String pkgName, int uid) {
final long ident = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
- return mRecentTasks.getAppTasksList(callingUid, callingPackage);
+ return mRecentTasks.getAppTasksList(uid, pkgName);
}
} finally {
Binder.restoreCallingIdentity(ident);
@@ -6668,5 +6668,16 @@
}
return targetTask;
}
+
+ @Override
+ public List<ActivityManager.AppTask> getAppTasks(String pkgName, int uid) {
+ ArrayList<ActivityManager.AppTask> tasks = new ArrayList<>();
+ List<IBinder> appTasks = ActivityTaskManagerService.this.getAppTasks(pkgName, uid);
+ int numAppTasks = appTasks.size();
+ for (int i = 0; i < numAppTasks; i++) {
+ tasks.add(new ActivityManager.AppTask(IAppTask.Stub.asInterface(appTasks.get(i))));
+ }
+ return tasks;
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java
index 3d37278..475a9fb 100644
--- a/services/core/java/com/android/server/wm/AppTransitionController.java
+++ b/services/core/java/com/android/server/wm/AppTransitionController.java
@@ -799,19 +799,18 @@
}
/**
- * Returns {@code true} if a given {@link WindowContainer} is an embedded Task.
+ * Returns {@code true} if a given {@link WindowContainer} is an embedded Task in
+ * {@link com.android.wm.shell.TaskView}.
*
* Note that this is a short term workaround to support Android Auto until it migrate to
* ShellTransition. This should only be used by {@link #getAnimationTargets}.
*
* TODO(b/213312721): Remove this predicate and its callers once ShellTransition is enabled.
*/
- private static boolean isEmbeddedTask(WindowContainer wc) {
+ private static boolean isTaskViewTask(WindowContainer wc) {
// We use Task#mRemoveWithTaskOrganizer to identify an embedded Task, but this is a hack and
// it is not guaranteed to work this logic in the future version.
- return !WindowManagerService.sEnableShellTransitions
- && wc instanceof Task
- && ((Task) wc).mRemoveWithTaskOrganizer;
+ return wc instanceof Task && ((Task) wc).mRemoveWithTaskOrganizer;
}
/**
@@ -860,7 +859,7 @@
siblings.add(current);
boolean canPromote = true;
- if (isEmbeddedTask(current)) {
+ if (isTaskViewTask(current)) {
// Don't animate an embedded Task in app transition. This is a short term workaround
// to prevent conflict of surface hierarchy changes between legacy app transition
// and TaskView (b/205189147).
@@ -909,7 +908,7 @@
for (int j = 0; j < parent.getChildCount(); ++j) {
final WindowContainer sibling = parent.getChildAt(j);
if (candidates.remove(sibling)) {
- if (!isEmbeddedTask(sibling)) {
+ if (!isTaskViewTask(sibling)) {
// Don't animate an embedded Task in app transition. This is a short
// term workaround to prevent conflict of surface hierarchy changes
// between legacy app transition and TaskView (b/205189147).
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index c740f7b..55f463d 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -4198,10 +4198,10 @@
final SurfaceControl newParent = computeImeParent();
if (newParent != null && newParent != mInputMethodSurfaceParent) {
mInputMethodSurfaceParent = newParent;
- getPendingTransaction().reparent(mImeWindowsContainer.mSurfaceControl, newParent);
+ getSyncTransaction().reparent(mImeWindowsContainer.mSurfaceControl, newParent);
// When surface parent is removed, the relative layer will also be removed. We need to
// do a force update to make sure there is a layer set for the new parent.
- assignRelativeLayerForIme(getPendingTransaction(), true /* forceUpdate */);
+ assignRelativeLayerForIme(getSyncTransaction(), true /* forceUpdate */);
scheduleAnimation();
}
}
@@ -4995,8 +4995,11 @@
// exists so it get's layered above the starting window.
if (imeTarget != null && !(imeTarget.mActivityRecord != null
&& imeTarget.mActivityRecord.hasStartingWindow())) {
+ final WindowToken imeControlTargetToken =
+ mImeControlTarget != null && mImeControlTarget.getWindow() != null
+ ? mImeControlTarget.getWindow().mToken : null;
final boolean canImeTargetSetRelativeLayer = imeTarget.getSurfaceControl() != null
- && imeTarget == mImeControlTarget
+ && imeTarget.mToken == imeControlTargetToken
&& !imeTarget.inMultiWindowMode()
&& imeTarget.mToken.getActivity(app -> app.isAnimating(TRANSITION | PARENTS,
ANIMATION_TYPE_ALL & ~ANIMATION_TYPE_RECENTS)) == null;
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 49a51d5..f0e8b8f 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -405,7 +405,7 @@
WindowState targetBar = (msg.arg1 == MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS)
? getStatusBar() : getNavigationBar();
if (targetBar != null) {
- requestTransientBars(targetBar);
+ requestTransientBars(targetBar, true /* isGestureOnSystemBar */);
}
}
break;
@@ -448,26 +448,25 @@
// TODO(b/181821798) Migrate SystemGesturesPointerEventListener to use window context.
mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler,
new SystemGesturesPointerEventListener.Callbacks() {
+
@Override
public void onSwipeFromTop() {
synchronized (mLock) {
- if (mStatusBar != null) {
- requestTransientBars(mStatusBar);
- }
- checkAltBarSwipeForTransientBars(ALT_BAR_TOP,
- false /* allowForAllPositions */);
+ final WindowState bar = mStatusBar != null
+ ? mStatusBar
+ : findAltBarMatchingPosition(ALT_BAR_TOP);
+ requestTransientBars(bar, true /* isGestureOnSystemBar */);
}
}
@Override
public void onSwipeFromBottom() {
synchronized (mLock) {
- if (mNavigationBar != null
- && mNavigationBarPosition == NAV_BAR_BOTTOM) {
- requestTransientBars(mNavigationBar);
- }
- checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM,
- false /* allowForAllPositions */);
+ final WindowState bar = mNavigationBar != null
+ && mNavigationBarPosition == NAV_BAR_BOTTOM
+ ? mNavigationBar
+ : findAltBarMatchingPosition(ALT_BAR_BOTTOM);
+ requestTransientBars(bar, true /* isGestureOnSystemBar */);
}
}
@@ -477,13 +476,8 @@
synchronized (mLock) {
mDisplayContent.calculateSystemGestureExclusion(
excludedRegion, null /* outUnrestricted */);
- final boolean allowSideSwipe = mNavigationBarAlwaysShowOnSideGesture &&
- !mSystemGestures.currentGestureStartedInRegion(excludedRegion);
- if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT
- || allowSideSwipe)) {
- requestTransientBars(mNavigationBar);
- }
- checkAltBarSwipeForTransientBars(ALT_BAR_RIGHT, allowSideSwipe);
+ requestTransientBarsForSideSwipe(excludedRegion, NAV_BAR_RIGHT,
+ ALT_BAR_RIGHT);
}
excludedRegion.recycle();
}
@@ -494,17 +488,33 @@
synchronized (mLock) {
mDisplayContent.calculateSystemGestureExclusion(
excludedRegion, null /* outUnrestricted */);
- final boolean allowSideSwipe = mNavigationBarAlwaysShowOnSideGesture &&
- !mSystemGestures.currentGestureStartedInRegion(excludedRegion);
- if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT
- || allowSideSwipe)) {
- requestTransientBars(mNavigationBar);
- }
- checkAltBarSwipeForTransientBars(ALT_BAR_LEFT, allowSideSwipe);
+ requestTransientBarsForSideSwipe(excludedRegion, NAV_BAR_LEFT,
+ ALT_BAR_LEFT);
}
excludedRegion.recycle();
}
+ private void requestTransientBarsForSideSwipe(Region excludedRegion,
+ int navBarSide, int altBarSide) {
+ final WindowState barMatchingSide = mNavigationBar != null
+ && mNavigationBarPosition == navBarSide
+ ? mNavigationBar
+ : findAltBarMatchingPosition(altBarSide);
+ final boolean allowSideSwipe = mNavigationBarAlwaysShowOnSideGesture &&
+ !mSystemGestures.currentGestureStartedInRegion(excludedRegion);
+ if (barMatchingSide == null && !allowSideSwipe) {
+ return;
+ }
+
+ // Request transient bars on the matching bar, or any bar if we always allow
+ // side swipes to show the bars
+ final boolean isGestureOnSystemBar = barMatchingSide != null;
+ final WindowState bar = barMatchingSide != null
+ ? barMatchingSide
+ : findTransientNavOrAltBar();
+ requestTransientBars(bar, isGestureOnSystemBar);
+ }
+
@Override
public void onFling(int duration) {
if (mService.mPowerManagerInternal != null) {
@@ -654,21 +664,39 @@
mHandler.post(mGestureNavigationSettingsObserver::register);
}
- private void checkAltBarSwipeForTransientBars(@WindowManagerPolicy.AltBarPosition int pos,
- boolean allowForAllPositions) {
- if (mStatusBarAlt != null && (mStatusBarAltPosition == pos || allowForAllPositions)) {
- requestTransientBars(mStatusBarAlt);
+ /**
+ * Returns the first non-null alt bar window matching the given position.
+ */
+ private WindowState findAltBarMatchingPosition(@WindowManagerPolicy.AltBarPosition int pos) {
+ if (mStatusBarAlt != null && mStatusBarAltPosition == pos) {
+ return mStatusBarAlt;
}
- if (mNavigationBarAlt != null
- && (mNavigationBarAltPosition == pos || allowForAllPositions)) {
- requestTransientBars(mNavigationBarAlt);
+ if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) {
+ return mNavigationBarAlt;
}
- if (mClimateBarAlt != null && (mClimateBarAltPosition == pos || allowForAllPositions)) {
- requestTransientBars(mClimateBarAlt);
+ if (mClimateBarAlt != null && mClimateBarAltPosition == pos) {
+ return mClimateBarAlt;
}
- if (mExtraNavBarAlt != null && (mExtraNavBarAltPosition == pos || allowForAllPositions)) {
- requestTransientBars(mExtraNavBarAlt);
+ if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) {
+ return mExtraNavBarAlt;
}
+ return null;
+ }
+
+ /**
+ * Finds the first non-null nav bar to request transient for.
+ */
+ private WindowState findTransientNavOrAltBar() {
+ if (mNavigationBar != null) {
+ return mNavigationBar;
+ }
+ if (mNavigationBarAlt != null) {
+ return mNavigationBarAlt;
+ }
+ if (mExtraNavBarAlt != null) {
+ return mExtraNavBarAlt;
+ }
+ return null;
}
void systemReady() {
@@ -2170,8 +2198,8 @@
updateSystemBarAttributes();
}
- private void requestTransientBars(WindowState swipeTarget) {
- if (!mService.mPolicy.isUserSetupComplete()) {
+ private void requestTransientBars(WindowState swipeTarget, boolean isGestureOnSystemBar) {
+ if (swipeTarget == null || !mService.mPolicy.isUserSetupComplete()) {
// Swipe-up for navigation bar is disabled during setup
return;
}
@@ -2207,7 +2235,8 @@
if (controlTarget.canShowTransient()) {
// Show transient bars if they are hidden; restore position if they are visible.
- mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_SWIPE);
+ mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_SWIPE,
+ isGestureOnSystemBar);
controlTarget.showInsets(restorePositionTypes, false);
} else {
// Restore visibilities and positions of system bars.
@@ -2423,7 +2452,8 @@
// we're no longer on the Keyguard and the screen is ready. We can now request the bars.
mPendingPanicGestureUptime = 0;
if (!isNavBarEmpty(disableFlags)) {
- mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_PANIC);
+ mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_PANIC,
+ true /* isGestureOnSystemBar */);
}
}
@@ -2821,6 +2851,7 @@
void release() {
mHandler.post(mGestureNavigationSettingsObserver::unregister);
+ mImmersiveModeConfirmation.release();
}
@VisibleForTesting
diff --git a/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java
index f3b9cdf..93bdf16 100644
--- a/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java
+++ b/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java
@@ -149,6 +149,11 @@
}
}
+ void release() {
+ mHandler.removeMessages(H.SHOW);
+ mHandler.removeMessages(H.HIDE);
+ }
+
boolean onSettingChanged(int currentUserId) {
final boolean changed = loadSetting(currentUserId, mContext);
// Remove the window if the setting changes to be confirmed.
@@ -204,7 +209,12 @@
if (mClingWindow != null) {
if (DEBUG) Slog.d(TAG, "Hiding immersive mode confirmation");
// We don't care which root display area the window manager is specifying for removal.
- getWindowManager(FEATURE_UNDEFINED).removeView(mClingWindow);
+ try {
+ getWindowManager(FEATURE_UNDEFINED).removeView(mClingWindow);
+ } catch (WindowManager.InvalidDisplayException e) {
+ Slog.w(TAG, "Fail to hide the immersive confirmation window because of " + e);
+ return;
+ }
mClingWindow = null;
}
}
@@ -432,7 +442,11 @@
// show the confirmation
WindowManager.LayoutParams lp = getClingWindowLayoutParams();
- getWindowManager(rootDisplayAreaId).addView(mClingWindow, lp);
+ try {
+ getWindowManager(rootDisplayAreaId).addView(mClingWindow, lp);
+ } catch (WindowManager.InvalidDisplayException e) {
+ Slog.w(TAG, "Fail to show the immersive confirmation window because of " + e);
+ }
}
private final Runnable mConfirm = new Runnable() {
diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java
index dff7ff9..9326a2e 100644
--- a/services/core/java/com/android/server/wm/InsetsPolicy.java
+++ b/services/core/java/com/android/server/wm/InsetsPolicy.java
@@ -160,7 +160,7 @@
return provider != null && provider.hasWindow() && !provider.getSource().isVisible();
}
- void showTransient(@InternalInsetsType int[] types) {
+ void showTransient(@InternalInsetsType int[] types, boolean isGestureOnSystemBar) {
boolean changed = false;
for (int i = types.length - 1; i >= 0; i--) {
final @InternalInsetsType int type = types[i];
@@ -177,8 +177,8 @@
StatusBarManagerInternal statusBarManagerInternal =
mPolicy.getStatusBarManagerInternal();
if (statusBarManagerInternal != null) {
- statusBarManagerInternal.showTransient(
- mDisplayContent.getDisplayId(), mShowingTransientTypes.toArray());
+ statusBarManagerInternal.showTransient(mDisplayContent.getDisplayId(),
+ mShowingTransientTypes.toArray(), isGestureOnSystemBar);
}
updateBarControlTarget(mFocusedWin);
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 535bbb7..5a420ca 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -983,29 +983,6 @@
mWmService.checkDrawnWindowsLocked();
}
- final int N = mWmService.mPendingRemove.size();
- if (N > 0) {
- if (mWmService.mPendingRemoveTmp.length < N) {
- mWmService.mPendingRemoveTmp = new WindowState[N + 10];
- }
- mWmService.mPendingRemove.toArray(mWmService.mPendingRemoveTmp);
- mWmService.mPendingRemove.clear();
- ArrayList<DisplayContent> displayList = new ArrayList();
- for (i = 0; i < N; i++) {
- final WindowState w = mWmService.mPendingRemoveTmp[i];
- w.removeImmediately();
- final DisplayContent displayContent = w.getDisplayContent();
- if (displayContent != null && !displayList.contains(displayContent)) {
- displayList.add(displayContent);
- }
- }
-
- for (int j = displayList.size() - 1; j >= 0; --j) {
- final DisplayContent dc = displayList.get(j);
- dc.assignWindowLayers(true /*setLayoutNeeded*/);
- }
- }
-
forAllDisplays(dc -> {
dc.getInputMonitor().updateInputWindowsLw(true /*force*/);
dc.updateSystemGestureExclusion();
@@ -2051,11 +2028,22 @@
try {
final Task task = r.getTask();
- final Task rootPinnedTask = taskDisplayArea.getRootPinnedTask();
+
+ // Create a transition now to collect the current pinned Task dismiss. Only do the
+ // create here as the Task (trigger) to enter PIP is not ready yet.
+ final TransitionController transitionController = task.mTransitionController;
+ Transition newTransition = null;
+ if (transitionController.isCollecting()) {
+ transitionController.setReady(task, false /* ready */);
+ } else if (transitionController.getTransitionPlayer() != null) {
+ newTransition = transitionController.createTransition(TRANSIT_PIP);
+ }
// This will change the root pinned task's windowing mode to its original mode, ensuring
// we only have one root task that is in pinned mode.
+ final Task rootPinnedTask = taskDisplayArea.getRootPinnedTask();
if (rootPinnedTask != null) {
+ transitionController.collect(rootPinnedTask);
rootPinnedTask.dismissPip();
}
@@ -2131,7 +2119,13 @@
// display area, so reparent.
rootTask.reparent(taskDisplayArea, true /* onTop */);
}
- rootTask.mTransitionController.requestTransitionIfNeeded(TRANSIT_PIP, rootTask);
+
+ // The new PIP Task is ready, start the transition before updating the windowing mode.
+ if (newTransition != null) {
+ transitionController.requestStartTransition(newTransition, rootTask,
+ null /* remoteTransition */, null /* displayChange */);
+ }
+ transitionController.collect(rootTask);
// Defer the windowing mode change until after the transition to prevent the activity
// from doing work and changing the activity visuals while animating
diff --git a/services/core/java/com/android/server/wm/ShellRoot.java b/services/core/java/com/android/server/wm/ShellRoot.java
index 6ed59e9..f9d7b53 100644
--- a/services/core/java/com/android/server/wm/ShellRoot.java
+++ b/services/core/java/com/android/server/wm/ShellRoot.java
@@ -25,15 +25,14 @@
import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.graphics.Point;
-import android.graphics.Rect;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import android.view.DisplayInfo;
import android.view.IWindow;
import android.view.SurfaceControl;
-import android.view.WindowInfo;
import android.view.WindowManager;
import android.view.animation.Animation;
@@ -136,47 +135,12 @@
ANIMATION_TYPE_WINDOW_ANIMATION);
}
- WindowInfo getWindowInfo() {
- if (mShellRootLayer != SHELL_ROOT_LAYER_DIVIDER
- && mShellRootLayer != SHELL_ROOT_LAYER_PIP) {
- return null;
+ @Nullable
+ IBinder getAccessibilityWindowToken() {
+ if (mAccessibilityWindow != null) {
+ return mAccessibilityWindow.asBinder();
}
- if (mShellRootLayer == SHELL_ROOT_LAYER_DIVIDER
- && !mDisplayContent.getDefaultTaskDisplayArea().isSplitScreenModeActivated()) {
- return null;
- }
- if (mShellRootLayer == SHELL_ROOT_LAYER_PIP
- && mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask() == null) {
- return null;
- }
- if (mAccessibilityWindow == null) {
- return null;
- }
- WindowInfo windowInfo = WindowInfo.obtain();
- windowInfo.displayId = mToken.getDisplayArea().getDisplayContent().mDisplayId;
- windowInfo.type = mToken.windowType;
- windowInfo.layer = mToken.getWindowLayerFromType();
- windowInfo.token = mAccessibilityWindow.asBinder();
- windowInfo.focused = false;
- windowInfo.hasFlagWatchOutsideTouch = false;
- final Rect regionRect = new Rect();
-
-
- // DividerView
- if (mShellRootLayer == SHELL_ROOT_LAYER_DIVIDER) {
- windowInfo.inPictureInPicture = false;
- mDisplayContent.getDockedDividerController().getTouchRegion(regionRect);
- windowInfo.regionInScreen.set(regionRect);
- windowInfo.title = "Splitscreen Divider";
- }
- // PipMenuView
- if (mShellRootLayer == SHELL_ROOT_LAYER_PIP) {
- windowInfo.inPictureInPicture = true;
- mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask().getBounds(regionRect);
- windowInfo.regionInScreen.set(regionRect);
- windowInfo.title = "Picture-in-Picture menu";
- }
- return windowInfo;
+ return null;
}
void setAccessibilityWindow(IWindow window) {
@@ -197,9 +161,5 @@
mAccessibilityWindow = null;
}
}
- if (mDisplayContent.mWmService.mAccessibilityController.hasCallbacks()) {
- mDisplayContent.mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(
- mDisplayContent.getDisplayId());
- }
}
}
diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
index fe405e5..fc154a8 100644
--- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java
+++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java
@@ -107,7 +107,7 @@
/** Returns {@code true} if visibility is changed. */
boolean updateWallpaperWindows(boolean visible) {
boolean changed = false;
- if (isVisible() != visible) {
+ if (mVisibleRequested != visible) {
ProtoLog.d(WM_DEBUG_WALLPAPER, "Wallpaper token %s visible=%b",
token, visible);
setVisibility(visible);
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 7be128b..b5e6f49 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -222,7 +222,6 @@
import android.util.EventLog;
import android.util.MergedConfiguration;
import android.util.Slog;
-import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.TimeUtils;
import android.util.TypedValue;
@@ -588,20 +587,6 @@
final ArrayList<WindowState> mResizingWindows = new ArrayList<>();
/**
- * Windows whose animations have ended and now must be removed.
- */
- final ArrayList<WindowState> mPendingRemove = new ArrayList<>();
-
- /**
- * Used when processing mPendingRemove to avoid working on the original array.
- */
- WindowState[] mPendingRemoveTmp = new WindowState[20];
-
- // TODO: use WindowProcessController once go/wm-unified is done.
- /** Mapping of process pids to configurations */
- final SparseArray<Configuration> mProcessConfigurations = new SparseArray<>();
-
- /**
* Windows whose surface should be destroyed.
*/
final ArrayList<WindowState> mDestroySurface = new ArrayList<>();
@@ -2038,7 +2023,6 @@
dc.mWinRemovedSinceNullFocus.add(win);
}
mEmbeddedWindowController.onWindowRemoved(win);
- mPendingRemove.remove(win);
mResizingWindows.remove(win);
updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */);
mWindowsChanged = true;
@@ -6342,23 +6326,6 @@
}
}
}
- if (mPendingRemove.size() > 0) {
- pw.println();
- pw.println(" Remove pending for:");
- for (int i=mPendingRemove.size()-1; i>=0; i--) {
- WindowState w = mPendingRemove.get(i);
- if (windows == null || windows.contains(w)) {
- pw.print(" Remove #"); pw.print(i); pw.print(' ');
- pw.print(w);
- if (dumpAll) {
- pw.println(":");
- w.dump(pw, " ", true);
- } else {
- pw.println();
- }
- }
- }
- }
if (mForceRemoves != null && mForceRemoves.size() > 0) {
pw.println();
pw.println(" Windows force removing:");
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 573ff2f..5bbe2cd 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -4809,9 +4809,6 @@
if (isAnimating()) {
return;
}
- if (mWmService.mAccessibilityController.hasCallbacks()) {
- mWmService.mAccessibilityController.onSomeWindowResizedOrMoved(getDisplayId());
- }
if (!isSelfOrAncestorWindowAnimatingExit()) {
return;
@@ -4838,15 +4835,20 @@
if (hasSurface) {
mWmService.mDestroySurface.add(this);
}
- if (mRemoveOnExit) {
- mWmService.mPendingRemove.add(this);
- mRemoveOnExit = false;
- }
}
mAnimatingExit = false;
getDisplayContent().mWallpaperController.hideWallpapers(this);
}
+ @Override
+ boolean handleCompleteDeferredRemoval() {
+ if (mRemoveOnExit) {
+ mRemoveOnExit = false;
+ removeImmediately();
+ }
+ return super.handleCompleteDeferredRemoval();
+ }
+
boolean clearAnimatingFlags() {
boolean didSomething = false;
// We don't want to clear it out for windows that get replaced, because the
diff --git a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
index 4190a91..94bc22a 100644
--- a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
+++ b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp
@@ -59,6 +59,9 @@
namespace android {
+static bool cancelRunningCompaction;
+static bool compactionInProgress;
+
// Legacy method for compacting processes, any new code should
// use compactProcess instead.
static inline void compactProcessProcfs(int pid, const std::string& compactionType) {
@@ -83,9 +86,18 @@
// Skip compaction if failed to open pidfd with any error
return -errno;
}
+ compactionInProgress = true;
+ cancelRunningCompaction = false;
int64_t totalBytesCompacted = 0;
for (int iBase = 0; iBase < vmas.size(); iBase += UIO_MAXIOV) {
+ if (CC_UNLIKELY(cancelRunningCompaction)) {
+ // There could be a significant delay betweenwhen a compaction
+ // is requested and when it is handled during this time
+ // our OOM adjust could have improved.
+ cancelRunningCompaction = false;
+ break;
+ }
int totalVmasToKernel = std::min(UIO_MAXIOV, (int)(vmas.size() - iBase));
for (int iVec = 0, iVma = iBase; iVec < totalVmasToKernel; ++iVec, ++iVma) {
vmasToKernel[iVec].iov_base = (void*)vmas[iVma].start;
@@ -95,11 +107,13 @@
auto bytesCompacted =
process_madvise(pidfd, vmasToKernel, totalVmasToKernel, madviseType, 0);
if (CC_UNLIKELY(bytesCompacted == -1)) {
+ compactionInProgress = false;
return -errno;
}
totalBytesCompacted += bytesCompacted;
}
+ compactionInProgress = false;
return totalBytesCompacted;
}
@@ -228,6 +242,12 @@
}
}
+static void com_android_server_am_CachedAppOptimizer_cancelCompaction(JNIEnv*, jobject) {
+ if (compactionInProgress) {
+ cancelRunningCompaction = true;
+ }
+}
+
static void com_android_server_am_CachedAppOptimizer_compactProcess(JNIEnv*, jobject, jint pid,
jint compactionFlags) {
compactProcessOrFallback(pid, compactionFlags);
@@ -279,6 +299,8 @@
static const JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
+ {"cancelCompaction", "()V",
+ (void*)com_android_server_am_CachedAppOptimizer_cancelCompaction},
{"compactSystem", "()V", (void*)com_android_server_am_CachedAppOptimizer_compactSystem},
{"compactProcess", "(II)V", (void*)com_android_server_am_CachedAppOptimizer_compactProcess},
{"freezeBinder", "(IZ)I", (void*)com_android_server_am_CachedAppOptimizer_freezeBinder},
diff --git a/services/core/jni/com_android_server_vibrator_VibratorController.cpp b/services/core/jni/com_android_server_vibrator_VibratorController.cpp
index 546b075..b484796 100644
--- a/services/core/jni/com_android_server_vibrator_VibratorController.cpp
+++ b/services/core/jni/com_android_server_vibrator_VibratorController.cpp
@@ -61,8 +61,8 @@
static struct {
jfieldID startAmplitude;
jfieldID endAmplitude;
- jfieldID startFrequency;
- jfieldID endFrequency;
+ jfieldID startFrequencyHz;
+ jfieldID endFrequencyHz;
jfieldID duration;
} sRampClassInfo;
@@ -157,8 +157,8 @@
static_cast<float>(env->GetFloatField(ramp, sRampClassInfo.startAmplitude));
pwle.endAmplitude = static_cast<float>(env->GetFloatField(ramp, sRampClassInfo.endAmplitude));
pwle.startFrequency =
- static_cast<float>(env->GetFloatField(ramp, sRampClassInfo.startFrequency));
- pwle.endFrequency = static_cast<float>(env->GetFloatField(ramp, sRampClassInfo.endFrequency));
+ static_cast<float>(env->GetFloatField(ramp, sRampClassInfo.startFrequencyHz));
+ pwle.endFrequency = static_cast<float>(env->GetFloatField(ramp, sRampClassInfo.endFrequencyHz));
pwle.duration = static_cast<int32_t>(env->GetIntField(ramp, sRampClassInfo.duration));
return pwle;
}
@@ -363,7 +363,7 @@
}
static jboolean vibratorGetInfo(JNIEnv* env, jclass /* clazz */, jlong ptr,
- jfloat suggestedSafeRange, jobject vibratorInfoBuilder) {
+ jobject vibratorInfoBuilder) {
VibratorControllerWrapper* wrapper = reinterpret_cast<VibratorControllerWrapper*>(ptr);
if (wrapper == nullptr) {
ALOGE("vibratorGetInfo failed because native wrapper was not initialized");
@@ -437,9 +437,9 @@
env->SetFloatArrayRegion(maxAmplitudes, 0, amplitudes.size(),
reinterpret_cast<jfloat*>(amplitudes.data()));
}
- jobject frequencyMapping = env->NewObject(sFrequencyMappingClass, sFrequencyMappingCtor,
- minFrequency, resonantFrequency, frequencyResolution,
- suggestedSafeRange, maxAmplitudes);
+ jobject frequencyMapping =
+ env->NewObject(sFrequencyMappingClass, sFrequencyMappingCtor, resonantFrequency,
+ minFrequency, frequencyResolution, maxAmplitudes);
env->CallObjectMethod(vibratorInfoBuilder, sVibratorInfoBuilderClassInfo.setFrequencyMapping,
frequencyMapping);
@@ -463,7 +463,7 @@
{"setExternalControl", "(JZ)V", (void*)vibratorSetExternalControl},
{"alwaysOnEnable", "(JJJJ)V", (void*)vibratorAlwaysOnEnable},
{"alwaysOnDisable", "(JJ)V", (void*)vibratorAlwaysOnDisable},
- {"getInfo", "(JFLandroid/os/VibratorInfo$Builder;)Z", (void*)vibratorGetInfo},
+ {"getInfo", "(JLandroid/os/VibratorInfo$Builder;)Z", (void*)vibratorGetInfo},
};
int register_android_server_vibrator_VibratorController(JavaVM* jvm, JNIEnv* env) {
@@ -481,13 +481,13 @@
jclass rampClass = FindClassOrDie(env, "android/os/vibrator/RampSegment");
sRampClassInfo.startAmplitude = GetFieldIDOrDie(env, rampClass, "mStartAmplitude", "F");
sRampClassInfo.endAmplitude = GetFieldIDOrDie(env, rampClass, "mEndAmplitude", "F");
- sRampClassInfo.startFrequency = GetFieldIDOrDie(env, rampClass, "mStartFrequency", "F");
- sRampClassInfo.endFrequency = GetFieldIDOrDie(env, rampClass, "mEndFrequency", "F");
+ sRampClassInfo.startFrequencyHz = GetFieldIDOrDie(env, rampClass, "mStartFrequencyHz", "F");
+ sRampClassInfo.endFrequencyHz = GetFieldIDOrDie(env, rampClass, "mEndFrequencyHz", "F");
sRampClassInfo.duration = GetFieldIDOrDie(env, rampClass, "mDuration", "I");
jclass frequencyMappingClass = FindClassOrDie(env, "android/os/VibratorInfo$FrequencyMapping");
sFrequencyMappingClass = static_cast<jclass>(env->NewGlobalRef(frequencyMappingClass));
- sFrequencyMappingCtor = GetMethodIDOrDie(env, sFrequencyMappingClass, "<init>", "(FFFF[F)V");
+ sFrequencyMappingCtor = GetMethodIDOrDie(env, sFrequencyMappingClass, "<init>", "(FFF[F)V");
jclass vibratorInfoBuilderClass = FindClassOrDie(env, "android/os/VibratorInfo$Builder");
sVibratorInfoBuilderClassInfo.setCapabilities =
diff --git a/services/incremental/TEST_MAPPING b/services/incremental/TEST_MAPPING
index f2ad068..9fe090a 100644
--- a/services/incremental/TEST_MAPPING
+++ b/services/incremental/TEST_MAPPING
@@ -10,6 +10,12 @@
},
{
"name": "CtsIncrementalInstallHostTestCases"
+ },
+ {
+ "name": "libincfs-test"
+ },
+ {
+ "name": "service.incremental_test"
}
],
"presubmit-large": [
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 29797a5..fe5c358 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -920,12 +920,6 @@
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
- // Apex services must be the last category of services to start. No other service must
- // be starting after this point. This is to prevent unnessary stability issues when
- // these apexes are updated outside of OTA; and to avoid breaking dependencies from
- // system into apexes.
- // TODO(satayev): lock mSystemServiceManager.startService to stop accepting new services
- // after this step
startApexServices(t);
} catch (Throwable ex) {
Slog.e("System", "******************************************");
@@ -1460,13 +1454,18 @@
ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());
t.traceEnd();
- t.traceBegin("StartTelecomLoaderService");
- mSystemServiceManager.startService(TelecomLoaderService.class);
- t.traceEnd();
+ // TelecomLoader hooks into classes with defined HFP logic,
+ // so check for either telephony or microphone.
+ if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_MICROPHONE) ||
+ mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+ t.traceBegin("StartTelecomLoaderService");
+ mSystemServiceManager.startService(TelecomLoaderService.class);
+ t.traceEnd();
+ }
t.traceBegin("StartTelephonyRegistry");
telephonyRegistry = new TelephonyRegistry(
- context, new TelephonyRegistry.ConfigurationProvider());
+ context, new TelephonyRegistry.ConfigurationProvider());
ServiceManager.addService("telephony.registry", telephonyRegistry);
t.traceEnd();
@@ -2572,10 +2571,12 @@
mActivityManagerService.enterSafeMode();
}
- // MMS service broker
- t.traceBegin("StartMmsService");
- mmsService = mSystemServiceManager.startService(MmsServiceBroker.class);
- t.traceEnd();
+ if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+ // MMS service broker
+ t.traceBegin("StartMmsService");
+ mmsService = mSystemServiceManager.startService(MmsServiceBroker.class);
+ t.traceEnd();
+ }
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOFILL)) {
t.traceBegin("StartAutoFillService");
@@ -2991,9 +2992,7 @@
t.traceEnd();
t.traceBegin("MakeTelephonyRegistryReady");
try {
- if (telephonyRegistryF != null) {
- telephonyRegistryF.systemRunning();
- }
+ if (telephonyRegistryF != null) telephonyRegistryF.systemRunning();
} catch (Throwable e) {
reportWtf("Notifying TelephonyRegistry running", e);
}
@@ -3007,15 +3006,15 @@
reportWtf("Notifying MediaRouterService running", e);
}
t.traceEnd();
- t.traceBegin("MakeMmsServiceReady");
- try {
- if (mmsServiceF != null) {
- mmsServiceF.systemRunning();
+ if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
+ t.traceBegin("MakeMmsServiceReady");
+ try {
+ if (mmsServiceF != null) mmsServiceF.systemRunning();
+ } catch (Throwable e) {
+ reportWtf("Notifying MmsService running", e);
}
- } catch (Throwable e) {
- reportWtf("Notifying MmsService running", e);
+ t.traceEnd();
}
- t.traceEnd();
t.traceBegin("IncidentDaemonReady");
try {
@@ -3051,11 +3050,14 @@
/**
* Starts system services defined in apexes.
+ *
+ * <p>Apex services must be the last category of services to start. No other service must be
+ * starting after this point. This is to prevent unnecessary stability issues when these apexes
+ * are updated outside of OTA; and to avoid breaking dependencies from system into apexes.
*/
private void startApexServices(@NonNull TimingsTraceAndSlog t) {
t.traceBegin("startApexServices");
Map<String, String> services = ApexManager.getInstance().getApexSystemServices();
- // TODO(satayev): filter out already started services
// TODO(satayev): introduce android:order for services coming the same apexes
for (String name : new TreeSet<>(services.keySet())) {
String jarPath = services.get(name);
@@ -3067,6 +3069,10 @@
}
t.traceEnd();
}
+
+ // make sure no other services are started after this point
+ mSystemServiceManager.sealStartedServices();
+
t.traceEnd(); // startApexServices
}
diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp
index 8538603..635f136 100644
--- a/services/tests/mockingservicestests/Android.bp
+++ b/services/tests/mockingservicestests/Android.bp
@@ -40,26 +40,26 @@
],
static_libs: [
+ "androidx.test.core",
+ "androidx.test.runner",
+ "androidx.test.ext.truth",
"frameworks-base-testutils",
+ "hamcrest-library",
+ "kotlin-test",
+ "mockingservicestests-utils-mockito",
+ "mockito-target-extended-minus-junit4",
+ "platform-test-annotations",
+ "service-blobstore",
+ "service-jobscheduler",
+ "service-permission.impl",
"services.core",
"services.devicepolicy",
"services.net",
"services.usage",
- "service-jobscheduler",
- "service-permission.impl",
- "service-blobstore",
- "androidx.test.core",
- "androidx.test.runner",
- "androidx.test.ext.truth",
- "mockito-target-extended-minus-junit4",
- "platform-test-annotations",
- "truth-prebuilt",
- "hamcrest-library",
- "servicestests-utils-mockito-extended",
- "mockingservicestests-utils-mockito",
"servicestests-core-utils",
+ "servicestests-utils-mockito-extended",
"testables",
- "kotlin-test",
+ "truth-prebuilt",
// TODO: remove once Android migrates to JUnit 4.12, which provides assertThrows
"testng",
],
diff --git a/services/tests/mockingservicestests/src/com/android/server/communal/CommunalManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/communal/CommunalManagerServiceTest.java
deleted file mode 100644
index c46884f..0000000
--- a/services/tests/mockingservicestests/src/com/android/server/communal/CommunalManagerServiceTest.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.server.communal;
-
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.spy;
-
-import android.Manifest;
-import android.app.communal.ICommunalManager;
-import android.content.ContextWrapper;
-import android.os.RemoteException;
-import android.platform.test.annotations.Presubmit;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.filters.SmallTest;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoSession;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.mockito.quality.Strictness;
-
-/**
- * Test class for {@link CommunalManagerService}.
- *
- * Build/Install/Run:
- * atest FrameworksMockingServicesTests:CommunalManagerServiceTest
- */
-@RunWith(MockitoJUnitRunner.class)
-@SmallTest
-@Presubmit
-public class CommunalManagerServiceTest {
- private MockitoSession mMockingSession;
- private CommunalManagerService mService;
-
- private ICommunalManager mBinder;
- private ContextWrapper mContextSpy;
-
- @Before
- public final void setUp() {
- mMockingSession = mockitoSession()
- .initMocks(this)
- .strictness(Strictness.WARN)
- .startMocking();
-
- mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
-
- doNothing().when(mContextSpy).enforceCallingPermission(
- eq(Manifest.permission.WRITE_COMMUNAL_STATE), anyString());
- doNothing().when(mContextSpy).enforceCallingPermission(
- eq(Manifest.permission.READ_COMMUNAL_STATE), anyString());
-
- mService = new CommunalManagerService(mContextSpy);
- mBinder = mService.getBinderServiceInstance();
- }
-
- @After
- public void tearDown() {
- if (mMockingSession != null) {
- mMockingSession.finishMocking();
- }
- }
-
- @Test
- public void testIsCommunalMode_isTrue() throws RemoteException {
- mBinder.setCommunalViewShowing(true);
- assertThat(mBinder.isCommunalMode()).isTrue();
- }
-
- @Test
- public void testIsCommunalMode_isFalse() throws RemoteException {
- mBinder.setCommunalViewShowing(false);
- assertThat(mBinder.isCommunalMode()).isFalse();
- }
-}
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
index 44a8b30..04a6eee 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
@@ -74,6 +74,7 @@
import com.android.server.testutils.nullable
import com.android.server.testutils.whenever
import com.android.server.utils.WatchedArrayMap
+import libcore.util.HexEncoding
import org.junit.Assert
import org.junit.rules.TestRule
import org.junit.runner.Description
@@ -140,6 +141,7 @@
.mockStatic(EventLog::class.java)
.mockStatic(LocalServices::class.java)
.mockStatic(DeviceConfig::class.java)
+ .mockStatic(HexEncoding::class.java)
.apply(withSession)
session = apply.startMocking()
whenever(mocks.settings.insertPackageSettingLPw(
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
new file mode 100644
index 0000000..6de12cb9
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
@@ -0,0 +1,449 @@
+/*
+ * 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.
+ */
+
+package com.android.server.pm
+
+import android.content.pm.ApplicationInfo
+import android.content.pm.PackageManager
+import android.content.pm.SharedLibraryInfo
+import android.content.pm.VersionedPackage
+import android.os.Build
+import android.os.storage.StorageManager
+import android.util.ArrayMap
+import android.util.PackageUtils
+import com.android.server.SystemConfig.SharedLibraryEntry
+import com.android.server.compat.PlatformCompat
+import com.android.server.extendedtestutils.wheneverStatic
+import com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME
+import com.android.server.pm.parsing.pkg.AndroidPackage
+import com.android.server.pm.parsing.pkg.PackageImpl
+import com.android.server.pm.parsing.pkg.ParsedPackage
+import com.android.server.testutils.any
+import com.android.server.testutils.eq
+import com.android.server.testutils.mock
+import com.android.server.testutils.nullable
+import com.android.server.testutils.spy
+import com.android.server.testutils.whenever
+import com.android.server.utils.WatchedLongSparseArray
+import com.google.common.truth.Truth.assertThat
+import libcore.util.HexEncoding
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.Mock
+import org.mockito.Mockito.doAnswer
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+import java.io.File
+import kotlin.test.assertFailsWith
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+@RunWith(JUnit4::class)
+class SharedLibrariesImplTest {
+
+ companion object {
+ const val TEST_LIB_NAME = "test.lib"
+ const val TEST_LIB_PACKAGE_NAME = "com.android.lib.test"
+ const val BUILTIN_LIB_NAME = "builtin.lib"
+ const val STATIC_LIB_NAME = "static.lib"
+ const val STATIC_LIB_VERSION = 7L
+ const val STATIC_LIB_PACKAGE_NAME = "com.android.lib.static.provider"
+ const val DYNAMIC_LIB_NAME = "dynamic.lib"
+ const val DYNAMIC_LIB_PACKAGE_NAME = "com.android.lib.dynamic.provider"
+ const val CONSUMER_PACKAGE_NAME = "com.android.lib.consumer"
+ const val VERSION_UNDEFINED = SharedLibraryInfo.VERSION_UNDEFINED.toLong()
+ }
+
+ @Rule
+ @JvmField
+ val mRule = MockSystemRule()
+
+ private val mExistingPackages: ArrayMap<String, AndroidPackage> = ArrayMap()
+ private val mExistingSettings: MutableMap<String, PackageSetting> = mutableMapOf()
+
+ private lateinit var mSharedLibrariesImpl: SharedLibrariesImpl
+ private lateinit var mPms: PackageManagerService
+ private lateinit var mSettings: Settings
+
+ @Mock
+ private lateinit var mDeletePackageHelper: DeletePackageHelper
+ @Mock
+ private lateinit var mStorageManager: StorageManager
+ @Mock
+ private lateinit var mFile: File
+ @Mock
+ private lateinit var mPlatformCompat: PlatformCompat
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ mRule.system().stageNominalSystemState()
+ addExistingPackages()
+
+ val testParams = PackageManagerServiceTestParams().apply {
+ packages = mExistingPackages
+ }
+ mPms = spy(PackageManagerService(mRule.mocks().injector, testParams))
+ mSettings = mRule.mocks().injector.settings
+ mSharedLibrariesImpl = SharedLibrariesImpl(mPms, mRule.mocks().injector)
+ mSharedLibrariesImpl.setDeletePackageHelper(mDeletePackageHelper)
+ addExistingSharedLibraries()
+
+ whenever(mSettings.getPackageLPr(any())) { mExistingSettings[arguments[0]] }
+ whenever(mRule.mocks().injector.getSystemService(StorageManager::class.java))
+ .thenReturn(mStorageManager)
+ whenever(mStorageManager.findPathForUuid(nullable())).thenReturn(mFile)
+ doAnswer { it.arguments[0] }.`when`(mPms).resolveInternalPackageNameLPr(any(), any())
+ whenever(mDeletePackageHelper.deletePackageX(any(), any(), any(), any(), any()))
+ .thenReturn(PackageManager.DELETE_SUCCEEDED)
+ whenever(mRule.mocks().injector.compatibility).thenReturn(mPlatformCompat)
+ wheneverStatic { HexEncoding.decode(STATIC_LIB_NAME, false) }
+ .thenReturn(PackageUtils.computeSha256DigestBytes(
+ mExistingSettings[STATIC_LIB_PACKAGE_NAME]!!
+ .pkg.signingDetails.signatures!![0].toByteArray()))
+ }
+
+ @Test
+ fun snapshot_shouldSealed() {
+ val builtinLibs = mSharedLibrariesImpl.snapshot().all[BUILTIN_LIB_NAME]
+ assertThat(builtinLibs).isNotNull()
+
+ assertFailsWith(IllegalStateException::class) {
+ mSharedLibrariesImpl.snapshot().all[BUILTIN_LIB_NAME] = WatchedLongSparseArray()
+ }
+ assertFailsWith(IllegalStateException::class) {
+ builtinLibs!!.put(VERSION_UNDEFINED, libOfBuiltin(BUILTIN_LIB_NAME))
+ }
+ }
+
+ @Test
+ fun addBuiltInSharedLibrary() {
+ mSharedLibrariesImpl.addBuiltInSharedLibraryLPw(libEntry(TEST_LIB_NAME))
+
+ assertThat(mSharedLibrariesImpl.getSharedLibraryInfos(TEST_LIB_NAME)).isNotNull()
+ assertThat(mSharedLibrariesImpl.getSharedLibraryInfo(TEST_LIB_NAME, VERSION_UNDEFINED))
+ .isNotNull()
+ }
+
+ @Test
+ fun addBuiltInSharedLibrary_withDuplicateLibName() {
+ val duplicate = libEntry(BUILTIN_LIB_NAME, "duplicate.path")
+ mSharedLibrariesImpl.addBuiltInSharedLibraryLPw(duplicate)
+ val sharedLibInfo = mSharedLibrariesImpl
+ .getSharedLibraryInfo(BUILTIN_LIB_NAME, VERSION_UNDEFINED)
+
+ assertThat(sharedLibInfo).isNotNull()
+ assertThat(sharedLibInfo!!.path).isNotEqualTo(duplicate.filename)
+ }
+
+ @Test
+ fun commitSharedLibraryInfo_withStaticSharedLib() {
+ val testInfo = libOfStatic(TEST_LIB_PACKAGE_NAME, TEST_LIB_NAME, 1L)
+ mSharedLibrariesImpl.commitSharedLibraryInfoLPw(testInfo)
+ val sharedLibInfos = mSharedLibrariesImpl
+ .getStaticLibraryInfos(testInfo.declaringPackage.packageName)
+
+ assertThat(mSharedLibrariesImpl.getSharedLibraryInfos(TEST_LIB_NAME))
+ .isNotNull()
+ assertThat(mSharedLibrariesImpl.getSharedLibraryInfo(testInfo.name, testInfo.longVersion))
+ .isNotNull()
+ assertThat(sharedLibInfos).isNotNull()
+ assertThat(sharedLibInfos.get(testInfo.longVersion)).isNotNull()
+ }
+
+ @Test
+ fun removeSharedLibrary() {
+ doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) }.`when`(mPms)
+ .getPackagesUsingSharedLibrary(any(), any(), any(), any())
+ val staticInfo = mSharedLibrariesImpl
+ .getSharedLibraryInfo(STATIC_LIB_NAME, STATIC_LIB_VERSION)!!
+
+ mSharedLibrariesImpl.removeSharedLibraryLPw(STATIC_LIB_NAME, STATIC_LIB_VERSION)
+
+ assertThat(mSharedLibrariesImpl.getSharedLibraryInfos(STATIC_LIB_NAME)).isNull()
+ assertThat(mSharedLibrariesImpl
+ .getStaticLibraryInfos(staticInfo.declaringPackage.packageName)).isNull()
+ verify(mExistingSettings[CONSUMER_PACKAGE_NAME]!!)
+ .setOverlayPathsForLibrary(any(), nullable(), any())
+ }
+
+ @Test
+ fun pruneUnusedStaticSharedLibraries() {
+ mSharedLibrariesImpl.pruneUnusedStaticSharedLibraries(Long.MAX_VALUE, 0)
+
+ verify(mDeletePackageHelper)
+ .deletePackageX(eq(STATIC_LIB_PACKAGE_NAME), any(), any(), any(), any())
+ }
+
+ @Test
+ fun getLatestSharedLibraVersion() {
+ val newLibSetting = addPackage(STATIC_LIB_PACKAGE_NAME + "_" + 10, 10L,
+ staticLibrary = STATIC_LIB_NAME, staticLibraryVersion = 10L)
+
+ val latestInfo = mSharedLibrariesImpl.getLatestSharedLibraVersionLPr(newLibSetting.pkg)!!
+
+ assertThat(latestInfo).isNotNull()
+ assertThat(latestInfo.name).isEqualTo(STATIC_LIB_NAME)
+ assertThat(latestInfo.longVersion).isEqualTo(STATIC_LIB_VERSION)
+ }
+
+ @Test
+ fun getStaticSharedLibLatestVersionSetting() {
+ val pair = createBasicAndroidPackage(STATIC_LIB_PACKAGE_NAME + "_" + 10, 10L,
+ staticLibrary = STATIC_LIB_NAME, staticLibraryVersion = 10L)
+ val parsedPackage = pair.second as ParsedPackage
+ val scanRequest = ScanRequest(parsedPackage, null, null, null,
+ null, null, null, 0, 0, false, null, null)
+ val scanResult = ScanResult(scanRequest, true, null, null, false, 0, null, null, null)
+
+ val latestInfoSetting =
+ mSharedLibrariesImpl.getStaticSharedLibLatestVersionSetting(scanResult)!!
+
+ assertThat(latestInfoSetting).isNotNull()
+ assertThat(latestInfoSetting.packageName).isEqualTo(STATIC_LIB_PACKAGE_NAME)
+ }
+
+ @Test
+ fun updateSharedLibraries_withDynamicLibPackage() {
+ val testPackageSetting = mExistingSettings[DYNAMIC_LIB_PACKAGE_NAME]!!
+ assertThat(testPackageSetting.usesLibraryFiles).isEmpty()
+
+ mSharedLibrariesImpl.updateSharedLibrariesLPw(testPackageSetting.pkg, testPackageSetting,
+ null /* changingLib */, null /* changingLibSetting */, mExistingPackages)
+
+ assertThat(testPackageSetting.usesLibraryFiles).hasSize(1)
+ assertThat(testPackageSetting.usesLibraryFiles).contains(builtinLibPath(BUILTIN_LIB_NAME))
+ }
+
+ @Test
+ fun updateSharedLibraries_withStaticLibPackage() {
+ val testPackageSetting = mExistingSettings[STATIC_LIB_PACKAGE_NAME]!!
+ assertThat(testPackageSetting.usesLibraryFiles).isEmpty()
+
+ mSharedLibrariesImpl.updateSharedLibrariesLPw(testPackageSetting.pkg, testPackageSetting,
+ null /* changingLib */, null /* changingLibSetting */, mExistingPackages)
+
+ assertThat(testPackageSetting.usesLibraryFiles).hasSize(1)
+ assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(DYNAMIC_LIB_PACKAGE_NAME))
+ }
+
+ @Test
+ fun updateSharedLibraries_withConsumerPackage() {
+ val testPackageSetting = mExistingSettings[CONSUMER_PACKAGE_NAME]!!
+ assertThat(testPackageSetting.usesLibraryFiles).isEmpty()
+
+ mSharedLibrariesImpl.updateSharedLibrariesLPw(testPackageSetting.pkg, testPackageSetting,
+ null /* changingLib */, null /* changingLibSetting */, mExistingPackages)
+
+ assertThat(testPackageSetting.usesLibraryFiles).hasSize(2)
+ assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(DYNAMIC_LIB_PACKAGE_NAME))
+ assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(STATIC_LIB_PACKAGE_NAME))
+ }
+
+ @Test
+ fun updateAllSharedLibraries() {
+ mExistingSettings.forEach {
+ assertThat(it.value.usesLibraryFiles).isEmpty()
+ }
+
+ mSharedLibrariesImpl.updateAllSharedLibrariesLPw(
+ null /* updatedPkg */, null /* updatedPkgSetting */, mExistingPackages)
+
+ var testPackageSetting = mExistingSettings[DYNAMIC_LIB_PACKAGE_NAME]!!
+ assertThat(testPackageSetting.usesLibraryFiles).hasSize(1)
+ assertThat(testPackageSetting.usesLibraryFiles).contains(builtinLibPath(BUILTIN_LIB_NAME))
+
+ testPackageSetting = mExistingSettings[STATIC_LIB_PACKAGE_NAME]!!
+ assertThat(testPackageSetting.usesLibraryFiles).hasSize(2)
+ assertThat(testPackageSetting.usesLibraryFiles).contains(builtinLibPath(BUILTIN_LIB_NAME))
+ assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(DYNAMIC_LIB_PACKAGE_NAME))
+
+ testPackageSetting = mExistingSettings[CONSUMER_PACKAGE_NAME]!!
+ assertThat(testPackageSetting.usesLibraryFiles).hasSize(3)
+ assertThat(testPackageSetting.usesLibraryFiles).contains(builtinLibPath(BUILTIN_LIB_NAME))
+ assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(DYNAMIC_LIB_PACKAGE_NAME))
+ assertThat(testPackageSetting.usesLibraryFiles).contains(apkPath(STATIC_LIB_PACKAGE_NAME))
+ }
+
+ @Test
+ fun getAllowedSharedLibInfos_withStaticSharedLibInfo() {
+ val testInfo = libOfStatic(TEST_LIB_PACKAGE_NAME, TEST_LIB_NAME, 1L)
+ val scanResult = ScanResult(mock(), true, null, null,
+ false, 0, null, testInfo, null)
+
+ val allowedInfos = mSharedLibrariesImpl.getAllowedSharedLibInfos(scanResult)
+
+ assertThat(allowedInfos).hasSize(1)
+ assertThat(allowedInfos[0].name).isEqualTo(TEST_LIB_NAME)
+ }
+
+ @Test
+ fun getAllowedSharedLibInfos_withDynamicSharedLibInfo() {
+ val testInfo = libOfDynamic(TEST_LIB_PACKAGE_NAME, TEST_LIB_NAME)
+ val pair = createBasicAndroidPackage(
+ TEST_LIB_PACKAGE_NAME, 10L, libraries = arrayOf(TEST_LIB_NAME))
+ val parsedPackage = pair.second.apply {
+ isSystem = true
+ } as ParsedPackage
+ val packageSetting = mRule.system()
+ .createBasicSettingBuilder(pair.first.parentFile, parsedPackage.hideAsFinal())
+ .setPkgFlags(ApplicationInfo.FLAG_SYSTEM).build()
+ val scanRequest = ScanRequest(parsedPackage, null, null, null,
+ null, null, null, 0, 0, false, null, null)
+ val scanResult = ScanResult(scanRequest, true, packageSetting, null,
+ false, 0, null, null, listOf(testInfo))
+
+ val allowedInfos = mSharedLibrariesImpl.getAllowedSharedLibInfos(scanResult)
+
+ assertThat(allowedInfos).hasSize(1)
+ assertThat(allowedInfos[0].name).isEqualTo(TEST_LIB_NAME)
+ }
+
+ private fun addExistingPackages() {
+ // add a dynamic shared library that is using the builtin library
+ addPackage(DYNAMIC_LIB_PACKAGE_NAME, 1L,
+ libraries = arrayOf(DYNAMIC_LIB_NAME),
+ usesLibraries = arrayOf(BUILTIN_LIB_NAME))
+
+ // add a static shared library v7 that is using the dynamic shared library
+ addPackage(STATIC_LIB_PACKAGE_NAME, STATIC_LIB_VERSION,
+ staticLibrary = STATIC_LIB_NAME, staticLibraryVersion = STATIC_LIB_VERSION,
+ usesLibraries = arrayOf(DYNAMIC_LIB_NAME))
+
+ // add a consumer package that is using the dynamic and static shared library
+ addPackage(CONSUMER_PACKAGE_NAME, 1L,
+ usesLibraries = arrayOf(DYNAMIC_LIB_NAME),
+ usesStaticLibraries = arrayOf(STATIC_LIB_NAME),
+ usesStaticLibraryVersions = arrayOf(STATIC_LIB_VERSION))
+ }
+
+ private fun addExistingSharedLibraries() {
+ mSharedLibrariesImpl.addBuiltInSharedLibraryLPw(libEntry(BUILTIN_LIB_NAME))
+ mSharedLibrariesImpl.commitSharedLibraryInfoLPw(
+ libOfDynamic(DYNAMIC_LIB_PACKAGE_NAME, DYNAMIC_LIB_NAME))
+ mSharedLibrariesImpl.commitSharedLibraryInfoLPw(
+ libOfStatic(STATIC_LIB_PACKAGE_NAME, STATIC_LIB_NAME, STATIC_LIB_VERSION))
+ }
+
+ private fun addPackage(
+ packageName: String,
+ version: Long,
+ libraries: Array<String>? = null,
+ staticLibrary: String? = null,
+ staticLibraryVersion: Long = 0L,
+ usesLibraries: Array<String>? = null,
+ usesStaticLibraries: Array<String>? = null,
+ usesStaticLibraryVersions: Array<Long>? = null
+ ): PackageSetting {
+ val pair = createBasicAndroidPackage(packageName, version, libraries, staticLibrary,
+ staticLibraryVersion, usesLibraries, usesStaticLibraries, usesStaticLibraryVersions)
+ val apkPath = pair.first
+ val parsingPackage = pair.second
+ val spyPkg = spy((parsingPackage as ParsedPackage).hideAsFinal())
+ mExistingPackages[packageName] = spyPkg
+
+ val spyPackageSetting = spy(mRule.system()
+ .createBasicSettingBuilder(apkPath.parentFile, spyPkg).build())
+ mExistingSettings[spyPackageSetting.packageName] = spyPackageSetting
+
+ return spyPackageSetting
+ }
+
+ private fun createBasicAndroidPackage(
+ packageName: String,
+ version: Long,
+ libraries: Array<String>? = null,
+ staticLibrary: String? = null,
+ staticLibraryVersion: Long = 0L,
+ usesLibraries: Array<String>? = null,
+ usesStaticLibraries: Array<String>? = null,
+ usesStaticLibraryVersions: Array<Long>? = null
+ ): Pair<File, PackageImpl> {
+ assertFalse { libraries != null && staticLibrary != null }
+ assertTrue { (usesStaticLibraries?.size ?: -1) == (usesStaticLibraryVersions?.size ?: -1) }
+
+ val pair = mRule.system()
+ .createBasicAndroidPackage(mRule.system().dataAppDirectory, packageName, version)
+ pair.second.apply {
+ setTargetSdkVersion(Build.VERSION_CODES.S)
+ libraries?.forEach { addLibraryName(it) }
+ staticLibrary?.let {
+ setStaticSharedLibName(it)
+ setStaticSharedLibVersion(staticLibraryVersion)
+ setStaticSharedLibrary(true)
+ }
+ usesLibraries?.forEach { addUsesLibrary(it) }
+ usesStaticLibraries?.forEachIndexed { index, s ->
+ addUsesStaticLibrary(s,
+ usesStaticLibraryVersions?.get(index) ?: 0L,
+ arrayOf(s))
+ }
+ }
+ return pair
+ }
+
+ private fun libEntry(libName: String, path: String? = null): SharedLibraryEntry =
+ SharedLibraryEntry(libName, path ?: builtinLibPath(libName),
+ arrayOfNulls(0), false /* isNative */)
+
+ private fun libOfBuiltin(libName: String): SharedLibraryInfo =
+ SharedLibraryInfo(builtinLibPath(libName),
+ null /* packageName */,
+ null /* codePaths */,
+ libName,
+ VERSION_UNDEFINED,
+ SharedLibraryInfo.TYPE_BUILTIN,
+ VersionedPackage(PLATFORM_PACKAGE_NAME, 0L /* versionCode */),
+ null /* dependentPackages */,
+ null /* dependencies */,
+ false /* isNative */)
+
+ private fun libOfStatic(
+ packageName: String,
+ libName: String,
+ version: Long
+ ): SharedLibraryInfo =
+ SharedLibraryInfo(null /* path */,
+ packageName,
+ listOf(apkPath(packageName)),
+ libName,
+ version,
+ SharedLibraryInfo.TYPE_STATIC,
+ VersionedPackage(packageName, version /* versionCode */),
+ null /* dependentPackages */,
+ null /* dependencies */,
+ false /* isNative */)
+
+ private fun libOfDynamic(packageName: String, libName: String): SharedLibraryInfo =
+ SharedLibraryInfo(null /* path */,
+ packageName,
+ listOf(apkPath(packageName)),
+ libName,
+ VERSION_UNDEFINED,
+ SharedLibraryInfo.TYPE_DYNAMIC,
+ VersionedPackage(packageName, 1L /* versionCode */),
+ null /* dependentPackages */,
+ null /* dependencies */,
+ false /* isNative */)
+
+ private fun builtinLibPath(libName: String): String = "/system/app/$libName/$libName.jar"
+
+ private fun apkPath(packageName: String): String =
+ File(mRule.system().dataAppDirectory, packageName).path
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java b/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java
new file mode 100644
index 0000000..b65c3e9
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java
@@ -0,0 +1,303 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.power;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.ActivityManagerInternal;
+import android.attention.AttentionManagerInternal;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.res.Resources;
+import android.hardware.SensorManager;
+import android.hardware.devicestate.DeviceStateManager;
+import android.hardware.devicestate.DeviceStateManager.DeviceStateCallback;
+import android.hardware.display.AmbientDisplayConfiguration;
+import android.hardware.display.DisplayManagerInternal;
+import android.os.BatteryManagerInternal;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.PowerSaveState;
+import android.os.test.TestLooper;
+import android.provider.Settings;
+import android.service.dreams.DreamManagerInternal;
+import android.test.mock.MockContentResolver;
+import android.view.Display;
+import android.view.DisplayInfo;
+
+import androidx.test.InstrumentationRegistry;
+
+import com.android.internal.app.IBatteryStats;
+import com.android.internal.util.test.FakeSettingsProvider;
+import com.android.server.LocalServices;
+import com.android.server.SystemService;
+import com.android.server.lights.LightsManager;
+import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.power.PowerManagerService.BatteryReceiver;
+import com.android.server.power.PowerManagerService.Injector;
+import com.android.server.power.PowerManagerService.NativeWrapper;
+import com.android.server.power.PowerManagerService.UserSwitchedReceiver;
+import com.android.server.power.batterysaver.BatterySaverController;
+import com.android.server.power.batterysaver.BatterySaverPolicy;
+import com.android.server.power.batterysaver.BatterySaverStateMachine;
+import com.android.server.power.batterysaver.BatterySavingStats;
+import com.android.server.testutils.OffsettableClock;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Tests for {@link com.android.server.power.PowerManagerService}.
+ *
+ * Build/Install/Run:
+ * atest FrameworksServicesTests:PowerManagerServiceMockingTest
+ */
+public class PowerManagerServiceMockingTest {
+ private static final String SYSTEM_PROPERTY_QUIESCENT = "ro.boot.quiescent";
+ private static final String SYSTEM_PROPERTY_REBOOT_REASON = "sys.boot.reason";
+
+ private static final float BRIGHTNESS_FACTOR = 0.7f;
+ private static final boolean BATTERY_SAVER_ENABLED = true;
+
+ @Mock private BatterySaverController mBatterySaverControllerMock;
+ @Mock private BatterySaverPolicy mBatterySaverPolicyMock;
+ @Mock private BatterySaverStateMachine mBatterySaverStateMachineMock;
+ @Mock private LightsManager mLightsManagerMock;
+ @Mock private DisplayManagerInternal mDisplayManagerInternalMock;
+ @Mock private BatteryManagerInternal mBatteryManagerInternalMock;
+ @Mock private ActivityManagerInternal mActivityManagerInternalMock;
+ @Mock private AttentionManagerInternal mAttentionManagerInternalMock;
+ @Mock private DreamManagerInternal mDreamManagerInternalMock;
+ @Mock private PowerManagerService.NativeWrapper mNativeWrapperMock;
+ @Mock private Notifier mNotifierMock;
+ @Mock private WirelessChargerDetector mWirelessChargerDetectorMock;
+ @Mock private AmbientDisplayConfiguration mAmbientDisplayConfigurationMock;
+ @Mock private SystemPropertiesWrapper mSystemPropertiesMock;
+ @Mock private DeviceStateManager mDeviceStateManagerMock;
+
+ @Mock
+ private InattentiveSleepWarningController mInattentiveSleepWarningControllerMock;
+
+ private PowerManagerService mService;
+ private PowerSaveState mPowerSaveState;
+ private ContextWrapper mContextSpy;
+ private BatteryReceiver mBatteryReceiver;
+ private UserSwitchedReceiver mUserSwitchedReceiver;
+ private Resources mResourcesSpy;
+ private OffsettableClock mClock;
+ private TestLooper mTestLooper;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ FakeSettingsProvider.clearSettingsProvider();
+
+ mPowerSaveState = new PowerSaveState.Builder()
+ .setBatterySaverEnabled(BATTERY_SAVER_ENABLED)
+ .setBrightnessFactor(BRIGHTNESS_FACTOR)
+ .build();
+ when(mBatterySaverPolicyMock.getBatterySaverPolicy(
+ eq(PowerManager.ServiceType.SCREEN_BRIGHTNESS)))
+ .thenReturn(mPowerSaveState);
+ when(mBatteryManagerInternalMock.isPowered(anyInt())).thenReturn(false);
+ when(mInattentiveSleepWarningControllerMock.isShown()).thenReturn(false);
+ when(mDisplayManagerInternalMock.requestPowerState(anyInt(), any(), anyBoolean()))
+ .thenReturn(true);
+ when(mSystemPropertiesMock.get(eq(SYSTEM_PROPERTY_QUIESCENT), anyString())).thenReturn("");
+ when(mAmbientDisplayConfigurationMock.ambientDisplayAvailable()).thenReturn(true);
+
+ addLocalServiceMock(LightsManager.class, mLightsManagerMock);
+ addLocalServiceMock(DisplayManagerInternal.class, mDisplayManagerInternalMock);
+ addLocalServiceMock(BatteryManagerInternal.class, mBatteryManagerInternalMock);
+ addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock);
+ addLocalServiceMock(AttentionManagerInternal.class, mAttentionManagerInternalMock);
+ addLocalServiceMock(DreamManagerInternal.class, mDreamManagerInternalMock);
+
+ mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
+ mResourcesSpy = spy(mContextSpy.getResources());
+ when(mContextSpy.getResources()).thenReturn(mResourcesSpy);
+
+ MockContentResolver cr = new MockContentResolver(mContextSpy);
+ cr.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
+ when(mContextSpy.getContentResolver()).thenReturn(cr);
+
+ when(mContextSpy.getSystemService(DeviceStateManager.class))
+ .thenReturn(mDeviceStateManagerMock);
+
+ Settings.Global.putInt(mContextSpy.getContentResolver(),
+ Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0);
+
+ mClock = new OffsettableClock.Stopped();
+ mTestLooper = new TestLooper(mClock::now);
+ }
+
+ private PowerManagerService createService() {
+ mService = new PowerManagerService(mContextSpy, new Injector() {
+ @Override
+ Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats,
+ SuspendBlocker suspendBlocker, WindowManagerPolicy policy,
+ FaceDownDetector faceDownDetector, ScreenUndimDetector screenUndimDetector) {
+ return mNotifierMock;
+ }
+
+ @Override
+ SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) {
+ return super.createSuspendBlocker(service, name);
+ }
+
+ @Override
+ BatterySaverPolicy createBatterySaverPolicy(
+ Object lock, Context context, BatterySavingStats batterySavingStats) {
+ return mBatterySaverPolicyMock;
+ }
+
+ @Override
+ BatterySaverController createBatterySaverController(
+ Object lock, Context context, BatterySaverPolicy batterySaverPolicy,
+ BatterySavingStats batterySavingStats) {
+ return mBatterySaverControllerMock;
+ }
+
+ @Override
+ BatterySaverStateMachine createBatterySaverStateMachine(Object lock, Context context,
+ BatterySaverController batterySaverController) {
+ return mBatterySaverStateMachineMock;
+ }
+
+ @Override
+ NativeWrapper createNativeWrapper() {
+ return mNativeWrapperMock;
+ }
+
+ @Override
+ WirelessChargerDetector createWirelessChargerDetector(
+ SensorManager sensorManager, SuspendBlocker suspendBlocker, Handler handler) {
+ return mWirelessChargerDetectorMock;
+ }
+
+ @Override
+ AmbientDisplayConfiguration createAmbientDisplayConfiguration(Context context) {
+ return mAmbientDisplayConfigurationMock;
+ }
+
+ @Override
+ InattentiveSleepWarningController createInattentiveSleepWarningController() {
+ return mInattentiveSleepWarningControllerMock;
+ }
+
+ @Override
+ public SystemPropertiesWrapper createSystemPropertiesWrapper() {
+ return mSystemPropertiesMock;
+ }
+
+ @Override
+ PowerManagerService.Clock createClock() {
+ return () -> mClock.now();
+ }
+
+ @Override
+ Handler createHandler(Looper looper, Handler.Callback callback) {
+ return new Handler(mTestLooper.getLooper(), callback);
+ }
+
+ @Override
+ void invalidateIsInteractiveCaches() {
+ // Avoids an SELinux failure.
+ }
+ });
+ return mService;
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ LocalServices.removeServiceForTest(LightsManager.class);
+ LocalServices.removeServiceForTest(DisplayManagerInternal.class);
+ LocalServices.removeServiceForTest(BatteryManagerInternal.class);
+ LocalServices.removeServiceForTest(ActivityManagerInternal.class);
+ LocalServices.removeServiceForTest(AttentionManagerInternal.class);
+ LocalServices.removeServiceForTest(DreamManagerInternal.class);
+ FakeSettingsProvider.clearSettingsProvider();
+ }
+
+ /**
+ * Creates a mock and registers it to {@link LocalServices}.
+ */
+ private static <T> void addLocalServiceMock(Class<T> clazz, T mock) {
+ LocalServices.removeServiceForTest(clazz);
+ LocalServices.addService(clazz, mock);
+ }
+
+ private void advanceTime(long timeMs) {
+ mClock.fastForward(timeMs);
+ mTestLooper.dispatchAll();
+ }
+
+ @Test
+ public void testUserActivityOnDeviceStateChange() {
+ createService();
+ mService.systemReady(null);
+ mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
+
+ final DisplayInfo info = new DisplayInfo();
+ info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP;
+ when(mDisplayManagerInternalMock.getDisplayInfo(Display.DEFAULT_DISPLAY)).thenReturn(info);
+
+ final ArgumentCaptor<DeviceStateCallback> deviceStateCallbackCaptor =
+ ArgumentCaptor.forClass(DeviceStateCallback.class);
+ verify(mDeviceStateManagerMock).registerCallback(any(),
+ deviceStateCallbackCaptor.capture());
+
+ // Advance the time 10001 and verify that the device thinks it has been idle
+ // for just less than that.
+ mService.onUserActivity();
+ advanceTime(10001);
+ assertThat(mService.wasDeviceIdleForInternal(10000)).isTrue();
+
+ // Send a display state change event and advance the clock 10.
+ final DeviceStateCallback deviceStateCallback = deviceStateCallbackCaptor.getValue();
+ deviceStateCallback.onStateChanged(1);
+ final long timeToAdvance = 10;
+ advanceTime(timeToAdvance);
+
+ // Ensure that the device has been idle for only 10 (doesn't include the idle time
+ // before the display state event).
+ assertThat(mService.wasDeviceIdleForInternal(timeToAdvance - 1)).isTrue();
+ assertThat(mService.wasDeviceIdleForInternal(timeToAdvance)).isFalse();
+
+ // Send the same state and ensure that does not trigger an update.
+ deviceStateCallback.onStateChanged(1);
+ advanceTime(timeToAdvance);
+ final long newTime = timeToAdvance * 2;
+
+ assertThat(mService.wasDeviceIdleForInternal(newTime - 1)).isTrue();
+ assertThat(mService.wasDeviceIdleForInternal(newTime)).isFalse();
+ }
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/power/ScreenUndimDetectorTest.java b/services/tests/mockingservicestests/src/com/android/server/power/ScreenUndimDetectorTest.java
index 6a35481..234d70b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/power/ScreenUndimDetectorTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/power/ScreenUndimDetectorTest.java
@@ -22,6 +22,7 @@
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_VR;
import static android.provider.DeviceConfig.NAMESPACE_ATTENTION_MANAGER_SERVICE;
+import static android.view.Display.DEFAULT_DISPLAY_GROUP;
import static com.android.server.power.ScreenUndimDetector.DEFAULT_MAX_DURATION_BETWEEN_UNDIMS_MILLIS;
import static com.android.server.power.ScreenUndimDetector.KEY_KEEP_SCREEN_ON_ENABLED;
@@ -60,6 +61,7 @@
POLICY_DIM,
POLICY_BRIGHT,
POLICY_VR);
+ private static final int OTHER_DISPLAY_GROUP = DEFAULT_DISPLAY_GROUP + 1;
@ClassRule
public static final TestableContext sContext = new TestableContext(
@@ -106,8 +108,8 @@
KEY_KEEP_SCREEN_ON_ENABLED, Boolean.FALSE.toString(), false /*makeDefault*/);
setup();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
}
@@ -116,8 +118,8 @@
public void recordScreenPolicy_samePolicy_noop() {
for (int policy : ALL_POLICIES) {
setup();
- mScreenUndimDetector.recordScreenPolicy(policy);
- mScreenUndimDetector.recordScreenPolicy(policy);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, policy);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, policy);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
}
@@ -125,13 +127,24 @@
@Test
public void recordScreenPolicy_dimToBright_extends() {
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isTrue();
}
@Test
+ public void recordScreenPolicy_dimToBright_ignoresOtherDisplayGroup() {
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+
+ mScreenUndimDetector.recordScreenPolicy(OTHER_DISPLAY_GROUP, POLICY_BRIGHT);
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isTrue();
+ }
+
+ @Test
public void recordScreenPolicy_otherTransitions_doesNotExtend() {
for (int from : ALL_POLICIES) {
for (int to : ALL_POLICIES) {
@@ -139,8 +152,8 @@
continue;
}
setup();
- mScreenUndimDetector.recordScreenPolicy(from);
- mScreenUndimDetector.recordScreenPolicy(to);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, from);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, to);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
@@ -155,28 +168,49 @@
Integer.toString(2), false /*makeDefault*/);
mScreenUndimDetector.readValuesFromDeviceConfig();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isTrue();
}
@Test
+ public void recordScreenPolicy_dimToBright_twoUndimsNeeded_otherDisplayDoesNotExtend() {
+ DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
+ KEY_UNDIMS_REQUIRED,
+ Integer.toString(2), false /*makeDefault*/);
+ mScreenUndimDetector.readValuesFromDeviceConfig();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(OTHER_DISPLAY_GROUP, POLICY_BRIGHT);
+
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isTrue();
+ }
+
+ @Test
public void recordScreenPolicy_dimBrightDimOff_resetsCounter_doesNotExtend() {
DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
KEY_UNDIMS_REQUIRED,
Integer.toString(2), false /*makeDefault*/);
mScreenUndimDetector.readValuesFromDeviceConfig();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_OFF);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_OFF);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
@@ -189,10 +223,27 @@
Integer.toString(2), false /*makeDefault*/);
mScreenUndimDetector.readValuesFromDeviceConfig();
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_OFF);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_OFF);
+
+ assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
+ assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
+ }
+
+ @Test
+ public void recordScreenPolicy_undimToOff_otherDisplayDoesNotResetCounter() {
+ DeviceConfig.setProperty(NAMESPACE_ATTENTION_MANAGER_SERVICE,
+ KEY_UNDIMS_REQUIRED,
+ Integer.toString(2), false /*makeDefault*/);
+ mScreenUndimDetector.readValuesFromDeviceConfig();
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_OFF);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
@@ -206,15 +257,15 @@
mScreenUndimDetector.readValuesFromDeviceConfig();
// undim
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
// off
- mScreenUndimDetector.recordScreenPolicy(POLICY_OFF);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_OFF);
// second undim
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(1);
@@ -227,12 +278,12 @@
Integer.toString(2), false /*makeDefault*/);
mScreenUndimDetector.readValuesFromDeviceConfig();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
mClock.advanceTime(DEFAULT_MAX_DURATION_BETWEEN_UNDIMS_MILLIS + 5);
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
assertThat(mScreenUndimDetector.mWakeLock.isHeld()).isFalse();
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(1);
@@ -246,8 +297,8 @@
mScreenUndimDetector.mUndimCounterStartedMillis = 123;
mScreenUndimDetector.mWakeLock.acquire();
- mScreenUndimDetector.recordScreenPolicy(POLICY_DIM);
- mScreenUndimDetector.recordScreenPolicy(to);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_DIM);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, to);
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
assertThat(mScreenUndimDetector.mUndimCounterStartedMillis).isEqualTo(0);
@@ -264,8 +315,8 @@
mScreenUndimDetector.mUndimCounterStartedMillis = 123;
mScreenUndimDetector.mWakeLock.acquire();
- mScreenUndimDetector.recordScreenPolicy(POLICY_BRIGHT);
- mScreenUndimDetector.recordScreenPolicy(to);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, POLICY_BRIGHT);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, to);
assertThat(mScreenUndimDetector.mUndimCounter).isEqualTo(0);
assertThat(mScreenUndimDetector.mUndimCounterStartedMillis).isEqualTo(0);
@@ -294,8 +345,8 @@
mScreenUndimDetector.mUndimCounterStartedMillis =
SystemClock.currentThreadTimeMillis();
- mScreenUndimDetector.recordScreenPolicy(from);
- mScreenUndimDetector.recordScreenPolicy(to);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, from);
+ mScreenUndimDetector.recordScreenPolicy(DEFAULT_DISPLAY_GROUP, to);
assertThat(mScreenUndimDetector.mUndimCounter).isNotEqualTo(0);
assertThat(mScreenUndimDetector.mUndimCounterStartedMillis).isNotEqualTo(0);
diff --git a/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java b/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java
new file mode 100644
index 0000000..f92f5ea
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/SystemServiceManagerTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ */
+
+package com.android.server;
+
+import static org.junit.Assert.assertThrows;
+
+import android.test.AndroidTestCase;
+
+import org.junit.Test;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+/**
+ * Tests for {@link SystemServiceManager}.
+ */
+public class SystemServiceManagerTest extends AndroidTestCase {
+
+ private static final String TAG = "SystemServiceManagerTest";
+
+ private final SystemServiceManager mSystemServiceManager =
+ new SystemServiceManager(getContext());
+
+ @Test
+ public void testSealStartedServices() throws Exception {
+ // must be effectively final, since it's changed from inner class below
+ AtomicBoolean serviceStarted = new AtomicBoolean(false);
+ SystemService service1 = new SystemService(getContext()) {
+ @Override
+ public void onStart() {
+ serviceStarted.set(true);
+ }
+ };
+ SystemService service2 = new SystemService(getContext()) {
+ @Override
+ public void onStart() {
+ throw new IllegalStateException("Second service must not be called");
+ }
+ };
+
+ // started services have their #onStart methods called
+ mSystemServiceManager.startService(service1);
+ assertTrue(serviceStarted.get());
+
+ // however, after locking started services, it is not possible to start a new service
+ mSystemServiceManager.sealStartedServices();
+ assertThrows(UnsupportedOperationException.class,
+ () -> mSystemServiceManager.startService(service2));
+ }
+
+ @Test
+ public void testDuplicateServices() throws Exception {
+ AtomicInteger counter = new AtomicInteger(0);
+ SystemService service = new SystemService(getContext()) {
+ @Override
+ public void onStart() {
+ counter.incrementAndGet();
+ }
+ };
+
+ mSystemServiceManager.startService(service);
+ assertEquals(1, counter.get());
+
+ // manager does not start the same service twice
+ mSystemServiceManager.startService(service);
+ assertEquals(1, counter.get());
+ }
+
+}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
index 3ade9ff..953b536 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
@@ -343,6 +343,20 @@
eq(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW), ArgumentMatchers.isNotNull());
}
+ @Test
+ public void testFollowTypingEnabled_defaultEnabledAndThenDisable_propagateToController() {
+ final AccessibilityUserState userState = mA11yms.mUserStates.get(
+ mA11yms.getCurrentUserIdLocked());
+ Settings.Secure.putIntForUser(
+ mTestableContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED,
+ 0, mA11yms.getCurrentUserIdLocked());
+
+ mA11yms.readMagnificationFollowTypingLocked(userState);
+
+ verify(mMockMagnificationController).setMagnificationFollowTypingEnabled(false);
+ }
+
@SmallTest
@Test
public void testOnClientChange_magnificationEnabledAndCapabilityAll_requestConnection() {
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java
index b9d94ed..27637c2 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java
@@ -172,6 +172,7 @@
mUserState.getMagnificationModeLocked(TEST_DISPLAY));
assertEquals(mFocusStrokeWidthDefaultValue, mUserState.getFocusStrokeWidthLocked());
assertEquals(mFocusColorDefaultValue, mUserState.getFocusColorLocked());
+ assertTrue(mUserState.isMagnificationFollowTypingEnabled());
}
@Test
@@ -374,6 +375,15 @@
}
@Test
+ public void setMagnificationFollowTypingEnabled_defaultTrueAndThenDisable_returnFalse() {
+ assertTrue(mUserState.isMagnificationFollowTypingEnabled());
+
+ mUserState.setMagnificationFollowTypingEnabled(false);
+
+ assertFalse(mUserState.isMagnificationFollowTypingEnabled());
+ }
+
+ @Test
public void setFocusAppearanceData_returnExpectedFocusAppearanceData() {
final int focusStrokeWidthValue = 100;
final int focusColorValue = Color.BLUE;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java
index dadc890..a9b7cfb 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java
@@ -921,6 +921,22 @@
}
@Test
+ public void requestRectOnScreen_disabledByPrefSetting_doesNothing() {
+ register(DISPLAY_0);
+ zoomIn2xToMiddle(DISPLAY_0);
+ Mockito.reset(mMockWindowManager);
+ MagnificationSpec startSpec = getCurrentMagnificationSpec(DISPLAY_0);
+ MagnificationSpec expectedEndSpec = getMagnificationSpec(2.0f, 0, 0);
+ mFullScreenMagnificationController.setMagnificationFollowTypingEnabled(false);
+
+ mFullScreenMagnificationController.onRectangleOnScreenRequested(DISPLAY_0, 0, 0, 1, 1);
+
+ assertThat(getCurrentMagnificationSpec(DISPLAY_0), closeTo(startSpec));
+ verify(mMockWindowManager, never()).setMagnificationSpec(eq(DISPLAY_0),
+ argThat(closeTo(expectedEndSpec)));
+ }
+
+ @Test
public void testRequestRectOnScreen_rectCanFitOnScreen_pansToGetRectOnScreen() {
for (int i = 0; i < DISPLAY_COUNT; i++) {
requestRectOnScreen_rectCanFitOnScreen_pansToGetRectOnScreen(i);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
index c48d618..064b762 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java
@@ -479,6 +479,14 @@
}
@Test
+ public void setPreferenceMagnificationFollowTypingEnabled_setPrefDisabled_disableAll() {
+ mMagnificationController.setMagnificationFollowTypingEnabled(false);
+
+ verify(mWindowMagnificationManager).setMagnificationFollowTypingEnabled(eq(false));
+ verify(mScreenMagnificationController).setMagnificationFollowTypingEnabled(eq(false));
+ }
+
+ @Test
public void onRectangleOnScreenRequested_fullScreenIsActivated_fullScreenDispatchEvent() {
mMagnificationController.onFullScreenMagnificationActivationState(TEST_DISPLAY,
true);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java
index f3959e6..8da513b 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationManagerTest.java
@@ -372,6 +372,25 @@
}
@Test
+ public void onRectangleOnScreenRequested_followTypingIsDisabled_withoutMovingMagnification()
+ throws RemoteException {
+ mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
+ mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3.0f, 50f, 50f);
+ final Region beforeRegion = new Region();
+ mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, beforeRegion);
+ final Rect requestedRect = beforeRegion.getBounds();
+ requestedRect.offsetTo(requestedRect.right + 10, requestedRect.bottom + 10);
+ mWindowMagnificationManager.setMagnificationFollowTypingEnabled(false);
+
+ mWindowMagnificationManager.onRectangleOnScreenRequested(TEST_DISPLAY,
+ requestedRect.left, requestedRect.top, requestedRect.right, requestedRect.bottom);
+
+ final Region afterRegion = new Region();
+ mWindowMagnificationManager.getMagnificationSourceBounds(TEST_DISPLAY, afterRegion);
+ assertEquals(afterRegion, beforeRegion);
+ }
+
+ @Test
public void moveWindowMagnifier_enabled_invokeConnectionMethod() throws RemoteException {
mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 2f, NaN, NaN);
diff --git a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
index cffff66..02cf971 100644
--- a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java
@@ -23,7 +23,14 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.debug.AdbManager;
+import android.debug.IAdbManager;
+import android.os.ServiceManager;
import android.provider.Settings;
import android.util.Log;
@@ -105,6 +112,7 @@
public void tearDown() throws Exception {
mKeyStore.deleteKeyStore();
setAllowedConnectionTime(mOriginalAllowedConnectionTime);
+ dropShellPermissionIdentity();
}
/**
@@ -813,6 +821,108 @@
return hasAtLeastOneLetter;
}
+ CountDownLatch mAdbActionLatch = new CountDownLatch(1);
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ Log.i(TAG, "Received intent action=" + action);
+ if (AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION.equals(action)) {
+ assertEquals("Received broadcast without MANAGE_DEBUGGING permission.",
+ context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_GRANTED);
+ Log.i(TAG, "action=" + action + " paired_device=" + intent.getSerializableExtra(
+ AdbManager.WIRELESS_DEVICES_EXTRA).toString());
+ mAdbActionLatch.countDown();
+ } else if (AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION.equals(action)) {
+ assertEquals("Received broadcast without MANAGE_DEBUGGING permission.",
+ context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_GRANTED);
+ int status = intent.getIntExtra(AdbManager.WIRELESS_STATUS_EXTRA,
+ AdbManager.WIRELESS_STATUS_DISCONNECTED);
+ Log.i(TAG, "action=" + action + " status=" + status);
+ mAdbActionLatch.countDown();
+ } else if (AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION.equals(action)) {
+ assertEquals("Received broadcast without MANAGE_DEBUGGING permission.",
+ context.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_GRANTED);
+ Integer res = intent.getIntExtra(
+ AdbManager.WIRELESS_STATUS_EXTRA,
+ AdbManager.WIRELESS_STATUS_FAIL);
+ Log.i(TAG, "action=" + action + " result=" + res);
+
+ if (res.equals(AdbManager.WIRELESS_STATUS_PAIRING_CODE)) {
+ String pairingCode = intent.getStringExtra(
+ AdbManager.WIRELESS_PAIRING_CODE_EXTRA);
+ Log.i(TAG, "pairingCode=" + pairingCode);
+ } else if (res.equals(AdbManager.WIRELESS_STATUS_CONNECTED)) {
+ int port = intent.getIntExtra(AdbManager.WIRELESS_DEBUG_PORT_EXTRA, 0);
+ Log.i(TAG, "port=" + port);
+ }
+ mAdbActionLatch.countDown();
+ }
+ }
+ };
+
+ private void adoptShellPermissionIdentity() {
+ InstrumentationRegistry.getInstrumentation().getUiAutomation()
+ .adoptShellPermissionIdentity(android.Manifest.permission.MANAGE_DEBUGGING);
+ }
+
+ private void dropShellPermissionIdentity() {
+ InstrumentationRegistry.getInstrumentation().getUiAutomation()
+ .dropShellPermissionIdentity();
+ }
+
+ @Test
+ public void testBroadcastReceiverWithPermissions() throws Exception {
+ adoptShellPermissionIdentity();
+ final IAdbManager mAdbManager = IAdbManager.Stub.asInterface(
+ ServiceManager.getService(Context.ADB_SERVICE));
+ IntentFilter intentFilter =
+ new IntentFilter(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION);
+ intentFilter.addAction(AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION);
+ intentFilter.addAction(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
+ assertEquals("Context does not have MANAGE_DEBUGGING permission.",
+ mContext.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_GRANTED);
+ try {
+ mContext.registerReceiver(mReceiver, intentFilter);
+ mAdbManager.enablePairingByPairingCode();
+ if (!mAdbActionLatch.await(TIMEOUT, TIMEOUT_TIME_UNIT)) {
+ fail("Receiver did not receive adb intent action within the timeout duration");
+ }
+ } finally {
+ mContext.unregisterReceiver(mReceiver);
+ }
+ }
+
+ @Test
+ public void testBroadcastReceiverWithoutPermissions() throws Exception {
+ adoptShellPermissionIdentity();
+ final IAdbManager mAdbManager = IAdbManager.Stub.asInterface(
+ ServiceManager.getService(Context.ADB_SERVICE));
+ IntentFilter intentFilter =
+ new IntentFilter(AdbManager.WIRELESS_DEBUG_PAIRED_DEVICES_ACTION);
+ intentFilter.addAction(AdbManager.WIRELESS_DEBUG_STATE_CHANGED_ACTION);
+ intentFilter.addAction(AdbManager.WIRELESS_DEBUG_PAIRING_RESULT_ACTION);
+ mAdbManager.enablePairingByPairingCode();
+
+ dropShellPermissionIdentity();
+ assertEquals("Context has MANAGE_DEBUGGING permission.",
+ mContext.checkSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING),
+ PackageManager.PERMISSION_DENIED);
+ try {
+ mContext.registerReceiver(mReceiver, intentFilter);
+
+ if (mAdbActionLatch.await(TIMEOUT, TIMEOUT_TIME_UNIT)) {
+ fail("Broadcast receiver received adb action intent without debug permissions");
+ }
+ } finally {
+ mContext.unregisterReceiver(mReceiver);
+ }
+ }
+
/**
* Runs an adb test with the provided configuration.
*
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/LockoutResetDispatcherTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/LockoutResetDispatcherTest.java
new file mode 100644
index 0000000..a53e22e
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/LockoutResetDispatcherTest.java
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ */
+
+package com.android.server.biometrics.sensors;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.hardware.biometrics.IBiometricServiceLockoutResetCallback;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.IRemoteCallback;
+import android.platform.test.annotations.Presubmit;
+import android.testing.TestableContext;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@Presubmit
+@SmallTest
+public class LockoutResetDispatcherTest {
+
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ @Rule
+ public final TestableContext mContext = new TestableContext(
+ InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
+
+ @Mock
+ private IBinder mBinder;
+ @Mock
+ private IBiometricServiceLockoutResetCallback mCallback;
+
+ private LockoutResetDispatcher mDispatcher;
+
+ @Before
+ public void setup() {
+ when(mCallback.asBinder()).thenReturn(mBinder);
+ mDispatcher = new LockoutResetDispatcher(mContext);
+ }
+
+ @Test
+ public void linksToDeath() throws Exception {
+ mDispatcher.addCallback(mCallback, "package");
+ verify(mBinder).linkToDeath(eq(mDispatcher), anyInt());
+ }
+
+ @Test
+ public void notifyLockoutReset() throws Exception {
+ final int sensorId = 24;
+
+ mDispatcher.addCallback(mCallback, "some.package");
+ mDispatcher.notifyLockoutResetCallbacks(sensorId);
+
+ final ArgumentCaptor<IRemoteCallback> captor =
+ ArgumentCaptor.forClass(IRemoteCallback.class);
+ verify(mCallback).onLockoutReset(eq(sensorId), captor.capture());
+ captor.getValue().sendResult(new Bundle());
+ }
+
+ @Test
+ public void releaseWakeLockOnDeath() {
+ mDispatcher.addCallback(mCallback, "a.b.cee");
+ mDispatcher.binderDied(mBinder);
+
+ // would be better to check the wake lock
+ // but this project lacks the extended mockito support to do it
+ assertThat(mDispatcher.mClientCallbacks).isEmpty();
+ }
+
+ @Test
+ public void releaseCorrectWakeLockOnDeath() {
+ mDispatcher.addCallback(mCallback, "a.b");
+ mDispatcher.binderDied(mock(IBinder.class));
+
+ assertThat(mDispatcher.mClientCallbacks).hasSize(1);
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index cf6165f..e4273dc 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -375,7 +375,7 @@
switchUser(user1.id, null, /* ignoreHandle= */ true);
assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ false))
- .isEqualTo(UserManager.REMOVE_RESULT_SET_EPHEMERAL);
+ .isEqualTo(UserManager.REMOVE_RESULT_DEFERRED);
assertThat(hasUser(user1.id)).isTrue();
assertThat(getUser(user1.id).isEphemeral()).isTrue();
diff --git a/services/tests/servicestests/src/com/android/server/powerstats/PowerStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/powerstats/PowerStatsServiceTest.java
index 26b34fd..304fe5a 100644
--- a/services/tests/servicestests/src/com/android/server/powerstats/PowerStatsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/powerstats/PowerStatsServiceTest.java
@@ -30,6 +30,7 @@
import android.hardware.power.stats.State;
import android.hardware.power.stats.StateResidency;
import android.hardware.power.stats.StateResidencyResult;
+import android.os.Looper;
import androidx.test.InstrumentationRegistry;
@@ -145,12 +146,12 @@
}
@Override
- PowerStatsLogger createPowerStatsLogger(Context context, File dataStoragePath,
- String meterFilename, String meterCacheFilename,
+ PowerStatsLogger createPowerStatsLogger(Context context, Looper looper,
+ File dataStoragePath, String meterFilename, String meterCacheFilename,
String modelFilename, String modelCacheFilename,
String residencyFilename, String residencyCacheFilename,
IPowerStatsHALWrapper powerStatsHALWrapper) {
- mPowerStatsLogger = new PowerStatsLogger(context, dataStoragePath,
+ mPowerStatsLogger = new PowerStatsLogger(context, looper, dataStoragePath,
meterFilename, meterCacheFilename,
modelFilename, modelCacheFilename,
residencyFilename, residencyCacheFilename,
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/DeviceVibrationEffectAdapterTest.java b/services/tests/servicestests/src/com/android/server/vibrator/DeviceVibrationEffectAdapterTest.java
index b934ecb..739b3b1 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/DeviceVibrationEffectAdapterTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/DeviceVibrationEffectAdapterTest.java
@@ -54,11 +54,10 @@
/* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f, /* 200Hz= */ 0.8f};
private static final VibratorInfo.FrequencyMapping EMPTY_FREQUENCY_MAPPING =
- new VibratorInfo.FrequencyMapping(Float.NaN, Float.NaN, Float.NaN, Float.NaN, null);
+ new VibratorInfo.FrequencyMapping(Float.NaN, Float.NaN, Float.NaN, null);
private static final VibratorInfo.FrequencyMapping TEST_FREQUENCY_MAPPING =
- new VibratorInfo.FrequencyMapping(TEST_MIN_FREQUENCY,
- TEST_RESONANT_FREQUENCY, TEST_FREQUENCY_RESOLUTION,
- /* suggestedSafeRangeHz= */ 50, TEST_AMPLITUDE_MAP);
+ new VibratorInfo.FrequencyMapping(TEST_RESONANT_FREQUENCY, TEST_MIN_FREQUENCY,
+ TEST_FREQUENCY_RESOLUTION, TEST_AMPLITUDE_MAP);
private DeviceVibrationEffectAdapter mAdapter;
@@ -87,14 +86,14 @@
@Test
public void testStepAndRampSegments_withoutPwleCapability_convertsRampsToSteps() {
VibrationEffect.Composed effect = new VibrationEffect.Composed(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 200, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 150, /* duration= */ 100),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ -4, /* endFrequency= */ 2, /* duration= */ 10),
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 300, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 0, /* endFrequency= */ 0, /* duration= */ 100),
+ /* startFrequencyHz= */ 0, /* endFrequencyHz= */ 0, /* duration= */ 100),
new RampSegment(/* startAmplitude= */ 0.65f, /* endAmplitude= */ 0.65f,
- /* startFrequency= */ 0, /* endFrequency= */ 1, /* duration= */ 1000)),
+ /* startFrequencyHz= */ 0, /* endFrequencyHz= */ 1, /* duration= */ 1000)),
/* repeatIndex= */ 3);
VibrationEffect.Composed adaptedEffect = (VibrationEffect.Composed) mAdapter.apply(effect,
@@ -110,23 +109,23 @@
@Test
public void testStepAndRampSegments_withPwleCapability_convertsStepsToRamps() {
VibrationEffect.Composed effect = new VibrationEffect.Composed(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 175, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 150, /* duration= */ 60),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ -4, /* endFrequency= */ 2, /* duration= */ 50),
+ /* startFrequencyHz= */ 50, /* endFrequencyHz= */ 200, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20)),
+ /* startFrequencyHz= */ 1000, /* endFrequencyHz= */ 1, /* duration= */ 20)),
/* repeatIndex= */ 2);
VibrationEffect.Composed expected = new VibrationEffect.Composed(Arrays.asList(
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude*/ 0,
- /* startFrequency= */ 175, /* endFrequency= */ 175, /* duration= */ 10),
+ /* startFrequencyHz= */ 175, /* endFrequencyHz= */ 175, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.5f,
- /* startFrequency= */ 150, /* endFrequency= */ 150, /* duration= */ 100),
+ /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 150, /* duration= */ 60),
new RampSegment(/* startAmplitude= */ 0.1f, /* endAmplitude= */ 0.8f,
- /* startFrequency= */ 50, /* endFrequency= */ 200, /* duration= */ 50),
+ /* startFrequencyHz= */ 50, /* endFrequencyHz= */ 200, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.1f,
- /* startFrequency= */ 200, /* endFrequency= */ 50, /* duration= */ 20)),
+ /* startFrequencyHz= */ 200, /* endFrequencyHz= */ 50, /* duration= */ 20)),
/* repeatIndex= */ 2);
VibratorInfo info = createVibratorInfo(TEST_FREQUENCY_MAPPING,
@@ -135,28 +134,28 @@
}
@Test
- public void testStepAndRampSegments_withEmptyFreqMapping_returnsSameAmplitudesAndZeroFreq() {
+ public void testStepAndRampSegments_withEmptyFreqMapping_returnsAmplitudesWithResonantFreq() {
VibrationEffect.Composed effect = new VibrationEffect.Composed(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 175, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 100),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 1,
- /* startFrequency= */ -1, /* endFrequency= */ 1, /* duration= */ 50),
+ /* startFrequencyHz= */ 50, /* endFrequencyHz= */ 200, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.7f, /* endAmplitude= */ 0.5f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20)),
+ /* startFrequencyHz= */ 1000, /* endFrequencyHz= */ 1, /* duration= */ 20)),
/* repeatIndex= */ 2);
VibrationEffect.Composed expected = new VibrationEffect.Composed(Arrays.asList(
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 0,
- /* startFrequency= */ Float.NaN, /* endFrequency= */ Float.NaN,
+ /* startFrequencyHz= */ Float.NaN, /* endFrequencyHz= */ Float.NaN,
/* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.5f,
- /* startFrequency= */ Float.NaN, /* endFrequency= */ Float.NaN,
+ /* startFrequencyHz= */ Float.NaN, /* endFrequencyHz= */ Float.NaN,
/* duration= */ 100),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 1,
- /* startFrequency= */ Float.NaN, /* endFrequency= */ Float.NaN,
+ /* startFrequencyHz= */ Float.NaN, /* endFrequencyHz= */ Float.NaN,
/* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.7f, /* endAmplitude= */ 0.5f,
- /* startFrequency= */ Float.NaN, /* endFrequency= */ Float.NaN,
+ /* startFrequencyHz= */ Float.NaN, /* endFrequencyHz= */ Float.NaN,
/* duration= */ 20)),
/* repeatIndex= */ 2);
@@ -168,25 +167,25 @@
@Test
public void testStepAndRampSegments_withValidFreqMapping_returnsClippedValues() {
VibrationEffect.Composed effect = new VibrationEffect.Composed(Arrays.asList(
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 1, /* frequency= */ -1, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 125, /* duration= */ 100),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ -4, /* endFrequency= */ 2, /* duration= */ 50),
+ /* startFrequencyHz= */ 50, /* endFrequencyHz= */ 200, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20)),
+ /* startFrequencyHz= */ 1000, /* endFrequencyHz= */ 1, /* duration= */ 20)),
/* repeatIndex= */ 2);
VibrationEffect.Composed expected = new VibrationEffect.Composed(Arrays.asList(
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.5f,
- /* startFrequency= */ 150, /* endFrequency= */ 150,
+ /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 150,
/* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.8f,
- /* startFrequency= */ 125, /* endFrequency= */ 125,
+ /* startFrequencyHz= */ 125, /* endFrequencyHz= */ 125,
/* duration= */ 100),
new RampSegment(/* startAmplitude= */ 0.1f, /* endAmplitude= */ 0.8f,
- /* startFrequency= */ 50, /* endFrequency= */ 200, /* duration= */ 50),
+ /* startFrequencyHz= */ 50, /* endFrequencyHz= */ 200, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.1f,
- /* startFrequency= */ 200, /* endFrequency= */ 50, /* duration= */ 20)),
+ /* startFrequencyHz= */ 200, /* endFrequencyHz= */ 50, /* duration= */ 20)),
/* repeatIndex= */ 2);
VibratorInfo info = createVibratorInfo(TEST_FREQUENCY_MAPPING,
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
index e2a348e..4556a4a 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibrator.java
@@ -17,6 +17,7 @@
package com.android.server.vibrator;
import android.annotation.NonNull;
+import android.content.Context;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
@@ -24,37 +25,8 @@
/** Fake implementation of {@link Vibrator} for service tests. */
final class FakeVibrator extends Vibrator {
- private int mDefaultHapticFeedbackIntensity = Vibrator.VIBRATION_INTENSITY_MEDIUM;
- private int mDefaultNotificationIntensity = Vibrator.VIBRATION_INTENSITY_MEDIUM;
- private int mDefaultRingIntensity = Vibrator.VIBRATION_INTENSITY_MEDIUM;
-
- @Override
- public int getDefaultHapticFeedbackIntensity() {
- return mDefaultHapticFeedbackIntensity;
- }
-
- @Override
- public int getDefaultNotificationVibrationIntensity() {
- return mDefaultNotificationIntensity;
- }
-
- @Override
- public int getDefaultRingVibrationIntensity() {
- return mDefaultRingIntensity;
- }
-
- public void setDefaultHapticFeedbackIntensity(
- @VibrationIntensity int defaultHapticFeedbackIntensity) {
- mDefaultHapticFeedbackIntensity = defaultHapticFeedbackIntensity;
- }
-
- public void setDefaultNotificationVibrationIntensity(
- @VibrationIntensity int defaultNotificationIntensity) {
- mDefaultNotificationIntensity = defaultNotificationIntensity;
- }
-
- public void setDefaultRingVibrationIntensity(@VibrationIntensity int defaultRingIntensity) {
- mDefaultRingIntensity = defaultRingIntensity;
+ FakeVibrator(Context context) {
+ super(context);
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java
index 777e3f4..2ad0e93 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/FakeVibratorControllerProvider.java
@@ -87,7 +87,7 @@
@Override
public long on(long milliseconds, long vibrationId) {
mEffectSegments.add(new StepSegment(VibrationEffect.DEFAULT_AMPLITUDE,
- /* frequency= */ 0, (int) milliseconds));
+ /* frequencyHz= */ 0, (int) milliseconds));
applyLatency();
scheduleListener(milliseconds, vibrationId);
return milliseconds;
@@ -158,7 +158,7 @@
}
@Override
- public boolean getInfo(float suggestedFrequencyRange, VibratorInfo.Builder infoBuilder) {
+ public boolean getInfo(VibratorInfo.Builder infoBuilder) {
infoBuilder.setCapabilities(mCapabilities);
infoBuilder.setSupportedBraking(mSupportedBraking);
infoBuilder.setPwleSizeMax(mPwleSizeMax);
@@ -170,9 +170,8 @@
}
infoBuilder.setCompositionSizeMax(mCompositionSizeMax);
infoBuilder.setQFactor(mQFactor);
- infoBuilder.setFrequencyMapping(new VibratorInfo.FrequencyMapping(mMinFrequency,
- mResonantFrequency, mFrequencyResolution, suggestedFrequencyRange,
- mMaxAmplitudes));
+ infoBuilder.setFrequencyMapping(new VibratorInfo.FrequencyMapping(
+ mResonantFrequency, mMinFrequency, mFrequencyResolution, mMaxAmplitudes));
return mIsInfoLoadSuccessful;
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/RampDownAdapterTest.java b/services/tests/servicestests/src/com/android/server/vibrator/RampDownAdapterTest.java
index 4c3312c..a3edf23 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/RampDownAdapterTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/RampDownAdapterTest.java
@@ -70,9 +70,9 @@
@Test
public void testRampAndStepSegments_withNoOffSegment_keepsListUnchanged() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 100),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20)));
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 50, /* duration= */ 20)));
List<VibrationEffectSegment> originalSegments = new ArrayList<>(segments);
assertEquals(-1, mAdapter.apply(segments, -1, TEST_VIBRATOR_INFO));
@@ -86,12 +86,12 @@
mAdapter = new RampDownAdapter(/* rampDownDuration= */ 0, TEST_STEP_DURATION);
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 100),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20),
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 50, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 0,
- /* startFrequency= */ 0, /* endFrequency= */ 0, /* duration= */ 50)));
+ /* startFrequencyHz= */ 0, /* endFrequencyHz= */ 0, /* duration= */ 50)));
List<VibrationEffectSegment> originalSegments = new ArrayList<>(segments);
assertEquals(-1, mAdapter.apply(segments, -1, TEST_VIBRATOR_INFO));
@@ -102,12 +102,12 @@
@Test
public void testStepSegments_withShortZeroSegment_replaceWithStepsDown() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 10)));
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 10)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 5));
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 5));
assertEquals(-1, mAdapter.apply(segments, -1, TEST_VIBRATOR_INFO));
assertEquals(expectedSegments, segments);
@@ -116,17 +116,17 @@
@Test
public void testStepSegments_withLongZeroSegment_replaceWithStepsDownWithRemainingOffSegment() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 0,
- /* startFrequency= */ 0, /* endFrequency= */ 0, /* duration= */ 50),
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ 0, /* duration= */ 100)));
+ /* startFrequencyHz= */ 0, /* endFrequencyHz= */ 0, /* duration= */ 50),
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 0, /* duration= */ 100)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.75f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.25f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 35),
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ 0, /* duration= */ 100));
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.75f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.25f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 35),
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 0, /* duration= */ 100));
assertEquals(-1, mAdapter.apply(segments, -1, TEST_VIBRATOR_INFO));
assertEquals(expectedSegments, segments);
@@ -135,16 +135,16 @@
@Test
public void testStepSegments_withZeroSegmentBeforeRepeat_fixesRepeat() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 50),
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ 0, /* duration= */ 100)));
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 50),
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 0, /* duration= */ 100)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.75f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.25f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 35),
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ 0, /* duration= */ 100));
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.75f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.25f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 35),
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 0, /* duration= */ 100));
// Repeat index fixed after intermediate steps added
assertEquals(5, mAdapter.apply(segments, 2, TEST_VIBRATOR_INFO));
@@ -154,14 +154,14 @@
@Test
public void testStepSegments_withZeroSegmentAfterRepeat_preservesRepeat() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ 0, /* duration= */ 100)));
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 0, /* duration= */ 100)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ 0, /* duration= */ 100));
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 0, /* duration= */ 100));
assertEquals(3, mAdapter.apply(segments, 2, TEST_VIBRATOR_INFO));
assertEquals(expectedSegments, segments);
@@ -170,22 +170,22 @@
@Test
public void testStepSegments_withZeroSegmentAtRepeat_fixesRepeatAndAppendOriginalToListEnd() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 50),
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 100)));
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 50),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 100)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.75f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.25f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 35),
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.75f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.25f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 35),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 100),
// Original zero segment appended to the end of new looping vibration,
// then converted to ramp down as well.
- new StepSegment(/* amplitude= */ 0.75f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.25f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 35));
+ new StepSegment(/* amplitude= */ 0.75f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.25f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 35));
// Repeat index fixed after intermediate steps added
assertEquals(5, mAdapter.apply(segments, 1, TEST_VIBRATOR_INFO));
@@ -195,8 +195,8 @@
@Test
public void testStepSegments_withRepeatToNonZeroSegment_keepsOriginalSteps() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100)));
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 100)));
List<VibrationEffectSegment> originalSegments = new ArrayList<>(segments);
assertEquals(0, mAdapter.apply(segments, 0, TEST_VIBRATOR_INFO));
@@ -208,14 +208,14 @@
public void testStepSegments_withRepeatToShortZeroSegment_skipAndAppendRampDown() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 0,
- /* startFrequency= */ 0, /* endFrequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 30)));
+ /* startfrequencyHz= */ 0, /* endfrequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 30)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 0,
- /* startFrequency= */ 0, /* endFrequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 30),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 5));
+ /* startfrequencyHz= */ 0, /* endfrequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 30),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 5));
// Shift repeat index to the right to use append instead of zero segment.
assertEquals(1, mAdapter.apply(segments, 0, TEST_VIBRATOR_INFO));
@@ -226,17 +226,17 @@
@Test
public void testStepSegments_withRepeatToLongZeroSegment_splitAndAppendRampDown() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 120),
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 30)));
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 120),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 30)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
// Split long zero segment to skip part of it.
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 20),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 100),
- new StepSegment(/* amplitude= */ 1, /* frequency= */ 0, /* duration= */ 30),
- new StepSegment(/* amplitude= */ 0.75f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.25f, /* frequency= */ 0, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 5));
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 20),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 0, /* duration= */ 30),
+ new StepSegment(/* amplitude= */ 0.75f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.25f, /* frequencyHz= */ 0, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 5));
// Shift repeat index to the right to use append with part of the zero segment.
assertEquals(1, mAdapter.apply(segments, 0, TEST_VIBRATOR_INFO));
@@ -248,18 +248,20 @@
public void testRampSegments_withShortZeroSegment_replaceWithRampDown() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude*/ 0.5f,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 10),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 0,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 20),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 30)));
+ /* startFrequencyHz= */ 200, /* endFrequencyHz= */ 200,
+ /* duration= */ 30)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude*/ 0.5f,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 10),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 20),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 30));
+ /* startFrequencyHz= */ 200, /* endFrequencyHz= */ 200,
+ /* duration= */ 30));
assertEquals(2, mAdapter.apply(segments, 2, TEST_VIBRATOR_INFO));
@@ -269,20 +271,23 @@
@Test
public void testRampSegments_withLongZeroSegment_splitAndAddRampDown() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude*/ 0.5f,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 150),
+ new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.5f,
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 150, /* duration= */ 150),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 30)));
+ /* startFrequencyHz= */ 200, /* endFrequencyHz= */ 200,
+ /* duration= */ 30)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude*/ 0.5f,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 10),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 20),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 0,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 130),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100,
+ /* duration= */ 130),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 30));
+ /* startFrequencyHz= */ 200, /* endFrequencyHz= */ 200,
+ /* duration= */ 30));
// Repeat index fixed after intermediate steps added
assertEquals(3, mAdapter.apply(segments, 2, TEST_VIBRATOR_INFO));
@@ -294,9 +299,10 @@
public void testRampSegments_withRepeatToNonZeroSegment_keepsOriginalSteps() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude*/ 0.5f,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 10),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 30)));
+ /* startFrequencyHz= */ 200, /* endFrequencyHz= */ 200,
+ /* duration= */ 30)));
List<VibrationEffectSegment> originalSegments = new ArrayList<>(segments);
assertEquals(0, mAdapter.apply(segments, 0, TEST_VIBRATOR_INFO));
@@ -307,15 +313,15 @@
@Test
public void testRampSegments_withRepeatToShortZeroSegment_skipAndAppendRampDown() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 20),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 200, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude*/ 1,
- /* startFrequency= */ 0, /* endFrequency= */ 1, /* duration= */ 20)));
+ /* startFrequencyHz= */ 40, /* endFrequencyHz= */ 80, /* duration= */ 20)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 20),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 200, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 1,
- /* startFrequency= */ 0, /* endFrequency= */ 1, /* duration= */ 20),
+ /* startFrequencyHz= */ 40, /* endFrequencyHz= */ 80, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 0,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 20));
+ /* startFrequencyHz= */ 80, /* endFrequencyHz= */ 80, /* duration= */ 20));
// Shift repeat index to the right to use append instead of zero segment.
assertEquals(1, mAdapter.apply(segments, 0, TEST_VIBRATOR_INFO));
@@ -327,19 +333,19 @@
public void testRampSegments_withRepeatToLongZeroSegment_splitAndAppendRampDown() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude*/ 0,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 70),
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 1, /* duration= */ 70),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 1,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 30)));
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 1, /* duration= */ 30)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
// Split long zero segment to skip part of it.
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude*/ 0,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 20),
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 1, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude*/ 0,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 50),
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 1, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 1,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 30),
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 1, /* duration= */ 30),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 0,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 20));
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 1, /* duration= */ 20));
// Shift repeat index to the right to use append with part of the zero segment.
assertEquals(1, mAdapter.apply(segments, 0, TEST_VIBRATOR_INFO));
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/RampToStepAdapterTest.java b/services/tests/servicestests/src/com/android/server/vibrator/RampToStepAdapterTest.java
index 95c3bd9..22db917 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/RampToStepAdapterTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/RampToStepAdapterTest.java
@@ -45,6 +45,12 @@
@Presubmit
public class RampToStepAdapterTest {
private static final int TEST_STEP_DURATION = 5;
+ private static final float[] TEST_AMPLITUDE_MAP = new float[]{
+ /* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f, /* 200Hz= */ 0.8f};
+ private static final VibratorInfo.FrequencyMapping TEST_FREQUENCY_MAPPING =
+ new VibratorInfo.FrequencyMapping(
+ /* resonantFrequencyHz= */ 150f, /* minFrequencyHz= */ 50f,
+ /* frequencyResolutionHz= */ 25f, TEST_AMPLITUDE_MAP);
private RampToStepAdapter mAdapter;
@@ -56,7 +62,7 @@
@Test
public void testStepAndPrebakedAndPrimitiveSegments_keepsListUnchanged() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 1, /* duration= */ 10),
new PrebakedSegment(
VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_LIGHT),
new PrimitiveSegment(VibrationEffect.Composition.PRIMITIVE_TICK, 1, 10)));
@@ -71,9 +77,9 @@
@Test
public void testRampSegments_withPwleCapability_keepsListUnchanged() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 100),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20)));
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 1, /* duration= */ 20)));
List<VibrationEffectSegment> originalSegments = new ArrayList<>(segments);
VibratorInfo vibratorInfo = createVibratorInfo(IVibrator.CAP_COMPOSE_PWLE_EFFECTS);
@@ -86,27 +92,28 @@
@Test
public void testRampSegments_withoutPwleCapability_convertsRampsToSteps() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 1, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 10, /* duration= */ 100),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ -4, /* endFrequency= */ 2, /* duration= */ 10),
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 0, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ -3, /* endFrequency= */ 0, /* duration= */ 11),
+ /* startFrequencyHz= */ 30, /* endFrequencyHz= */ 60, /* duration= */ 11),
new RampSegment(/* startAmplitude= */ 0.65f, /* endAmplitude= */ 0.65f,
- /* startFrequency= */ 0, /* endFrequency= */ 1, /* duration= */ 200)));
+ /* startFrequencyHz= */ 0, /* endFrequencyHz= */ 1, /* duration= */ 200)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 1, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 10, /* duration= */ 100),
// 10ms ramp becomes 2 steps
- new StepSegment(/* amplitude= */ 1, /* frequency= */ -4, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.2f, /* frequency= */ 2, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 1, /* frequencyHz= */ 10, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.2f, /* frequencyHz= */ 150, /* duration= */ 5),
// 11ms ramp becomes 3 steps
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ -3, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.6f, /* frequency= */ -2, /* duration= */ 5),
- new StepSegment(/* amplitude= */ 0.2f, /* frequency= */ 0, /* duration= */ 1),
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 30, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.6f, /* frequencyHz= */ 40, /* duration= */ 5),
+ new StepSegment(/* amplitude= */ 0.2f, /* frequencyHz= */ 60, /* duration= */ 1),
// 200ms ramp with same amplitude becomes a single step
- new StepSegment(/* amplitude= */ 0.65f, /* frequency= */ 0, /* duration= */ 200));
+ new StepSegment(/* amplitude= */ 0.65f, /* frequencyHz= */ 150,
+ /* duration= */ 200));
// Repeat index fixed after intermediate steps added
assertEquals(4, mAdapter.apply(segments, 3, createVibratorInfo()));
@@ -117,6 +124,7 @@
private static VibratorInfo createVibratorInfo(int... capabilities) {
return new VibratorInfo.Builder(0)
.setCapabilities(IntStream.of(capabilities).reduce((a, b) -> a | b).orElse(0))
+ .setFrequencyMapping(TEST_FREQUENCY_MAPPING)
.build();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/StepToRampAdapterTest.java b/services/tests/servicestests/src/com/android/server/vibrator/StepToRampAdapterTest.java
index 128cd2f..18ff953 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/StepToRampAdapterTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/StepToRampAdapterTest.java
@@ -44,6 +44,13 @@
*/
@Presubmit
public class StepToRampAdapterTest {
+ private static final float[] TEST_AMPLITUDE_MAP = new float[]{
+ /* 50Hz= */ 0.1f, 0.2f, 0.4f, 0.8f, /* 150Hz= */ 1f, 0.9f, /* 200Hz= */ 0.8f};
+ private static final VibratorInfo.FrequencyMapping TEST_FREQUENCY_MAPPING =
+ new VibratorInfo.FrequencyMapping(
+ /* resonantFrequencyHz= */ 150f, /* minFrequencyHz= */ 50f,
+ /* frequencyResolutionHz= */ 25f, TEST_AMPLITUDE_MAP);
+
private StepToRampAdapter mAdapter;
@Before
@@ -55,7 +62,7 @@
public void testRampAndPrebakedAndPrimitiveSegments_returnsOriginalSegments() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ -4, /* endFrequency= */ 2, /* duration= */ 10),
+ /* startFrequencyHz= */ 40f, /* endFrequencyHz= */ 20f, /* duration= */ 10),
new PrebakedSegment(
VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_LIGHT),
new PrimitiveSegment(VibrationEffect.Composition.PRIMITIVE_TICK, 1, 10)));
@@ -71,27 +78,28 @@
public void testRampSegments_withPwleDurationLimit_splitsLongRamps() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude*/ 0.5f,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 10),
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 10, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 1,
- /* startFrequency= */ 0, /* endFrequency= */ -1, /* duration= */ 25),
+ /* startFrequencyHz= */ 0, /* endFrequencyHz= */ 50, /* duration= */ 25),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude*/ 1,
- /* startFrequency= */ 0, /* endFrequency= */ 1, /* duration= */ 5)));
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 20, /* duration= */ 5)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude*/ 0.5f,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 10),
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 10, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 0.32f,
- /* startFrequency= */ 0, /* endFrequency= */ -0.32f, /* duration= */ 8),
+ /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 118f, /* duration= */ 8),
new RampSegment(/* startAmplitude= */ 0.32f, /* endAmplitude= */ 0.64f,
- /* startFrequency= */ -0.32f, /* endFrequency= */ -0.64f,
+ /* startFrequencyHz= */ 118f, /* endFrequencyHz= */ 86f,
/* duration= */ 8),
new RampSegment(/* startAmplitude= */ 0.64f, /* endAmplitude= */ 1,
- /* startFrequency= */ -0.64f, /* endFrequency= */ -1, /* duration= */ 9),
+ /* startFrequencyHz= */ 86f, /* endFrequencyHz= */ 50f, /* duration= */ 9),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude*/ 1,
- /* startFrequency= */ 0, /* endFrequency= */ 1, /* duration= */ 5));
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 20, /* duration= */ 5));
VibratorInfo vibratorInfo = new VibratorInfo.Builder(0)
.setCapabilities(IVibrator.CAP_COMPOSE_PWLE_EFFECTS)
.setPwlePrimitiveDurationMax(10)
+ .setFrequencyMapping(TEST_FREQUENCY_MAPPING)
.build();
// Update repeat index to skip the ramp splits.
@@ -102,9 +110,9 @@
@Test
public void testStepAndRampSegments_withoutPwleCapability_keepsListUnchanged() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 1, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20)));
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 50, /* duration= */ 20)));
List<VibrationEffectSegment> originalSegments = new ArrayList<>(segments);
assertEquals(-1, mAdapter.apply(segments, -1, createVibratorInfo()));
@@ -116,13 +124,13 @@
@Test
public void testStepAndRampSegments_withPwleCapabilityAndNoFrequency_keepsOriginalSteps() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 0, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 0, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 100),
new PrimitiveSegment(VibrationEffect.Composition.PRIMITIVE_TICK, 1, 10),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ -4, /* endFrequency= */ 2, /* duration= */ 50),
+ /* startFrequencyHz= */ 40, /* endFrequencyHz= */ 200, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20)));
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 1, /* duration= */ 20)));
List<VibrationEffectSegment> originalSegments = new ArrayList<>(segments);
VibratorInfo vibratorInfo = createVibratorInfo(IVibrator.CAP_COMPOSE_PWLE_EFFECTS);
@@ -135,25 +143,25 @@
@Test
public void testStepAndRampSegments_withPwleCapabilityAndStepNextToRamp_convertsStepsToRamps() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ 1, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 0, /* duration= */ 100),
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 200, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 150, /* duration= */ 60),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ -4, /* endFrequency= */ 2, /* duration= */ 50),
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 300, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20),
- new StepSegment(/* amplitude= */ 0.8f, /* frequency= */ -1, /* duration= */ 60)));
+ /* startFrequencyHz= */ 1000, /* endFrequencyHz= */ 1, /* duration= */ 20),
+ new StepSegment(/* amplitude= */ 0.8f, /* frequencyHz= */ 10, /* duration= */ 60)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude*/ 0,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 10),
+ /* startFrequencyHz= */ 200, /* endFrequencyHz= */ 200, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.5f,
- /* startFrequency= */ 0, /* endFrequency= */ 0, /* duration= */ 100),
+ /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 150, /* duration= */ 60),
new RampSegment(/* startAmplitude= */ 1, /* endAmplitude= */ 1,
- /* startFrequency= */ -4, /* endFrequency= */ 2, /* duration= */ 50),
+ /* startFrequencyHz= */ 1, /* endFrequencyHz= */ 300, /* duration= */ 50),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.2f,
- /* startFrequency= */ 10, /* endFrequency= */ -5, /* duration= */ 20),
+ /* startFrequencyHz= */ 1000, /* endFrequencyHz= */ 1, /* duration= */ 20),
new RampSegment(/* startAmplitude= */ 0.8f, /* endAmplitude= */ 0.8f,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 60));
+ /* startFrequencyHz= */ 10, /* endFrequencyHz= */ 10, /* duration= */ 60));
VibratorInfo vibratorInfo = createVibratorInfo(IVibrator.CAP_COMPOSE_PWLE_EFFECTS);
assertEquals(-1, mAdapter.apply(segments, -1, vibratorInfo));
@@ -165,13 +173,13 @@
@Test
public void testStepSegments_withPwleCapabilityAndFrequency_convertsStepsToRamps() {
List<VibrationEffectSegment> segments = new ArrayList<>(Arrays.asList(
- new StepSegment(/* amplitude= */ 0, /* frequency= */ -1, /* duration= */ 10),
- new StepSegment(/* amplitude= */ 0.5f, /* frequency= */ 1, /* duration= */ 100)));
+ new StepSegment(/* amplitude= */ 0, /* frequencyHz= */ 100, /* duration= */ 10),
+ new StepSegment(/* amplitude= */ 0.5f, /* frequencyHz= */ 0, /* duration= */ 6)));
List<VibrationEffectSegment> expectedSegments = Arrays.asList(
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude*/ 0,
- /* startFrequency= */ -1, /* endFrequency= */ -1, /* duration= */ 10),
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 100, /* duration= */ 10),
new RampSegment(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.5f,
- /* startFrequency= */ 1, /* endFrequency= */ 1, /* duration= */ 100));
+ /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 150, /* duration= */ 6));
VibratorInfo vibratorInfo = createVibratorInfo(IVibrator.CAP_COMPOSE_PWLE_EFFECTS);
assertEquals(-1, mAdapter.apply(segments, -1, vibratorInfo));
@@ -183,6 +191,7 @@
private static VibratorInfo createVibratorInfo(int... capabilities) {
return new VibratorInfo.Builder(0)
.setCapabilities(IntStream.of(capabilities).reduce((a, b) -> a | b).orElse(0))
+ .setFrequencyMapping(TEST_FREQUENCY_MAPPING)
.build();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationScalerTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationScalerTest.java
index 59c0b0e..6369dbc 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationScalerTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationScalerTest.java
@@ -16,6 +16,14 @@
package com.android.server.vibrator;
+import static android.os.VibrationAttributes.USAGE_NOTIFICATION;
+import static android.os.VibrationAttributes.USAGE_RINGTONE;
+import static android.os.VibrationAttributes.USAGE_TOUCH;
+import static android.os.Vibrator.VIBRATION_INTENSITY_HIGH;
+import static android.os.Vibrator.VIBRATION_INTENSITY_LOW;
+import static android.os.Vibrator.VIBRATION_INTENSITY_MEDIUM;
+import static android.os.Vibrator.VIBRATION_INTENSITY_OFF;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
@@ -24,7 +32,6 @@
import static org.mockito.Mockito.when;
import android.content.ContentResolver;
-import android.content.Context;
import android.content.ContextWrapper;
import android.os.Handler;
import android.os.IExternalVibratorService;
@@ -37,6 +44,7 @@
import android.os.vibrator.PrebakedSegment;
import android.os.vibrator.PrimitiveSegment;
import android.os.vibrator.StepSegment;
+import android.os.vibrator.VibrationConfig;
import android.os.vibrator.VibrationEffectSegment;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
@@ -68,29 +76,31 @@
@Rule public FakeSettingsProviderRule mSettingsProviderRule = FakeSettingsProvider.rule();
@Mock private PowerManagerInternal mPowerManagerInternalMock;
+ @Mock private VibrationConfig mVibrationConfigMock;
private TestLooper mTestLooper;
private ContextWrapper mContextSpy;
- private FakeVibrator mFakeVibrator;
private VibrationSettings mVibrationSettings;
private VibrationScaler mVibrationScaler;
@Before
public void setUp() throws Exception {
mTestLooper = new TestLooper();
- mFakeVibrator = new FakeVibrator();
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
- when(mContextSpy.getSystemService(eq(Context.VIBRATOR_SERVICE))).thenReturn(mFakeVibrator);
LocalServices.removeServiceForTest(PowerManagerInternal.class);
LocalServices.addService(PowerManagerInternal.class, mPowerManagerInternalMock);
+ Settings.System.putInt(contentResolver, Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
+ Settings.System.putInt(contentResolver, Settings.System.VIBRATE_WHEN_RINGING, 1);
+
mVibrationSettings = new VibrationSettings(
- mContextSpy, new Handler(mTestLooper.getLooper()));
+ mContextSpy, new Handler(mTestLooper.getLooper()), mVibrationConfigMock);
mVibrationScaler = new VibrationScaler(mContextSpy, mVibrationSettings);
+
mVibrationSettings.onSystemReady();
}
@@ -101,91 +111,80 @@
@Test
public void testGetExternalVibrationScale() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(USAGE_TOUCH, Vibrator.VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_HIGH);
assertEquals(IExternalVibratorService.SCALE_VERY_HIGH,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_MEDIUM);
assertEquals(IExternalVibratorService.SCALE_HIGH,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_LOW);
assertEquals(IExternalVibratorService.SCALE_NONE,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setDefaultIntensity(USAGE_TOUCH, VIBRATION_INTENSITY_MEDIUM);
assertEquals(IExternalVibratorService.SCALE_LOW,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(USAGE_TOUCH, VIBRATION_INTENSITY_HIGH);
assertEquals(IExternalVibratorService.SCALE_VERY_LOW,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
// Unexpected vibration intensity will be treated as SCALE_NONE.
assertEquals(IExternalVibratorService.SCALE_NONE,
- mVibrationScaler.getExternalVibrationScale(VibrationAttributes.USAGE_TOUCH));
+ mVibrationScaler.getExternalVibrationScale(USAGE_TOUCH));
}
@Test
public void scale_withPrebakedSegment_setsEffectStrengthBasedOnSettings() {
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
PrebakedSegment effect = new PrebakedSegment(VibrationEffect.EFFECT_CLICK,
/* shouldFallback= */ false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
- PrebakedSegment scaled = mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION);
+ PrebakedSegment scaled = mVibrationScaler.scale(effect, USAGE_NOTIFICATION);
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_STRONG);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
- scaled = mVibrationScaler.scale(effect, VibrationAttributes.USAGE_NOTIFICATION);
+ VIBRATION_INTENSITY_MEDIUM);
+ scaled = mVibrationScaler.scale(effect, USAGE_NOTIFICATION);
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_MEDIUM);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
- scaled = mVibrationScaler.scale(effect, VibrationAttributes.USAGE_NOTIFICATION);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ scaled = mVibrationScaler.scale(effect, USAGE_NOTIFICATION);
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_LIGHT);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_OFF);
- scaled = mVibrationScaler.scale(effect, VibrationAttributes.USAGE_NOTIFICATION);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ scaled = mVibrationScaler.scale(effect, USAGE_NOTIFICATION);
// Unexpected intensity setting will be mapped to STRONG.
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_STRONG);
}
@Test
public void scale_withPrebakedEffect_setsEffectStrengthBasedOnSettings() {
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
VibrationEffect effect = VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK);
PrebakedSegment scaled = getFirstSegment(mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION));
+ effect, USAGE_NOTIFICATION));
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_STRONG);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ VIBRATION_INTENSITY_MEDIUM);
scaled = getFirstSegment(mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION));
+ effect, USAGE_NOTIFICATION));
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_MEDIUM);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
scaled = getFirstSegment(mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION));
+ effect, USAGE_NOTIFICATION));
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_LIGHT);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
scaled = getFirstSegment(mVibrationScaler.scale(
- effect, VibrationAttributes.USAGE_NOTIFICATION));
+ effect, USAGE_NOTIFICATION));
// Unexpected intensity setting will be mapped to STRONG.
assertEquals(scaled.getEffectStrength(), VibrationEffect.EFFECT_STRENGTH_STRONG);
}
@@ -193,81 +192,77 @@
@Test
public void scale_withOneShotAndWaveform_resolvesAmplitude() {
// No scale, default amplitude still resolved
- mFakeVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
+ setDefaultIntensity(USAGE_RINGTONE, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
StepSegment resolved = getFirstSegment(mVibrationScaler.scale(
VibrationEffect.createOneShot(10, VibrationEffect.DEFAULT_AMPLITUDE),
- VibrationAttributes.USAGE_RINGTONE));
+ USAGE_RINGTONE));
assertTrue(resolved.getAmplitude() > 0);
resolved = getFirstSegment(mVibrationScaler.scale(
VibrationEffect.createWaveform(new long[]{10},
new int[]{VibrationEffect.DEFAULT_AMPLITUDE}, -1),
- VibrationAttributes.USAGE_RINGTONE));
+ USAGE_RINGTONE));
assertTrue(resolved.getAmplitude() > 0);
}
@Test
public void scale_withOneShotAndWaveform_scalesAmplitude() {
- mFakeVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setDefaultIntensity(USAGE_RINGTONE, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(USAGE_NOTIFICATION, VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ setDefaultIntensity(USAGE_TOUCH, VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_MEDIUM);
StepSegment scaled = getFirstSegment(mVibrationScaler.scale(
- VibrationEffect.createOneShot(128, 128), VibrationAttributes.USAGE_RINGTONE));
+ VibrationEffect.createOneShot(128, 128), USAGE_RINGTONE));
// Ringtone scales up.
assertTrue(scaled.getAmplitude() > 0.5);
scaled = getFirstSegment(mVibrationScaler.scale(
VibrationEffect.createWaveform(new long[]{128}, new int[]{128}, -1),
- VibrationAttributes.USAGE_NOTIFICATION));
+ USAGE_NOTIFICATION));
// Notification scales down.
assertTrue(scaled.getAmplitude() < 0.5);
scaled = getFirstSegment(mVibrationScaler.scale(VibrationEffect.createOneShot(128, 128),
- VibrationAttributes.USAGE_TOUCH));
+ USAGE_TOUCH));
// Haptic feedback does not scale.
assertEquals(128f / 255, scaled.getAmplitude(), 1e-5);
}
@Test
public void scale_withComposed_scalesPrimitives() {
- mFakeVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
- mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setDefaultIntensity(USAGE_RINGTONE, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(USAGE_NOTIFICATION, VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ setDefaultIntensity(USAGE_TOUCH, VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_MEDIUM);
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 0.5f).compose();
- PrimitiveSegment scaled = getFirstSegment(mVibrationScaler.scale(composed,
- VibrationAttributes.USAGE_RINGTONE));
+ PrimitiveSegment scaled = getFirstSegment(mVibrationScaler.scale(composed, USAGE_RINGTONE));
// Ringtone scales up.
assertTrue(scaled.getScale() > 0.5f);
- scaled = getFirstSegment(mVibrationScaler.scale(composed,
- VibrationAttributes.USAGE_NOTIFICATION));
+ scaled = getFirstSegment(mVibrationScaler.scale(composed, USAGE_NOTIFICATION));
// Notification scales down.
assertTrue(scaled.getScale() < 0.5f);
- scaled = getFirstSegment(mVibrationScaler.scale(composed, VibrationAttributes.USAGE_TOUCH));
+ scaled = getFirstSegment(mVibrationScaler.scale(composed, USAGE_TOUCH));
// Haptic feedback does not scale.
assertEquals(0.5, scaled.getScale(), 1e-5);
}
+ private void setDefaultIntensity(@VibrationAttributes.Usage int usage,
+ @Vibrator.VibrationIntensity int intensity) {
+ when(mVibrationConfigMock.getDefaultVibrationIntensity(eq(usage))).thenReturn(intensity);
+ }
+
private <T extends VibrationEffectSegment> T getFirstSegment(VibrationEffect.Composed effect) {
return (T) effect.getSegments().get(0);
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
index ab9fbb5..ff59d0f 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java
@@ -16,9 +16,11 @@
package com.android.server.vibrator;
+import static android.os.VibrationAttributes.USAGE_ACCESSIBILITY;
import static android.os.VibrationAttributes.USAGE_ALARM;
import static android.os.VibrationAttributes.USAGE_COMMUNICATION_REQUEST;
import static android.os.VibrationAttributes.USAGE_HARDWARE_FEEDBACK;
+import static android.os.VibrationAttributes.USAGE_MEDIA;
import static android.os.VibrationAttributes.USAGE_NOTIFICATION;
import static android.os.VibrationAttributes.USAGE_PHYSICAL_EMULATION;
import static android.os.VibrationAttributes.USAGE_RINGTONE;
@@ -35,6 +37,7 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.spy;
@@ -45,7 +48,6 @@
import android.app.ActivityManager;
import android.content.ContentResolver;
-import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.media.AudioManager;
@@ -55,7 +57,9 @@
import android.os.UserHandle;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.os.test.TestLooper;
+import android.os.vibrator.VibrationConfig;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
@@ -87,6 +91,19 @@
private static final PowerSaveState LOW_POWER_STATE = new PowerSaveState.Builder()
.setBatterySaverEnabled(true).build();
+ private static final int[] ALL_USAGES = new int[] {
+ USAGE_UNKNOWN,
+ USAGE_ACCESSIBILITY,
+ USAGE_ALARM,
+ USAGE_COMMUNICATION_REQUEST,
+ USAGE_HARDWARE_FEEDBACK,
+ USAGE_MEDIA,
+ USAGE_NOTIFICATION,
+ USAGE_PHYSICAL_EMULATION,
+ USAGE_RINGTONE,
+ USAGE_TOUCH,
+ };
+
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
@@ -96,23 +113,23 @@
private VibrationSettings.OnVibratorSettingsChanged mListenerMock;
@Mock
private PowerManagerInternal mPowerManagerInternalMock;
+ @Mock
+ private VibrationConfig mVibrationConfigMock;
private TestLooper mTestLooper;
private ContextWrapper mContextSpy;
private AudioManager mAudioManager;
- private FakeVibrator mFakeVibrator;
private VibrationSettings mVibrationSettings;
private PowerManagerInternal.LowPowerModeListener mRegisteredPowerModeListener;
@Before
public void setUp() throws Exception {
mTestLooper = new TestLooper();
- mFakeVibrator = new FakeVibrator();
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
- when(mContextSpy.getSystemService(eq(Context.VIBRATOR_SERVICE))).thenReturn(mFakeVibrator);
+
doAnswer(invocation -> {
mRegisteredPowerModeListener = invocation.getArgument(0);
return null;
@@ -121,16 +138,18 @@
LocalServices.removeServiceForTest(PowerManagerInternal.class);
LocalServices.addService(PowerManagerInternal.class, mPowerManagerInternalMock);
+ setDefaultIntensity(VIBRATION_INTENSITY_MEDIUM);
mAudioManager = mContextSpy.getSystemService(AudioManager.class);
mVibrationSettings = new VibrationSettings(mContextSpy,
- new Handler(mTestLooper.getLooper()));
- mVibrationSettings.onSystemReady();
+ new Handler(mTestLooper.getLooper()), mVibrationConfigMock);
// Simulate System defaults.
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
setUserSetting(Settings.System.VIBRATE_INPUT_DEVICES, 0);
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
setRingerMode(AudioManager.RINGER_MODE_NORMAL);
+ mVibrationSettings.onSystemReady();
}
@After
@@ -145,12 +164,15 @@
setUserSetting(Settings.System.VIBRATE_INPUT_DEVICES, 1);
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 0);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
- verify(mListenerMock, times(7)).onChange();
+ verify(mListenerMock, times(10)).onChange();
}
@Test
@@ -192,9 +214,7 @@
UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND, 0, 0);
for (int usage : expectedAllowedVibrations) {
- assertNull("Error for usage " + VibrationAttributes.usageToString(usage),
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(usage)));
+ assertVibrationNotIgnoredForUsage(usage);
}
}
@@ -209,10 +229,7 @@
UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND, 0, 0);
for (int usage : expectedIgnoredVibrations) {
- assertEquals("Error for usage " + VibrationAttributes.usageToString(usage),
- Vibration.Status.IGNORED_BACKGROUND,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(usage)));
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_BACKGROUND);
}
}
@@ -221,10 +238,9 @@
mVibrationSettings.mUidObserver.onUidStateChanged(
UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0, 0);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_ALARM)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
@@ -238,9 +254,7 @@
mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
for (int usage : expectedAllowedVibrations) {
- assertNull("Error for usage " + VibrationAttributes.usageToString(usage),
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(usage)));
+ assertVibrationNotIgnoredForUsage(usage);
}
}
@@ -257,10 +271,7 @@
mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
for (int usage : expectedIgnoredVibrations) {
- assertEquals("Error for usage " + VibrationAttributes.usageToString(usage),
- Vibration.Status.IGNORED_FOR_POWER,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(usage)));
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_POWER);
}
}
@@ -268,130 +279,130 @@
public void shouldIgnoreVibration_notInBatterySaverMode_allowsAnyUsage() {
mRegisteredPowerModeListener.onLowPowerModeChanged(NORMAL_POWER_STATE);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_COMMUNICATION_REQUEST)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
public void shouldIgnoreVibration_withRingerModeSilent_ignoresRingtoneAndTouch() {
// Vibrating settings on are overruled by ringer mode.
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
- setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
+ setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 1);
setRingerMode(AudioManager.RINGER_MODE_SILENT);
- assertEquals(Vibration.Status.IGNORED_FOR_RINGER_MODE,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertEquals(Vibration.Status.IGNORED_FOR_RINGER_MODE,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_COMMUNICATION_REQUEST)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_HARDWARE_FEEDBACK)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_RINGTONE || usage == USAGE_TOUCH) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_RINGER_MODE);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
public void shouldIgnoreVibration_withRingerModeVibrate_allowsAllVibrations() {
- // Vibrating settings off are overruled by ringer mode.
- setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
- setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_PHYSICAL_EMULATION)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
- public void shouldIgnoreVibration_withRingerModeNormalAndRingSettingsOff_ignoresRingtoneOnly() {
- // Vibrating settings off are respected for normal ringer mode.
- setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
- setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
+ public void shouldIgnoreVibration_withRingerModeNormal_allowsAllVibrations() {
setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- assertEquals(Vibration.Status.IGNORED_FOR_RINGER_MODE,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_NOTIFICATION)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
- public void shouldIgnoreVibration_withRingerModeNormalAndRingSettingsOn_allowsAllVibrations() {
+ public void shouldIgnoreVibration_withRingSettingsOff_disableRingtoneVibrations() {
+ setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
+ setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
+
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_RINGTONE) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
+ }
+
+ @Test
+ public void shouldIgnoreVibration_withRingSettingsOn_allowsAllVibrations() {
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
- setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_ALARM)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
}
@Test
- public void shouldIgnoreVibration_withRingerModeNormalAndRampingRingerOn_allowsAllVibrations() {
+ public void shouldIgnoreVibration_withRampingRingerOn_allowsAllVibrations() {
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 1);
- setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_COMMUNICATION_REQUEST)));
+ for (int usage : ALL_USAGES) {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
+
+ @Test
+ public void shouldIgnoreVibration_withHapticFeedbackDisabled_ignoresTouchVibration() {
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 0);
+
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_TOUCH) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
public void shouldIgnoreVibration_withHapticFeedbackSettingsOff_ignoresTouchVibration() {
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_HARDWARE_FEEDBACK)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_TOUCH) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
public void shouldIgnoreVibration_withHardwareFeedbackSettingsOff_ignoresHardwareVibrations() {
setUserSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_HARDWARE_FEEDBACK)));
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_PHYSICAL_EMULATION)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_NOTIFICATION)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_HARDWARE_FEEDBACK || usage == USAGE_PHYSICAL_EMULATION) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
public void shouldIgnoreVibration_withNotificationSettingsOff_ignoresNotificationVibrations() {
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_NOTIFICATION)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_ALARM)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_NOTIFICATION) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
@@ -402,15 +413,13 @@
setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(Vibration.Status.IGNORED_FOR_SETTINGS,
- mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_RINGTONE)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_NOTIFICATION)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_ALARM)));
- assertNull(mVibrationSettings.shouldIgnoreVibration(UID,
- VibrationAttributes.createForUsage(USAGE_TOUCH)));
+ for (int usage : ALL_USAGES) {
+ if (usage == USAGE_RINGTONE) {
+ assertVibrationIgnoredForUsage(usage, Vibration.Status.IGNORED_FOR_SETTINGS);
+ } else {
+ assertVibrationNotIgnoredForUsage(usage);
+ }
+ }
}
@Test
@@ -423,90 +432,40 @@
}
@Test
- public void getDefaultIntensity_beforeSystemReady_returnsMediumToAllExceptAlarm() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultRingVibrationIntensity(VIBRATION_INTENSITY_HIGH);
-
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ public void getDefaultIntensity_returnsIntensityFromVibratorConfig() {
+ setDefaultIntensity(VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
-
- VibrationSettings vibrationSettings = new VibrationSettings(mContextSpy,
- new Handler(mTestLooper.getLooper()));
-
- assertEquals(VIBRATION_INTENSITY_HIGH,
- vibrationSettings.getDefaultIntensity(USAGE_ALARM));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_TOUCH));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_HARDWARE_FEEDBACK));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_PHYSICAL_EMULATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_NOTIFICATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_UNKNOWN));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- vibrationSettings.getDefaultIntensity(USAGE_RINGTONE));
- }
-
- @Test
- public void getDefaultIntensity_returnsIntensityFromVibratorService() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(VIBRATION_INTENSITY_HIGH);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(VIBRATION_INTENSITY_MEDIUM);
- mFakeVibrator.setDefaultRingVibrationIntensity(VIBRATION_INTENSITY_LOW);
-
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_OFF);
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
- assertEquals(VIBRATION_INTENSITY_HIGH,
- mVibrationSettings.getDefaultIntensity(USAGE_ALARM));
- assertEquals(VIBRATION_INTENSITY_HIGH,
- mVibrationSettings.getDefaultIntensity(USAGE_TOUCH));
- assertEquals(VIBRATION_INTENSITY_HIGH,
- mVibrationSettings.getDefaultIntensity(USAGE_HARDWARE_FEEDBACK));
- assertEquals(VIBRATION_INTENSITY_HIGH,
- mVibrationSettings.getDefaultIntensity(USAGE_PHYSICAL_EMULATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- mVibrationSettings.getDefaultIntensity(USAGE_NOTIFICATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- mVibrationSettings.getDefaultIntensity(USAGE_UNKNOWN));
- assertEquals(VIBRATION_INTENSITY_LOW,
- mVibrationSettings.getDefaultIntensity(USAGE_RINGTONE));
+ for (int usage : ALL_USAGES) {
+ assertEquals(VIBRATION_INTENSITY_HIGH, mVibrationSettings.getDefaultIntensity(usage));
+ }
}
@Test
public void getCurrentIntensity_returnsIntensityFromSettings() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(VIBRATION_INTENSITY_OFF);
- mFakeVibrator.setDefaultNotificationVibrationIntensity(VIBRATION_INTENSITY_OFF);
- mFakeVibrator.setDefaultRingVibrationIntensity(VIBRATION_INTENSITY_OFF);
-
- setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_HIGH);
+ setDefaultIntensity(VIBRATION_INTENSITY_OFF);
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_LOW);
setUserSetting(Settings.System.HARDWARE_HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_LOW);
- assertEquals(VIBRATION_INTENSITY_HIGH, mVibrationSettings.getCurrentIntensity(USAGE_ALARM));
- assertEquals(VIBRATION_INTENSITY_HIGH, mVibrationSettings.getCurrentIntensity(USAGE_TOUCH));
- assertEquals(VIBRATION_INTENSITY_LOW,
- mVibrationSettings.getCurrentIntensity(USAGE_HARDWARE_FEEDBACK));
- assertEquals(VIBRATION_INTENSITY_LOW,
- mVibrationSettings.getCurrentIntensity(USAGE_PHYSICAL_EMULATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- mVibrationSettings.getCurrentIntensity(USAGE_NOTIFICATION));
- assertEquals(VIBRATION_INTENSITY_MEDIUM,
- mVibrationSettings.getCurrentIntensity(USAGE_UNKNOWN));
- assertEquals(VIBRATION_INTENSITY_LOW,
- mVibrationSettings.getCurrentIntensity(USAGE_RINGTONE));
+ for (int usage : ALL_USAGES) {
+ assertEquals(errorMessageForUsage(usage),
+ VIBRATION_INTENSITY_LOW,
+ mVibrationSettings.getCurrentIntensity(usage));
+ }
}
@Test
public void getCurrentIntensity_updateTriggeredAfterUserSwitched() {
- mFakeVibrator.setDefaultRingVibrationIntensity(VIBRATION_INTENSITY_OFF);
+ setDefaultIntensity(USAGE_RINGTONE, VIBRATION_INTENSITY_OFF);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, VIBRATION_INTENSITY_HIGH);
assertEquals(VIBRATION_INTENSITY_HIGH,
mVibrationSettings.getCurrentIntensity(USAGE_RINGTONE));
@@ -524,8 +483,9 @@
@Test
public void getCurrentIntensity_noHardwareFeedbackValueUsesHapticFeedbackValue() {
- mFakeVibrator.setDefaultHapticFeedbackIntensity(VIBRATION_INTENSITY_MEDIUM);
+ setDefaultIntensity(USAGE_HARDWARE_FEEDBACK, VIBRATION_INTENSITY_MEDIUM);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_OFF);
+ mVibrationSettings.updateSettings();
assertEquals(VIBRATION_INTENSITY_OFF, mVibrationSettings.getCurrentIntensity(USAGE_TOUCH));
// If haptic feedback is off, fallback to default value.
assertEquals(VIBRATION_INTENSITY_MEDIUM,
@@ -533,15 +493,11 @@
assertEquals(VIBRATION_INTENSITY_MEDIUM,
mVibrationSettings.getCurrentIntensity(USAGE_PHYSICAL_EMULATION));
- // Switching user is not working with FakeSettingsProvider.
- // Testing the broadcast flow manually.
- Settings.System.putIntForUser(mContextSpy.getContentResolver(),
- Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_HIGH,
- UserHandle.USER_CURRENT);
- mVibrationSettings.mUserReceiver.onReceive(mContextSpy,
- new Intent(Intent.ACTION_USER_SWITCHED));
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_HIGH);
+ mVibrationSettings.updateSettings();
assertEquals(VIBRATION_INTENSITY_HIGH,
mVibrationSettings.getCurrentIntensity(USAGE_TOUCH));
+ // If haptic feedback is on, fallback to that value.
assertEquals(VIBRATION_INTENSITY_HIGH,
mVibrationSettings.getCurrentIntensity(USAGE_HARDWARE_FEEDBACK));
assertEquals(VIBRATION_INTENSITY_HIGH,
@@ -557,6 +513,33 @@
assertNotNull(mVibrationSettings.getFallbackEffect(VibrationEffect.EFFECT_DOUBLE_CLICK));
}
+ private void assertVibrationIgnoredForUsage(@VibrationAttributes.Usage int usage,
+ Vibration.Status expectedStatus) {
+ assertEquals(errorMessageForUsage(usage),
+ expectedStatus,
+ mVibrationSettings.shouldIgnoreVibration(UID,
+ VibrationAttributes.createForUsage(usage)));
+ }
+
+ private void assertVibrationNotIgnoredForUsage(@VibrationAttributes.Usage int usage) {
+ assertNull(errorMessageForUsage(usage),
+ mVibrationSettings.shouldIgnoreVibration(UID,
+ VibrationAttributes.createForUsage(usage)));
+ }
+
+ private String errorMessageForUsage(int usage) {
+ return "Error for usage " + VibrationAttributes.usageToString(usage);
+ }
+
+ private void setDefaultIntensity(@Vibrator.VibrationIntensity int intensity) {
+ when(mVibrationConfigMock.getDefaultVibrationIntensity(anyInt())).thenReturn(intensity);
+ }
+
+ private void setDefaultIntensity(@VibrationAttributes.Usage int usage,
+ @Vibrator.VibrationIntensity int intensity) {
+ when(mVibrationConfigMock.getDefaultVibrationIntensity(eq(usage))).thenReturn(intensity);
+ }
+
private void setUserSetting(String settingName, int value) {
Settings.System.putIntForUser(
mContextSpy.getContentResolver(), settingName, value, UserHandle.USER_CURRENT);
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
index 4cc4d55..5dd44ff 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -44,11 +44,13 @@
import android.os.SystemClock;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
+import android.os.Vibrator;
import android.os.test.TestLooper;
import android.os.vibrator.PrebakedSegment;
import android.os.vibrator.PrimitiveSegment;
import android.os.vibrator.RampSegment;
import android.os.vibrator.StepSegment;
+import android.os.vibrator.VibrationConfig;
import android.os.vibrator.VibrationEffectSegment;
import android.platform.test.annotations.LargeTest;
import android.platform.test.annotations.Presubmit;
@@ -101,6 +103,8 @@
private IBinder mVibrationToken;
@Mock
private IBatteryStats mIBatteryStatsMock;
+ @Mock
+ private VibrationConfig mVibrationConfigMock;
private final Map<Integer, FakeVibratorControllerProvider> mVibratorProviders = new HashMap<>();
private VibrationSettings mVibrationSettings;
@@ -113,9 +117,13 @@
public void setUp() throws Exception {
mTestLooper = new TestLooper();
+ when(mVibrationConfigMock.getDefaultVibrationIntensity(anyInt()))
+ .thenReturn(Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ when(mVibrationConfigMock.getRampStepDurationMs()).thenReturn(TEST_RAMP_STEP_DURATION);
+
Context context = InstrumentationRegistry.getContext();
mVibrationSettings = new VibrationSettings(context, new Handler(mTestLooper.getLooper()),
- /* rampDownDuration= */ 0, TEST_RAMP_STEP_DURATION);
+ mVibrationConfigMock);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mWakeLock = context.getSystemService(
PowerManager.class).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*vibrator*");
@@ -553,8 +561,8 @@
VibrationEffect effect = VibrationEffect.startWaveform()
.addStep(1, 10)
.addRamp(0, 20)
- .addStep(0.8f, 1, 30)
- .addRamp(0.6f, -1, 40)
+ .addStep(0.8f, 100, 30)
+ .addRamp(0.6f, 200, 40)
.build();
VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
waitForCompletion(thread);
@@ -565,12 +573,13 @@
verifyCallbacksTriggered(vibrationId, Vibration.Status.FINISHED);
assertFalse(thread.getVibrators().get(VIBRATOR_ID).isVibrating());
assertEquals(Arrays.asList(
- expectedRamp(/* amplitude= */ 1, /* frequency= */ 150, /* duration= */ 10),
- expectedRamp(/* StartAmplitude= */ 1, /* endAmplitude= */ 0,
- /* startFrequency= */ 150, /* endFrequency= */ 150, /* duration= */ 20),
- expectedRamp(/* amplitude= */ 0.6f, /* frequency= */ 200, /* duration= */ 30),
- expectedRamp(/* StartAmplitude= */ 0.6f, /* endAmplitude= */ 0.5f,
- /* startFrequency= */ 200, /* endFrequency= */ 100, /* duration= */ 40)),
+ expectedRamp(/* amplitude= */ 1, /* frequencyHz= */ 150, /* duration= */ 10),
+ expectedRamp(/* startAmplitude= */ 1, /* endAmplitude= */ 0,
+ /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 150, /* duration= */ 20),
+ expectedRamp(/* amplitude= */ 0.5f, /* frequencyHz= */ 100, /* duration= */ 30),
+ expectedRamp(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.6f,
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 200,
+ /* duration= */ 40)),
fakeVibrator.getEffectSegments());
assertEquals(Arrays.asList(Braking.CLAB), fakeVibrator.getBraking());
}
@@ -589,8 +598,8 @@
VibrationEffect effect = VibrationEffect.startWaveform()
.addStep(1, 10)
.addRamp(0, 20)
- .addStep(0.8f, 1, 30)
- .addRamp(0.6f, -1, 40)
+ .addStep(0.8f, 10, 30)
+ .addRamp(0.6f, 100, 40)
.build();
VibrationThread thread = startThreadAndDispatcher(vibrationId, effect);
waitForCompletion(thread);
@@ -1110,9 +1119,7 @@
@Test
public void vibrate_waveformWithRampDown_addsRampDownAfterVibrationCompleted() {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
@@ -1138,9 +1145,7 @@
@Test
public void vibrate_waveformWithRampDown_triggersCallbackWhenOriginalVibrationEnds() {
- int rampDownDuration = 10_000;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(10_000);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
@@ -1173,9 +1178,7 @@
@Test
public void vibrate_waveformCancelledWithRampDown_addsRampDownAfterVibrationCancelled()
throws Exception {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
@@ -1201,9 +1204,7 @@
@Test
public void vibrate_predefinedWithRampDown_doesNotAddRampDown() {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
@@ -1223,9 +1224,7 @@
@Test
public void vibrate_composedWithRampDown_doesNotAddRampDown() {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
IVibrator.CAP_COMPOSE_EFFECTS);
@@ -1250,9 +1249,7 @@
@Test
public void vibrate_pwleWithRampDown_doesNotAddRampDown() {
- int rampDownDuration = 15;
- mVibrationSettings = new VibrationSettings(InstrumentationRegistry.getContext(),
- new Handler(mTestLooper.getLooper()), rampDownDuration, TEST_RAMP_STEP_DURATION);
+ when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mEffectAdapter = new DeviceVibrationEffectAdapter(mVibrationSettings);
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(VIBRATOR_ID);
fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
@@ -1345,7 +1342,8 @@
}
private VibrationEffectSegment expectedOneShot(long millis) {
- return new StepSegment(VibrationEffect.DEFAULT_AMPLITUDE, /* frequency= */ 0, (int) millis);
+ return new StepSegment(VibrationEffect.DEFAULT_AMPLITUDE,
+ /* frequencyHz= */ 0, (int) millis);
}
private VibrationEffectSegment expectedPrebaked(int effectId) {
@@ -1356,13 +1354,13 @@
return new PrimitiveSegment(primitiveId, scale, delay);
}
- private VibrationEffectSegment expectedRamp(float amplitude, float frequency, int duration) {
- return expectedRamp(amplitude, amplitude, frequency, frequency, duration);
+ private VibrationEffectSegment expectedRamp(float amplitude, float frequencyHz, int duration) {
+ return expectedRamp(amplitude, amplitude, frequencyHz, frequencyHz, duration);
}
private VibrationEffectSegment expectedRamp(float startAmplitude, float endAmplitude,
- float startFrequency, float endFrequency, int duration) {
- return new RampSegment(startAmplitude, endAmplitude, startFrequency, endFrequency,
+ float startFrequencyHz, float endFrequencyHz, int duration) {
+ return new RampSegment(startAmplitude, endAmplitude, startFrequencyHz, endFrequencyHz,
duration);
}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorControllerTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorControllerTest.java
index 9fb8b38..cb4982b 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorControllerTest.java
@@ -21,7 +21,6 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
@@ -236,7 +235,7 @@
RampSegment[] primitives = new RampSegment[]{
new RampSegment(/* startAmplitude= */ 0, /* endAmplitude= */ 1,
- /* startFrequency= */ -1, /* endFrequency= */ 1, /* duration= */ 10)
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 200, /* duration= */ 10)
};
assertEquals(15L, controller.on(primitives, 12));
assertTrue(controller.isVibrating());
@@ -312,10 +311,10 @@
private void mockVibratorCapabilities(int capabilities) {
VibratorInfo.FrequencyMapping frequencyMapping = new VibratorInfo.FrequencyMapping(
- Float.NaN, Float.NaN, Float.NaN, Float.NaN, null);
- when(mNativeWrapperMock.getInfo(anyFloat(), any(VibratorInfo.Builder.class)))
+ Float.NaN, Float.NaN, Float.NaN, null);
+ when(mNativeWrapperMock.getInfo(any(VibratorInfo.Builder.class)))
.then(invocation -> {
- ((VibratorInfo.Builder) invocation.getArgument(1))
+ ((VibratorInfo.Builder) invocation.getArgument(0))
.setCapabilities(capabilities)
.setFrequencyMapping(frequencyMapping);
return true;
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index c0f7596..b0bdaf0 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -155,12 +156,13 @@
@Before
public void setUp() throws Exception {
mTestLooper = new TestLooper();
- mVibrator = new FakeVibrator();
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
InputManager inputManager = InputManager.resetInstance(mIInputManagerMock);
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
when(mContextSpy.getContentResolver()).thenReturn(contentResolver);
+
+ mVibrator = new FakeVibrator(mContextSpy);
when(mContextSpy.getSystemService(eq(Context.VIBRATOR_SERVICE))).thenReturn(mVibrator);
when(mContextSpy.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager);
when(mContextSpy.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManagerMock);
@@ -175,8 +177,13 @@
}).when(mPowerManagerInternalMock).registerLowPowerModeObserver(any());
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
+ setUserSetting(Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY,
+ Vibrator.VIBRATION_INTENSITY_MEDIUM);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
Vibrator.VIBRATION_INTENSITY_MEDIUM);
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY,
+ Vibrator.VIBRATION_INTENSITY_MEDIUM);
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
Vibrator.VIBRATION_INTENSITY_MEDIUM);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
@@ -437,7 +444,7 @@
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
PrebakedSegment expected = new PrebakedSegment(
- VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
+ VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
// Only vibrators 1 and 3 have always-on capabilities.
assertEquals(mVibratorProviders.get(1).getAlwaysOnEffect(1), expected);
@@ -461,10 +468,10 @@
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
PrebakedSegment expectedClick = new PrebakedSegment(
- VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
+ VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
PrebakedSegment expectedTick = new PrebakedSegment(
- VibrationEffect.EFFECT_TICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
+ VibrationEffect.EFFECT_TICK, false, VibrationEffect.EFFECT_STRENGTH_MEDIUM);
// Enables click on vibrator 1 and tick on vibrator 2 only.
assertEquals(mVibratorProviders.get(1).getAlwaysOnEffect(1), expectedClick);
@@ -539,7 +546,6 @@
public void vibrate_withRingtone_usesRingtoneSettings() throws Exception {
mockVibrators(1);
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
- mVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK,
VibrationEffect.EFFECT_HEAVY_CLICK, VibrationEffect.EFFECT_DOUBLE_CLICK);
@@ -932,55 +938,67 @@
@Test
public void vibrate_withIntensitySettings_appliesSettingsToScaleVibrations() throws Exception {
- mVibrator.setDefaultNotificationVibrationIntensity(Vibrator.VIBRATION_INTENSITY_LOW);
+ int defaultNotificationIntensity =
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_NOTIFICATION);
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_HIGH);
+ defaultNotificationIntensity < Vibrator.VIBRATION_INTENSITY_HIGH
+ ? defaultNotificationIntensity + 1
+ : defaultNotificationIntensity);
+
+ int defaultTouchIntensity =
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_TOUCH);
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_LOW);
- setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
- Vibrator.VIBRATION_INTENSITY_OFF);
+ defaultTouchIntensity > Vibrator.VIBRATION_INTENSITY_LOW
+ ? defaultTouchIntensity - 1
+ : defaultTouchIntensity);
+
+ setUserSetting(Settings.System.ALARM_VIBRATION_INTENSITY,
+ mVibrator.getDefaultVibrationIntensity(VibrationAttributes.USAGE_ALARM));
+ setUserSetting(Settings.System.MEDIA_VIBRATION_INTENSITY,
+ Vibrator.VIBRATION_INTENSITY_HIGH);
+ setUserSetting(Settings.System.RING_VIBRATION_INTENSITY, Vibrator.VIBRATION_INTENSITY_OFF);
mockVibrators(1);
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
IVibrator.CAP_COMPOSE_EFFECTS);
- fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
VibratorManagerService service = createSystemReadyService();
vibrate(service, CombinedVibration.startSequential()
- .addNext(1, VibrationEffect.createOneShot(20, 100))
+ .addNext(1, VibrationEffect.createOneShot(100, 125))
.combine(), NOTIFICATION_ATTRS);
assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 1,
service, TEST_TIMEOUT_MILLIS));
vibrate(service, VibrationEffect.startComposition()
- .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f)
.addPrimitive(VibrationEffect.Composition.PRIMITIVE_TICK, 0.5f)
.compose(), HAPTIC_FEEDBACK_ATTRS);
+ assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 2,
+ service, TEST_TIMEOUT_MILLIS));
+
+ vibrate(service, VibrationEffect.startComposition()
+ .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, 1f)
+ .compose(), ALARM_ATTRS);
assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 3,
service, TEST_TIMEOUT_MILLIS));
- vibrate(service, CombinedVibration.startParallel()
- .addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
- .combine(), ALARM_ATTRS);
- assertTrue(waitUntil(s -> fakeVibrator.getEffectSegments().size() == 4,
+ vibrate(service, VibrationEffect.createOneShot(100, 125), RINGTONE_ATTRS);
+ assertFalse(waitUntil(s -> fakeVibrator.getEffectSegments().size() > 3,
service, TEST_TIMEOUT_MILLIS));
- vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), RINGTONE_ATTRS);
+ assertEquals(3, fakeVibrator.getEffectSegments().size());
- assertEquals(4, fakeVibrator.getEffectSegments().size());
+ // Notification vibrations will be scaled with SCALE_HIGH or none if default is high.
+ assertEquals(defaultNotificationIntensity < Vibrator.VIBRATION_INTENSITY_HIGH,
+ 0.6 < fakeVibrator.getAmplitudes().get(0));
- // Notification vibrations will be scaled with SCALE_VERY_HIGH.
- assertTrue(0.6 < fakeVibrator.getAmplitudes().get(0));
+ // Haptic feedback vibrations will be scaled with SCALE_LOW or none if default is low.
+ assertEquals(defaultTouchIntensity > Vibrator.VIBRATION_INTENSITY_LOW,
+ 0.5 > ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(1)).getScale());
- // Haptic feedback vibrations will be scaled with SCALE_LOW.
- assertTrue(0.5 < ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(1)).getScale());
- assertTrue(0.5 > ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(2)).getScale());
-
- // Alarm vibration is always VIBRATION_INTENSITY_HIGH.
- PrebakedSegment expected = new PrebakedSegment(
- VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
- assertEquals(expected, fakeVibrator.getEffectSegments().get(3));
+ // Alarm vibration will be scaled with SCALE_NONE.
+ assertEquals(1f,
+ ((PrimitiveSegment) fakeVibrator.getEffectSegments().get(2)).getScale(), 1e-5);
// Ring vibrations have intensity OFF and are not played.
}
@@ -1100,7 +1118,7 @@
int scale = mExternalVibratorService.onExternalVibrationStart(externalVibration);
mExternalVibratorService.onExternalVibrationStop(externalVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, scale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, scale);
assertEquals(Arrays.asList(false, true, false),
mVibratorProviders.get(1).getExternalControlStates());
}
@@ -1127,8 +1145,8 @@
ringtoneAudioAttrs, secondController);
int secondScale = mExternalVibratorService.onExternalVibrationStart(secondVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, firstScale);
- assertEquals(IExternalVibratorService.SCALE_NONE, secondScale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, firstScale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, secondScale);
verify(firstController).mute();
verify(secondController, never()).mute();
// Set external control called only once.
@@ -1151,7 +1169,7 @@
ExternalVibration externalVibration = new ExternalVibration(UID, PACKAGE_NAME, AUDIO_ATTRS,
mock(IExternalVibrationController.class));
int scale = mExternalVibratorService.onExternalVibrationStart(externalVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, scale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, scale);
// Vibration is cancelled.
assertTrue(waitUntil(s -> !s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
@@ -1163,7 +1181,6 @@
public void onExternalVibration_withRingtone_usesRingerModeSettings() {
mockVibrators(1);
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL);
- mVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_MEDIUM);
AudioAttributes audioAttrs = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.build();
@@ -1181,13 +1198,13 @@
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 1);
createSystemReadyService();
scale = mExternalVibratorService.onExternalVibrationStart(externalVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, scale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, scale);
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
setUserSetting(Settings.System.APPLY_RAMPING_RINGER, 0);
createSystemReadyService();
scale = mExternalVibratorService.onExternalVibrationStart(externalVibration);
- assertEquals(IExternalVibratorService.SCALE_NONE, scale);
+ assertNotEquals(IExternalVibratorService.SCALE_MUTE, scale);
}
private VibrationEffectSegment expectedPrebaked(int effectId) {
@@ -1235,10 +1252,6 @@
mContextSpy.getContentResolver(), settingName, value, UserHandle.USER_CURRENT);
}
- private void setGlobalSetting(String settingName, int value) {
- Settings.Global.putInt(mContextSpy.getContentResolver(), settingName, value);
- }
-
private void vibrate(VibratorManagerService service, VibrationEffect effect,
VibrationAttributes attrs) {
vibrate(service, CombinedVibration.createParallel(effect), attrs);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
index 182848b4..bd7186e 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
@@ -108,7 +108,7 @@
@Test
public void testDeletionReceiver() {
- verify(mContext, times(1)).registerReceiver(any(), any());
+ verify(mContext, times(1)).registerReceiver(any(), any(), anyInt());
}
@Test
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index 419dda5..11777ef 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -22,7 +22,10 @@
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.Notification.FLAG_AUTO_CANCEL;
import static android.app.Notification.FLAG_BUBBLE;
+import static android.app.Notification.FLAG_CAN_COLORIZE;
import static android.app.Notification.FLAG_FOREGROUND_SERVICE;
+import static android.app.Notification.FLAG_NO_CLEAR;
+import static android.app.Notification.FLAG_ONGOING_EVENT;
import static android.app.NotificationChannel.USER_LOCKED_ALLOW_BUBBLE;
import static android.app.NotificationManager.BUBBLE_PREFERENCE_ALL;
import static android.app.NotificationManager.BUBBLE_PREFERENCE_NONE;
@@ -179,6 +182,7 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
+import android.util.Slog;
import android.util.TypedXmlPullParser;
import android.util.TypedXmlSerializer;
import android.util.Xml;
@@ -201,6 +205,7 @@
import com.android.server.notification.NotificationManagerService.NotificationAssistants;
import com.android.server.notification.NotificationManagerService.NotificationListeners;
import com.android.server.pm.PackageManagerService;
+import com.android.server.policy.PermissionPolicyInternal;
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.utils.quota.MultiRateLimiter;
@@ -231,6 +236,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
import java.util.function.Consumer;
@@ -239,6 +245,8 @@
@RunWithLooper
public class NotificationManagerServiceTest extends UiServiceTestCase {
private static final String TEST_CHANNEL_ID = "NotificationManagerServiceTestChannelId";
+ private static final String PKG_NO_CHANNELS = "com.example.no.channels";
+ private static final int TEST_TASK_ID = 1;
private static final int UID_HEADLESS = 1000000;
private final int mUid = Binder.getCallingUid();
@@ -253,6 +261,8 @@
@Mock
private PackageManagerInternal mPackageManagerInternal;
@Mock
+ private PermissionPolicyInternal mPermissionPolicyInternal;
+ @Mock
private WindowManagerInternal mWindowManagerInternal;
@Mock
private PermissionHelper mPermissionHelper;
@@ -381,6 +391,8 @@
LocalServices.addService(ActivityManagerInternal.class, mAmi);
LocalServices.removeServiceForTest(PackageManagerInternal.class);
LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
+ LocalServices.removeServiceForTest(PermissionPolicyInternal.class);
+ LocalServices.addService(PermissionPolicyInternal.class, mPermissionPolicyInternal);
mContext.addMockSystemService(Context.ALARM_SERVICE, mAlarmManager);
doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any());
@@ -411,8 +423,18 @@
when(mUgmInternal.newUriPermissionOwner(anyString())).thenReturn(mPermOwner);
when(mPackageManager.getPackagesForUid(mUid)).thenReturn(new String[]{PKG});
when(mPackageManagerClient.getPackagesForUid(anyInt())).thenReturn(new String[]{PKG});
+ when(mPermissionPolicyInternal.canShowPermissionPromptForTask(
+ any(ActivityManager.RecentTaskInfo.class))).thenReturn(false);
mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
+ ActivityManager.AppTask task = mock(ActivityManager.AppTask.class);
+ List<ActivityManager.AppTask> taskList = new ArrayList<>();
+ ActivityManager.RecentTaskInfo taskInfo = new ActivityManager.RecentTaskInfo();
+ taskInfo.taskId = TEST_TASK_ID;
+ when(task.getTaskInfo()).thenReturn(taskInfo);
+ taskList.add(task);
+ when(mAtm.getAppTasks(anyString(), anyInt())).thenReturn(taskList);
+
// write to a test file; the system file isn't readable from tests
mFile = new File(mContext.getCacheDir(), "test.xml");
mFile.createNewFile();
@@ -466,6 +488,9 @@
// Return first true for RoleObserver main-thread check
when(mMainLooper.isCurrentThread()).thenReturn(true).thenReturn(false);
mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY, mMainLooper);
+ verify(mHistoryManager, never()).onBootPhaseAppsCanStart();
+ mService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START, mMainLooper);
+ verify(mHistoryManager).onBootPhaseAppsCanStart();
mService.setAudioManager(mAudioManager);
@@ -934,6 +959,51 @@
}
@Test
+ public void testCreateNotificationChannels_FirstChannelWithFgndTaskStartsPermDialog()
+ throws Exception {
+ when(mPermissionPolicyInternal.canShowPermissionPromptForTask(any(
+ ActivityManager.RecentTaskInfo.class))).thenReturn(true);
+ final NotificationChannel channel =
+ new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
+ mBinderService.createNotificationChannels(PKG_NO_CHANNELS,
+ new ParceledListSlice(Arrays.asList(channel)));
+ verify(mWorkerHandler).post(eq(new NotificationManagerService
+ .ShowNotificationPermissionPromptRunnable(PKG_NO_CHANNELS,
+ UserHandle.getUserId(mUid), TEST_TASK_ID, mPermissionPolicyInternal)));
+ }
+
+ @Test
+ public void testCreateNotificationChannels_SecondChannelWithFgndTaskDoesntStartPermDialog()
+ throws Exception {
+ when(mPermissionPolicyInternal.canShowPermissionPromptForTask(any(
+ ActivityManager.RecentTaskInfo.class))).thenReturn(true);
+ assertTrue(mBinderService.getNumNotificationChannelsForPackage(PKG, mUid, true) > 0);
+
+ final NotificationChannel channel =
+ new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
+ mBinderService.createNotificationChannels(PKG,
+ new ParceledListSlice(Arrays.asList(channel)));
+ verify(mWorkerHandler, never()).post(any(
+ NotificationManagerService.ShowNotificationPermissionPromptRunnable.class));
+ }
+
+ @Test
+ public void testCreateNotificationChannels_FirstChannelWithBgndTaskDoesntStartPermDialog()
+ throws Exception {
+ reset(mPermissionPolicyInternal);
+ when(mPermissionPolicyInternal.canShowPermissionPromptForTask(any(
+ ActivityManager.RecentTaskInfo.class))).thenReturn(false);
+
+ final NotificationChannel channel =
+ new NotificationChannel("id", "name", IMPORTANCE_DEFAULT);
+ mBinderService.createNotificationChannels(PKG,
+ new ParceledListSlice(Arrays.asList(channel)));
+
+ verify(mWorkerHandler, never()).post(any(
+ NotificationManagerService.ShowNotificationPermissionPromptRunnable.class));
+ }
+
+ @Test
public void testCreateNotificationChannels_TwoChannels() throws Exception {
final NotificationChannel channel1 =
new NotificationChannel("id1", "name", IMPORTANCE_DEFAULT);
@@ -1437,6 +1507,62 @@
}
@Test
+ public void testEnqueueNotificationWithTag_FgsAddsFlags_dismissalAllowed() throws Exception {
+ DeviceConfig.setProperty(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED,
+ "true",
+ false);
+ Thread.sleep(300);
+
+ final String tag = "testEnqueueNotificationWithTag_FgsAddsFlags_dismissalAllowed";
+
+ Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon)
+ .setFlag(FLAG_FOREGROUND_SERVICE, true)
+ .build();
+ StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, tag, mUid, 0,
+ n, UserHandle.getUserHandleForUid(mUid), null, 0);
+ mBinderService.enqueueNotificationWithTag(PKG, PKG, tag,
+ sbn.getId(), sbn.getNotification(), sbn.getUserId());
+ waitForIdle();
+
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(PKG);
+ assertThat(notifs[0].getNotification().flags).isEqualTo(
+ FLAG_FOREGROUND_SERVICE | FLAG_CAN_COLORIZE | FLAG_NO_CLEAR);
+ }
+
+ @Test
+ public void testEnqueueNotificationWithTag_FGSaddsFlags_dismissalNotAllowed() throws Exception {
+ DeviceConfig.setProperty(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED,
+ "false",
+ false);
+ Thread.sleep(300);
+
+ final String tag = "testEnqueueNotificationWithTag_FGSaddsNoClear";
+
+ Notification n = new Notification.Builder(mContext, mTestNotificationChannel.getId())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon)
+ .setFlag(FLAG_FOREGROUND_SERVICE, true)
+ .build();
+ StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 8, "tag", mUid, 0,
+ n, UserHandle.getUserHandleForUid(mUid), null, 0);
+ mBinderService.enqueueNotificationWithTag(PKG, PKG, tag,
+ sbn.getId(), sbn.getNotification(), sbn.getUserId());
+ waitForIdle();
+
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(PKG);
+ assertThat(notifs[0].getNotification().flags).isEqualTo(
+ FLAG_FOREGROUND_SERVICE | FLAG_CAN_COLORIZE | FLAG_NO_CLEAR | FLAG_ONGOING_EVENT);
+ }
+
+ @Test
public void testCancelNonexistentNotification() throws Exception {
mBinderService.cancelNotificationWithTag(PKG, PKG,
"testCancelNonexistentNotification", 0, 0);
@@ -1757,51 +1883,6 @@
}
@Test
- public void testCancelAllCancelNotificationsFromListener_NoClearFlag() throws Exception {
- final NotificationRecord parent = generateNotificationRecord(
- mTestNotificationChannel, 1, "group", true);
- final NotificationRecord child = generateNotificationRecord(
- mTestNotificationChannel, 2, "group", false);
- final NotificationRecord child2 = generateNotificationRecord(
- mTestNotificationChannel, 3, "group", false);
- child2.getNotification().flags |= Notification.FLAG_NO_CLEAR;
- final NotificationRecord newGroup = generateNotificationRecord(
- mTestNotificationChannel, 4, "group2", false);
- mService.addNotification(parent);
- mService.addNotification(child);
- mService.addNotification(child2);
- mService.addNotification(newGroup);
- mService.getBinderService().cancelNotificationsFromListener(null, null);
- waitForIdle();
- StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
- assertEquals(1, notifs.length);
- }
-
- @Test
- public void testUserInitiatedCancelAllWithGroup_NoClearFlag() throws Exception {
- final NotificationRecord parent = generateNotificationRecord(
- mTestNotificationChannel, 1, "group", true);
- final NotificationRecord child = generateNotificationRecord(
- mTestNotificationChannel, 2, "group", false);
- final NotificationRecord child2 = generateNotificationRecord(
- mTestNotificationChannel, 3, "group", false);
- child2.getNotification().flags |= Notification.FLAG_NO_CLEAR;
- final NotificationRecord newGroup = generateNotificationRecord(
- mTestNotificationChannel, 4, "group2", false);
- mService.addNotification(parent);
- mService.addNotification(child);
- mService.addNotification(child2);
- mService.addNotification(newGroup);
- mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(),
- parent.getUserId());
- waitForIdle();
- StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
- assertEquals(1, notifs.length);
- }
-
- @Test
public void testRemoveForegroundServiceFlag_ImmediatelyAfterEnqueue() throws Exception {
Notification n =
new Notification.Builder(mContext, mTestNotificationChannel.getId())
@@ -1838,7 +1919,268 @@
}
@Test
- public void testCancelAllCancelNotificationsFromListener_ForegroundServiceFlag()
+ public void testCancelNotificationWithTag_fromApp_cannotCancelFgsChild()
+ throws Exception {
+ mService.isSystemUid = false;
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.getBinderService().cancelNotificationWithTag(
+ parent.getSbn().getPackageName(), parent.getSbn().getPackageName(),
+ parent.getSbn().getTag(), parent.getSbn().getId(), parent.getSbn().getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationWithTag_fromApp_cannotCancelFgsParent()
+ throws Exception {
+ mService.isSystemUid = false;
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.getBinderService().cancelNotificationWithTag(
+ parent.getSbn().getPackageName(), parent.getSbn().getPackageName(),
+ parent.getSbn().getTag(), parent.getSbn().getId(), parent.getSbn().getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(3, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationWithTag_fromApp_canCancelOngoingNoClearChild()
+ throws Exception {
+ mService.isSystemUid = false;
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_ONGOING_EVENT | FLAG_NO_CLEAR;
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.getBinderService().cancelNotificationWithTag(
+ parent.getSbn().getPackageName(), parent.getSbn().getPackageName(),
+ parent.getSbn().getTag(), parent.getSbn().getId(), parent.getSbn().getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationWithTag_fromApp_canCancelOngoingNoClearParent()
+ throws Exception {
+ mService.isSystemUid = false;
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_ONGOING_EVENT | FLAG_NO_CLEAR;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.getBinderService().cancelNotificationWithTag(
+ parent.getSbn().getPackageName(), parent.getSbn().getPackageName(),
+ parent.getSbn().getTag(), parent.getSbn().getId(), parent.getSbn().getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelAllNotificationsFromApp_cannotCancelFgsChild()
+ throws Exception {
+ mService.isSystemUid = false;
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelAllNotifications(
+ parent.getSbn().getPackageName(), parent.getSbn().getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelAllNotifications_fromApp_cannotCancelFgsParent()
+ throws Exception {
+ mService.isSystemUid = false;
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelAllNotifications(
+ parent.getSbn().getPackageName(), parent.getSbn().getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelAllNotifications_fromApp_canCancelOngoingNoClearChild()
+ throws Exception {
+ mService.isSystemUid = false;
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_ONGOING_EVENT | FLAG_NO_CLEAR;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelAllNotifications(
+ parent.getSbn().getPackageName(), parent.getSbn().getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelAllNotifications_fromApp_canCancelOngoingNoClearParent()
+ throws Exception {
+ mService.isSystemUid = false;
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_ONGOING_EVENT | FLAG_NO_CLEAR;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelAllNotifications(
+ parent.getSbn().getPackageName(), parent.getSbn().getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_clearAll_GroupWithOngoingParent()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_ONGOING_EVENT;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_clearAll_GroupWithOngoingChild()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_ONGOING_EVENT;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_clearAll_GroupWithFgsParent()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_clearAll_GroupWithFgsChild()
throws Exception {
final NotificationRecord parent = generateNotificationRecord(
mTestNotificationChannel, 1, "group", true);
@@ -1861,7 +2203,171 @@
}
@Test
- public void testCancelAllCancelNotificationsFromListener_ForegroundServiceFlagWithParameter()
+ public void testCancelNotificationsFromListener_clearAll_GroupWithNoClearParent()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_NO_CLEAR;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_clearAll_GroupWithNoClearChild()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_NO_CLEAR;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_clearAll_Ongoing()
+ throws Exception {
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, null, false);
+ child2.getNotification().flags |= FLAG_ONGOING_EVENT;
+ mService.addNotification(child2);
+ String[] keys = {child2.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(child2.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_clearAll_NoClear()
+ throws Exception {
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, null, false);
+ child2.getNotification().flags |= FLAG_NO_CLEAR;
+ mService.addNotification(child2);
+ mService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(child2.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_clearAll_Fgs()
+ throws Exception {
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, null, false);
+ child2.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ mService.addNotification(child2);
+ mService.getBinderService().cancelNotificationsFromListener(null, null);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(child2.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_byKey_GroupWithOngoingParent()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_ONGOING_EVENT;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
+ child2.getSbn().getKey(), newGroup.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_byKey_GroupWithOngoingChild()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_ONGOING_EVENT;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
+ child2.getSbn().getKey(), newGroup.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_byKey_GroupWithFgsParent()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
+ child2.getSbn().getKey(), newGroup.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_byKey_GroupWithFgsChild()
throws Exception {
final NotificationRecord parent = generateNotificationRecord(
mTestNotificationChannel, 1, "group", true);
@@ -1882,26 +2388,28 @@
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
- assertEquals(1, notifs.length);
+ assertEquals(0, notifs.length);
}
@Test
- public void testUserInitiatedCancelAllWithGroup_ForegroundServiceFlag() throws Exception {
+ public void testCancelNotificationsFromListener_byKey_GroupWithNoClearParent()
+ throws Exception {
final NotificationRecord parent = generateNotificationRecord(
mTestNotificationChannel, 1, "group", true);
+ parent.getNotification().flags |= FLAG_NO_CLEAR;
final NotificationRecord child = generateNotificationRecord(
mTestNotificationChannel, 2, "group", false);
final NotificationRecord child2 = generateNotificationRecord(
mTestNotificationChannel, 3, "group", false);
- child2.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
final NotificationRecord newGroup = generateNotificationRecord(
mTestNotificationChannel, 4, "group2", false);
mService.addNotification(parent);
mService.addNotification(child);
mService.addNotification(child2);
mService.addNotification(newGroup);
- mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(),
- parent.getUserId());
+ String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
+ child2.getSbn().getKey(), newGroup.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
waitForIdle();
StatusBarNotification[] notifs =
mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
@@ -1909,6 +2417,76 @@
}
@Test
+ public void testCancelNotificationsFromListener_byKey_GroupWithNoClearChild()
+ throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_NO_CLEAR;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
+ child2.getSbn().getKey(), newGroup.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_byKey_Ongoing()
+ throws Exception {
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, null, false);
+ child2.getNotification().flags |= FLAG_ONGOING_EVENT;
+ mService.addNotification(child2);
+ String[] keys = {child2.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(child2.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_byKey_NoClear()
+ throws Exception {
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, null, false);
+ child2.getNotification().flags |= FLAG_NO_CLEAR;
+ mService.addNotification(child2);
+ String[] keys = {child2.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(child2.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
+ public void testCancelNotificationsFromListener_byKey_Fgs()
+ throws Exception {
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, null, false);
+ child2.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ mService.addNotification(child2);
+ String[] keys = {child2.getSbn().getKey()};
+ mService.getBinderService().cancelNotificationsFromListener(null, keys);
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(child2.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
public void testGroupInstanceIds() throws Exception {
final NotificationRecord group1 = generateNotificationRecord(
mTestNotificationChannel, 1, "group1", true);
@@ -1973,7 +2551,7 @@
}
@Test
- public void testCancelAllNotifications_CancelsNoClearFlagOnGoing() throws Exception {
+ public void testCancelAllNotificationsInt_CancelsNoClearFlagOnGoing() throws Exception {
final NotificationRecord notif = generateNotificationRecord(
mTestNotificationChannel, 1, "group", true);
notif.getNotification().flags |= Notification.FLAG_NO_CLEAR;
@@ -1987,32 +2565,7 @@
}
@Test
- public void testCancelAllCancelNotificationsFromListener_NoClearFlagWithParameter()
- throws Exception {
- final NotificationRecord parent = generateNotificationRecord(
- mTestNotificationChannel, 1, "group", true);
- final NotificationRecord child = generateNotificationRecord(
- mTestNotificationChannel, 2, "group", false);
- final NotificationRecord child2 = generateNotificationRecord(
- mTestNotificationChannel, 3, "group", false);
- child2.getNotification().flags |= Notification.FLAG_NO_CLEAR;
- final NotificationRecord newGroup = generateNotificationRecord(
- mTestNotificationChannel, 4, "group2", false);
- mService.addNotification(parent);
- mService.addNotification(child);
- mService.addNotification(child2);
- mService.addNotification(newGroup);
- String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
- child2.getSbn().getKey(), newGroup.getSbn().getKey()};
- mService.getBinderService().cancelNotificationsFromListener(null, keys);
- waitForIdle();
- StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
- assertEquals(0, notifs.length);
- }
-
- @Test
- public void testAppInitiatedCancelAllNotifications_CancelsOnGoingFlag() throws Exception {
+ public void testAppInitiatedCancelAllNotifications_CancelsOngoingFlag() throws Exception {
final StatusBarNotification sbn = generateNotificationRecord(null).getSbn();
sbn.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
mBinderService.enqueueNotificationWithTag(PKG, PKG,
@@ -2026,7 +2579,7 @@
}
@Test
- public void testCancelAllNotifications_CancelsOnGoingFlag() throws Exception {
+ public void testCancelAllNotificationsInt_CancelsOngoingFlag() throws Exception {
final NotificationRecord notif = generateNotificationRecord(
mTestNotificationChannel, 1, "group", true);
notif.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
@@ -2040,69 +2593,7 @@
}
@Test
- public void testUserInitiatedCancelAllOnClearAll_OnGoingFlag() throws Exception {
- final NotificationRecord notif = generateNotificationRecord(
- mTestNotificationChannel, 1, "group", true);
- notif.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
- mService.addNotification(notif);
-
- mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(),
- notif.getUserId());
- waitForIdle();
- StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(notif.getSbn().getPackageName());
- assertEquals(1, notifs.length);
- }
-
- @Test
- public void testCancelAllCancelNotificationsFromListener_OnGoingFlag() throws Exception {
- final NotificationRecord parent = generateNotificationRecord(
- mTestNotificationChannel, 1, "group", true);
- final NotificationRecord child = generateNotificationRecord(
- mTestNotificationChannel, 2, "group", false);
- final NotificationRecord child2 = generateNotificationRecord(
- mTestNotificationChannel, 3, "group", false);
- child2.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
- final NotificationRecord newGroup = generateNotificationRecord(
- mTestNotificationChannel, 4, "group2", false);
- mService.addNotification(parent);
- mService.addNotification(child);
- mService.addNotification(child2);
- mService.addNotification(newGroup);
- mService.getBinderService().cancelNotificationsFromListener(null, null);
- waitForIdle();
- StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
- assertEquals(1, notifs.length);
- }
-
- @Test
- public void testCancelAllCancelNotificationsFromListener_OnGoingFlagWithParameter()
- throws Exception {
- final NotificationRecord parent = generateNotificationRecord(
- mTestNotificationChannel, 1, "group", true);
- final NotificationRecord child = generateNotificationRecord(
- mTestNotificationChannel, 2, "group", false);
- final NotificationRecord child2 = generateNotificationRecord(
- mTestNotificationChannel, 3, "group", false);
- child2.getNotification().flags |= Notification.FLAG_ONGOING_EVENT;
- final NotificationRecord newGroup = generateNotificationRecord(
- mTestNotificationChannel, 4, "group2", false);
- mService.addNotification(parent);
- mService.addNotification(child);
- mService.addNotification(child2);
- mService.addNotification(newGroup);
- String[] keys = {parent.getSbn().getKey(), child.getSbn().getKey(),
- child2.getSbn().getKey(), newGroup.getSbn().getKey()};
- mService.getBinderService().cancelNotificationsFromListener(null, keys);
- waitForIdle();
- StatusBarNotification[] notifs =
- mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
- assertEquals(0, notifs.length);
- }
-
- @Test
- public void testUserInitiatedCancelAllWithGroup_OnGoingFlag() throws Exception {
+ public void testUserInitiatedCancelAllWithGroup_OngoingFlag() throws Exception {
final NotificationRecord parent = generateNotificationRecord(
mTestNotificationChannel, 1, "group", true);
final NotificationRecord child = generateNotificationRecord(
@@ -2125,6 +2616,52 @@
}
@Test
+ public void testUserInitiatedCancelAllWithGroup_NoClearFlag() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= Notification.FLAG_NO_CLEAR;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(),
+ parent.getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(1, notifs.length);
+ }
+
+ @Test
+ public void testUserInitiatedCancelAllWithGroup_ForegroundServiceFlag() throws Exception {
+ final NotificationRecord parent = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord child = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", false);
+ final NotificationRecord child2 = generateNotificationRecord(
+ mTestNotificationChannel, 3, "group", false);
+ child2.getNotification().flags |= FLAG_FOREGROUND_SERVICE;
+ final NotificationRecord newGroup = generateNotificationRecord(
+ mTestNotificationChannel, 4, "group2", false);
+ mService.addNotification(parent);
+ mService.addNotification(child);
+ mService.addNotification(child2);
+ mService.addNotification(newGroup);
+ mService.mNotificationDelegate.onClearAll(mUid, Binder.getCallingPid(),
+ parent.getUserId());
+ waitForIdle();
+ StatusBarNotification[] notifs =
+ mBinderService.getActiveNotifications(parent.getSbn().getPackageName());
+ assertEquals(0, notifs.length);
+ }
+
+ @Test
public void testTvExtenderChannelOverride_onTv() throws Exception {
mService.setIsTelevision(true);
mService.setPreferencesHelper(mPreferencesHelper);
@@ -2418,7 +2955,8 @@
.thenReturn(singletonList(mock(AssociationInfo.class)));
NotificationChannelGroup ncg = new NotificationChannelGroup("a", "b/c");
mService.setPreferencesHelper(mPreferencesHelper);
- when(mPreferencesHelper.getNotificationChannelGroup(eq(ncg.getId()), eq(PKG), anyInt()))
+ when(mPreferencesHelper.getNotificationChannelGroupWithChannels(
+ eq(PKG), anyInt(), eq(ncg.getId()), anyBoolean()))
.thenReturn(ncg);
reset(mListeners);
mBinderService.deleteNotificationChannelGroup(PKG, ncg.getId());
@@ -2428,6 +2966,54 @@
}
@Test
+ public void testDeleteChannelGroupChecksForFgses() throws Exception {
+ when(mCompanionMgr.getAssociations(PKG, UserHandle.getUserId(mUid)))
+ .thenReturn(singletonList(mock(AssociationInfo.class)));
+ CountDownLatch latch = new CountDownLatch(2);
+ mService.createNotificationChannelGroup(
+ PKG, mUid, new NotificationChannelGroup("group", "group"), true, false);
+ new Thread(() -> {
+ NotificationChannel notificationChannel = new NotificationChannel("id", "id",
+ NotificationManager.IMPORTANCE_HIGH);
+ notificationChannel.setGroup("group");
+ ParceledListSlice<NotificationChannel> pls =
+ new ParceledListSlice(ImmutableList.of(notificationChannel));
+ try {
+ mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ latch.countDown();
+ }).start();
+ new Thread(() -> {
+ try {
+ synchronized (this) {
+ wait(5000);
+ }
+ mService.createNotificationChannelGroup(PKG, mUid,
+ new NotificationChannelGroup("new", "new group"), true, false);
+ NotificationChannel notificationChannel =
+ new NotificationChannel("id", "id", NotificationManager.IMPORTANCE_HIGH);
+ notificationChannel.setGroup("new");
+ ParceledListSlice<NotificationChannel> pls =
+ new ParceledListSlice(ImmutableList.of(notificationChannel));
+ try {
+ mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls);
+ mBinderService.deleteNotificationChannelGroup(PKG, "group");
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ latch.countDown();
+ }).start();
+
+ latch.await();
+ verify(mAmi).hasForegroundServiceNotification(anyString(), anyInt(), anyString());
+ }
+
+ @Test
public void testUpdateNotificationChannelFromPrivilegedListener_success() throws Exception {
mService.setPreferencesHelper(mPreferencesHelper);
when(mCompanionMgr.getAssociations(PKG, UserHandle.getUserId(mUid)))
@@ -3396,7 +3982,7 @@
mTestNotificationChannel.getId())
.setContentTitle("foo")
.setColorized(true).setColor(Color.WHITE)
- .setFlag(Notification.FLAG_CAN_COLORIZE, true)
+ .setFlag(FLAG_CAN_COLORIZE, true)
.setSmallIcon(android.R.drawable.sym_def_app_icon);
StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1,
"testNoFakeColorizedPermission", mUid, 0,
@@ -7469,17 +8055,6 @@
}
@Test
- public void testOnBootPhase() {
- mService.onBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);
-
- verify(mHistoryManager, never()).onBootPhaseAppsCanStart();
-
- mService.onBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
-
- verify(mHistoryManager, times(1)).onBootPhaseAppsCanStart();
- }
-
- @Test
public void testHandleOnPackageChanged() {
String[] pkgs = new String[] {PKG, PKG_N_MR1};
int[] uids = new int[] {mUid, UserHandle.PER_USER_RANGE + 1};
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
index bd3ba04..fa294dd 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java
@@ -16,6 +16,7 @@
package com.android.server.notification;
import static android.content.pm.PackageManager.FLAG_PERMISSION_POLICY_FIXED;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
@@ -224,7 +225,30 @@
verify(mPermManager).grantRuntimePermission(
"pkg", Manifest.permission.POST_NOTIFICATIONS, 10);
verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS,
- FLAG_PERMISSION_USER_SET, FLAG_PERMISSION_USER_SET, true, 10);
+ FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_REVIEW_REQUIRED,
+ FLAG_PERMISSION_USER_SET, true, 10);
+ }
+
+ @Test
+ public void testSetNotificationPermission_grantReviewRequired() throws Exception {
+ mPermissionHelper.setNotificationPermission("pkg", 10, true, false, true);
+
+ verify(mPermManager).grantRuntimePermission(
+ "pkg", Manifest.permission.POST_NOTIFICATIONS, 10);
+ verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS,
+ FLAG_PERMISSION_REVIEW_REQUIRED, FLAG_PERMISSION_REVIEW_REQUIRED, true, 10);
+ }
+
+ @Test
+ public void testSetNotificationPermission_pkgPerm_grantReviewRequired() throws Exception {
+ PermissionHelper.PackagePermission pkgPerm = new PermissionHelper.PackagePermission(
+ "pkg", 10, true, false);
+ mPermissionHelper.setNotificationPermission(pkgPerm);
+
+ verify(mPermManager).grantRuntimePermission(
+ "pkg", Manifest.permission.POST_NOTIFICATIONS, 10);
+ verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS,
+ FLAG_PERMISSION_REVIEW_REQUIRED, FLAG_PERMISSION_REVIEW_REQUIRED, true, 10);
}
@Test
@@ -234,7 +258,8 @@
verify(mPermManager).revokeRuntimePermission(
eq("pkg"), eq(Manifest.permission.POST_NOTIFICATIONS), eq(10), anyString());
verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS,
- FLAG_PERMISSION_USER_SET, FLAG_PERMISSION_USER_SET, true, 10);
+ FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_REVIEW_REQUIRED,
+ FLAG_PERMISSION_USER_SET, true, 10);
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
index 07d467b..ea5bf52 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java
@@ -291,7 +291,8 @@
assertFalse(mDisplayContent.getInsetsStateController().getRawInsetsState()
.getSource(ITYPE_NAVIGATION_BAR).isVisible());
- policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
+ policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR},
+ true /* isGestureOnSystemBar */);
waitUntilWindowAnimatorIdle();
final InsetsSourceControl[] controls =
mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow);
@@ -319,7 +320,8 @@
final InsetsPolicy policy = spy(mDisplayContent.getInsetsPolicy());
doNothing().when(policy).startAnimation(anyBoolean(), any());
policy.updateBarControlTarget(mAppWindow);
- policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
+ policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR},
+ true /* isGestureOnSystemBar */);
waitUntilWindowAnimatorIdle();
final InsetsSourceControl[] controls =
mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow);
@@ -351,7 +353,8 @@
final InsetsPolicy policy = spy(mDisplayContent.getInsetsPolicy());
doNothing().when(policy).startAnimation(anyBoolean(), any());
policy.updateBarControlTarget(mAppWindow);
- policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
+ policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR},
+ true /* isGestureOnSystemBar */);
waitUntilWindowAnimatorIdle();
InsetsSourceControl[] controls =
mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow);
@@ -402,7 +405,8 @@
final InsetsPolicy policy = spy(mDisplayContent.getInsetsPolicy());
doNothing().when(policy).startAnimation(anyBoolean(), any());
policy.updateBarControlTarget(app);
- policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
+ policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR},
+ true /* isGestureOnSystemBar */);
final InsetsSourceControl[] controls =
mDisplayContent.getInsetsStateController().getControlsForDispatch(app);
policy.updateBarControlTarget(app2);
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
index f8c84df..94bc7f2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -332,7 +332,8 @@
assertTrue(rotatedState.getSource(ITYPE_STATUS_BAR).isVisible());
provider.getSource().setVisible(false);
- mDisplayContent.getInsetsPolicy().showTransient(new int[] { ITYPE_STATUS_BAR });
+ mDisplayContent.getInsetsPolicy().showTransient(new int[] { ITYPE_STATUS_BAR },
+ true /* isGestureOnSystemBar */);
assertTrue(mDisplayContent.getInsetsPolicy().isTransient(ITYPE_STATUS_BAR));
assertFalse(app.getInsetsState().getSource(ITYPE_STATUS_BAR).isVisible());
diff --git a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
index 049966c..4dffe7e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
@@ -428,6 +428,25 @@
assertWindowHigher(mImeWindow, imeAppTarget);
}
+ @Test
+ public void testAssignWindowLayers_ForImeOnPopupImeLayeringTarget() {
+ final WindowState imeAppTarget = createWindow(null, TYPE_APPLICATION,
+ mAppWindow.mActivityRecord, "imeAppTarget");
+ mDisplayContent.setImeInputTarget(imeAppTarget);
+ mDisplayContent.setImeLayeringTarget(imeAppTarget);
+ mDisplayContent.setImeControlTarget(imeAppTarget);
+
+ // Set a popup IME layering target and keeps the original IME control target behinds it.
+ final WindowState popupImeTargetWin = createWindow(imeAppTarget,
+ TYPE_APPLICATION_SUB_PANEL, mAppWindow.mActivityRecord, "popupImeTargetWin");
+ mDisplayContent.setImeLayeringTarget(popupImeTargetWin);
+ mDisplayContent.updateImeParent();
+
+ // Ime should on top of the popup IME layering target window.
+ mDisplayContent.assignChildLayers(mTransaction);
+ assertWindowHigher(mImeWindow, popupImeTargetWin);
+ }
+
@Test
public void testAssignWindowLayers_ForNegativelyZOrderedSubtype() {
diff --git a/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java b/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java
index 0c65cc4..286cff9 100644
--- a/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java
+++ b/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java
@@ -688,6 +688,8 @@
String packageName,
PendingIntent pi,
int uid) {
+ boolean throwException = false;
+
// compare uid with packageName to foil apps pretending to be someone else
try {
ApplicationInfo aInfo = mContext.getPackageManager().getApplicationInfo(packageName, 0);
@@ -695,11 +697,13 @@
Slog.w(TAG, "package " + packageName
+ " does not match caller's uid " + uid);
EventLog.writeEvent(SNET_EVENT_LOG_ID, "180104273", -1, "");
- throw new IllegalArgumentException("package " + packageName
- + " not found");
+ throwException = true;
}
} catch (PackageManager.NameNotFoundException e) {
- throw new IllegalArgumentException("package " + packageName + " not found");
+ throwException = true;
+ } finally {
+ if (throwException)
+ throw new IllegalArgumentException("package " + packageName + " not found");
}
requestPermissionDialog(device, accessory, canBeDefault, packageName, uid, mContext, pi);
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index d94fafc..ce9530c 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -701,8 +701,15 @@
*/
public static final int PROPERTY_CROSS_SIM = 0x00004000;
+ /**
+ * Connection is a tethered external call.
+ * Indicates that the {@link Connection} is fixed on this device but the audio streams are
+ * re-routed to another device.
+ */
+ public static final int PROPERTY_TETHERED_CALL = 0x00008000;
+
//******************************************************************************************
- // Next PROPERTY value: 0x00004000
+ // Next PROPERTY value: 0x00010000
//******************************************************************************************
private final @CallState int mState;
@@ -899,6 +906,9 @@
if (hasProperty(properties, PROPERTY_CROSS_SIM)) {
builder.append(" PROPERTY_CROSS_SIM");
}
+ if (hasProperty(properties, PROPERTY_TETHERED_CALL)) {
+ builder.append(" PROPERTY_TETHERED_CALL");
+ }
builder.append("]");
return builder.toString();
}
diff --git a/telecomm/java/android/telecom/CallAudioState.java b/telecomm/java/android/telecom/CallAudioState.java
index fccdf76..389df80 100644
--- a/telecomm/java/android/telecom/CallAudioState.java
+++ b/telecomm/java/android/telecom/CallAudioState.java
@@ -27,7 +27,6 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -42,7 +41,8 @@
public final class CallAudioState implements Parcelable {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(value={ROUTE_EARPIECE, ROUTE_BLUETOOTH, ROUTE_WIRED_HEADSET, ROUTE_SPEAKER},
+ @IntDef(value = {ROUTE_EARPIECE, ROUTE_BLUETOOTH, ROUTE_WIRED_HEADSET, ROUTE_SPEAKER,
+ ROUTE_EXTERNAL},
flag=true)
public @interface CallAudioRoute {}
@@ -58,6 +58,9 @@
/** Direct the audio stream through the device's speakerphone. */
public static final int ROUTE_SPEAKER = 0x00000008;
+ /** Direct the audio stream through another device. */
+ public static final int ROUTE_EXTERNAL = 0x00000010;
+
/**
* Direct the audio stream through the device's earpiece or wired headset if one is
* connected.
@@ -70,7 +73,7 @@
* @hide
**/
public static final int ROUTE_ALL = ROUTE_EARPIECE | ROUTE_BLUETOOTH | ROUTE_WIRED_HEADSET |
- ROUTE_SPEAKER;
+ ROUTE_SPEAKER | ROUTE_EXTERNAL;
private final boolean isMuted;
private final int route;
@@ -189,7 +192,11 @@
*/
@CallAudioRoute
public int getSupportedRouteMask() {
- return supportedRouteMask;
+ if (route == ROUTE_EXTERNAL) {
+ return ROUTE_EXTERNAL;
+ } else {
+ return supportedRouteMask;
+ }
}
/**
@@ -233,6 +240,10 @@
listAppend(buffer, "SPEAKER");
}
+ if ((route & ROUTE_EXTERNAL) == ROUTE_EXTERNAL) {
+ listAppend(buffer, "EXTERNAL");
+ }
+
return buffer.toString();
}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 21a1804..30d4959 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -561,6 +561,15 @@
*/
public static final int PROPERTY_CROSS_SIM = 1 << 13;
+ /**
+ * Connection is a tethered external call.
+ * <p>
+ * Indicates that the {@link Connection} is fixed on this device but the audio streams are
+ * re-routed to another device.
+ * <p>
+ */
+ public static final int PROPERTY_TETHERED_CALL = 1 << 14;
+
//**********************************************************************************************
// Next PROPERTY value: 1<<14
//**********************************************************************************************
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 8e55f75..808df50 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -37,6 +37,8 @@
import android.os.RemoteException;
import android.service.carrier.CarrierService;
import android.telecom.TelecomManager;
+import android.telephony.AccessNetworkConstants.AccessNetworkType;
+import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.telephony.gba.TlsParams;
import android.telephony.gba.UaSecurityProtocolIdentifier;
@@ -4532,7 +4534,7 @@
"carrier_auto_cancel_cs_notification";
/**
- * Passing this value as {@link KEY_SUBSCRIPTION_GROUP_UUID_STRING} will remove the
+ * Passing this value as {@link #KEY_SUBSCRIPTION_GROUP_UUID_STRING} will remove the
* subscription from a group instead of adding it to a group.
*
* TODO: Expose in a future release.
@@ -4790,6 +4792,396 @@
public static final String KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG =
KEY_PREFIX + "rcs_request_retry_interval_millis_long";
+ /** SIP timer T1 as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_T1_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_t1_millis_int";
+
+ /** SIP timer T2 as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_T2_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_t2_millis_int";
+
+ /** SIP timer T4 as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_T4_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_t4_millis_int";
+
+ /** SIP timer B as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_B_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_b_millis_int";
+
+ /** SIP timer C as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_C_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_c_millis_int";
+
+ /** SIP timer D as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_D_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_d_millis_int";
+
+ /** SIP timer F as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_F_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_f_millis_int";
+
+ /** SIP timer H as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_H_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_h_millis_int";
+
+ /** SIP timer J as per 3GPP TS 24.229 Table 7.7.1 */
+ public static final String KEY_SIP_TIMER_J_MILLIS_INT =
+ KEY_PREFIX + "sip_timer_j_millis_int";
+
+ /** Specifies the SIP Server default port. */
+ public static final String KEY_SIP_SERVER_PORT_NUMBER_INT =
+ KEY_PREFIX + "sip_server_port_number_int";
+
+ /**
+ * Specify the “phone-context” parameter as defined in
+ * section 7.2A.10 in 3GPP TS 24.229.
+ */
+ public static final String KEY_PHONE_CONTEXT_DOMAIN_NAME_STRING =
+ KEY_PREFIX + "phone_context_domain_name_string";
+
+ /** @hide */
+ @IntDef({REQUEST_URI_FORMAT_TEL, REQUEST_URI_FORMAT_SIP})
+
+ public @interface RequestUriFormatType {}
+
+ /**
+ * Request URI is of type TEL URI.
+ */
+ public static final int REQUEST_URI_FORMAT_TEL = 0;
+
+ /**
+ * Request URI is of type SIP URI.
+ */
+ public static final int REQUEST_URI_FORMAT_SIP = 1;
+
+ /**
+ * Specify whether the request URI is SIP URI
+ * {@link #REQUEST_URI_FORMAT_SIP} or
+ * TEL URI {@link #REQUEST_URI_FORMAT_TEL}.
+ */
+ public static final String KEY_REQUEST_URI_TYPE_INT =
+ KEY_PREFIX + "request_uri_type_int";
+
+ /**
+ * Flag indicating whether Globally Routable User agent (GRUU)
+ * in supported HEADER is included or not.
+ *
+ * <p> Reference: RFC 5627.
+ */
+ public static final String KEY_GRUU_ENABLED_BOOL =
+ KEY_PREFIX + "gruu_enabled_bool";
+
+ /**
+ * Flag indicating whether to keep/release IMS PDN in case of
+ * moving to non VOPS area.
+ *
+ * <p>if {@code True}, keep IMS PDN in case of moving to non VOPS area.
+ * if {@code false}, otherwise.
+ */
+ public static final String KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL =
+ KEY_PREFIX + "keep_pdn_up_in_no_vops_bool";
+
+ /** @hide */
+ @IntDef({
+ PREFERRED_TRANSPORT_UDP,
+ PREFERRED_TRANSPORT_TCP,
+ PREFERRED_TRANSPORT_DYNAMIC_UDP_TCP,
+ PREFERRED_TRANSPORT_TLS
+ })
+
+ public @interface PreferredTransportType {}
+
+ /** Preferred Transport is always UDP. */
+ public static final int PREFERRED_TRANSPORT_UDP = 0;
+
+ /** Preferred Transport is always TCP. */
+ public static final int PREFERRED_TRANSPORT_TCP = 1;
+
+ /**
+ * Preferred Transport is both UDP and TCP and selected based
+ * on MTU size specified in {@link #KEY_IPV4_SIP_MTU_SIZE_CELLULAR_INT}
+ * and {@link #KEY_IPV6_SIP_MTU_SIZE_CELLULAR_INT}.
+ *
+ * <p>Default transport is UDP. If message size is larger
+ * than MTU, then TCP shall be used.
+ */
+ public static final int PREFERRED_TRANSPORT_DYNAMIC_UDP_TCP = 2;
+
+ /** Preferred Transport is TLS. */
+ public static final int PREFERRED_TRANSPORT_TLS = 3;
+
+ /**
+ * Specify the preferred transport protocol for SIP messages.
+ *
+ * <p>Possible values are,
+ * {@link #PREFERRED_TRANSPORT_UDP},
+ * {@link #PREFERRED_TRANSPORT_TCP},
+ * {@link #PREFERRED_TRANSPORT_DYNAMIC_UDP_TCP}
+ */
+ public static final String KEY_SIP_PREFERRED_TRANSPORT_INT =
+ KEY_PREFIX + "sip_preferred_transport_int";
+
+ /**
+ * Specify the maximum IPV4 MTU size of SIP message on Cellular.
+ *
+ * <p>If {@link #KEY_SIP_PREFERRED_TRANSPORT_INT} is
+ * {@link #PREFERRED_TRANSPORT_DYNAMIC_UDP_TCP} and SIP message MTU size
+ * is more than this value, then SIP transport will be TCP, else the
+ * SIP transport is UDP.
+ */
+ public static final String KEY_IPV4_SIP_MTU_SIZE_CELLULAR_INT =
+ KEY_PREFIX + "ipv4_sip_mtu_size_cellular_int";
+
+ /**
+ * Specify the maximum IPV6 MTU size of SIP message on Cellular.
+ *
+ * <p>If {@link #KEY_SIP_PREFERRED_TRANSPORT_INT} is
+ * {@link #PREFERRED_TRANSPORT_DYNAMIC_UDP_TCP} and SIP message MTU size
+ * is more than this value, then SIP transport will be TCP, else the
+ * SIP transport is UDP.
+ */
+ public static final String KEY_IPV6_SIP_MTU_SIZE_CELLULAR_INT =
+ KEY_PREFIX + "ipv6_sip_mtu_size_cellular_int";
+
+ /**
+ * This config determines whether IMS PDN needs to be enabled
+ * when VOPS support is not available in both home and roaming scenarios.
+ *
+ * <p>This is applicable before IMS PDN is up, to decide whether
+ * IMS PDN needs to be enabled based on VOPS support in home/roaming.
+ *
+ * <p>Possible values are,
+ * {@link #NETWORK_TYPE_HOME},
+ * {@link #NETWORK_TYPE_ROAMING}
+ * An empty array indicates IMS PDN depends on VOPS on both home
+ * and roaming scenarios.
+ */
+ public static final String KEY_IMS_PDN_ENABLED_IN_NO_VOPS_SUPPORT_INT_ARRAY =
+ KEY_PREFIX + "ims_pdn_enabled_in_no_vops_support_int_array";
+
+ /**
+ * Flag indicating whether IPSec enabled for SIP messages.
+ *
+ * <p> Reference: 3GPP TS 33.203 and RFC 3329.
+ */
+ public static final String KEY_SIP_OVER_IPSEC_ENABLED_BOOL =
+ KEY_PREFIX + "sip_over_ipsec_enabled_bool";
+
+ /** @hide */
+ @IntDef({IPSEC_AUTHENTICATION_ALGORITHM_HMAC_MD5, IPSEC_AUTHENTICATION_ALGORITHM_HMAC_SHA1})
+
+ public @interface IpsecAuthenticationAlgorithmType {}
+
+ /** IPSec Authentication algorithm is HMAC-MD5. see Annex H of TS 33.203 */
+ public static final int IPSEC_AUTHENTICATION_ALGORITHM_HMAC_MD5 = 0;
+
+ /** IPSec Authentication algorithm is HMAC-SHA1. see Annex H of TS 33.203 */
+ public static final int IPSEC_AUTHENTICATION_ALGORITHM_HMAC_SHA1 = 1;
+
+ /**
+ * List of supported IPSEC Authentication algorithms.
+ *
+ * <p>Possible values are,
+ * {@link #IPSEC_AUTHENTICATION_ALGORITHM_HMAC_MD5},
+ * {@link #IPSEC_AUTHENTICATION_ALGORITHM_HMAC_SHA1}
+ */
+ public static final String KEY_IPSEC_AUTHENTICATION_ALGORITHMS_INT_ARRAY =
+ KEY_PREFIX + "ipsec_authentication_algorithms_int_array";
+
+ /** @hide */
+ @IntDef({
+ IPSEC_ENCRYPTION_ALGORITHM_NULL,
+ IPSEC_ENCRYPTION_ALGORITHM_DES_EDE3_CBC,
+ IPSEC_ENCRYPTION_ALGORITHM_AES_CBC
+ })
+
+ public @interface IpsecEncryptionAlgorithmType {}
+
+ /** IPSec Encryption algorithm is NULL. see Annex H of TS 33.203 */
+ public static final int IPSEC_ENCRYPTION_ALGORITHM_NULL = 0;
+
+ /** IPSec Encryption algorithm is DES_EDE3_CBC. see Annex H of TS 33.203 */
+ public static final int IPSEC_ENCRYPTION_ALGORITHM_DES_EDE3_CBC = 1;
+
+ /** IPSec Encryption algorithm is AES_CBC. see Annex H of TS 33.203 */
+ public static final int IPSEC_ENCRYPTION_ALGORITHM_AES_CBC = 2;
+
+ /**
+ * List of supported IPSEC encryption algorithms.
+ *
+ * <p>Possible values are,
+ * {@link #IPSEC_ENCRYPTION_ALGORITHM_NULL},
+ * {@link #IPSEC_ENCRYPTION_ALGORITHM_DES_EDE3_CBC},
+ * {@link #IPSEC_ENCRYPTION_ALGORITHM_AES_CBC}
+ */
+ public static final String KEY_IPSEC_ENCRYPTION_ALGORITHMS_INT_ARRAY =
+ KEY_PREFIX + "ipsec_encryption_algorithms_int_array";
+
+ /**
+ * Expiry timer for IMS Registration in seconds.
+ * <p>Reference: RFC 3261 Section 20.19.
+ */
+ public static final String KEY_REGISTRATION_EXPIRY_TIMER_SEC_INT =
+ KEY_PREFIX + "registration_expiry_timer_sec_int";
+
+ /** Registration Retry Base-time as per RFC 5626 Section 4.5. */
+ public static final String KEY_REGISTRATION_RETRY_BASE_TIMER_MILLIS_INT =
+ KEY_PREFIX + "registration_retry_base_timer_millis_int";
+
+ /** Registration Retry max-time as per RFC 5626 Section 4.5. */
+ public static final String KEY_REGISTRATION_RETRY_MAX_TIMER_MILLIS_INT =
+ KEY_PREFIX + "registration_retry_max_timer_millis_int";
+
+ /**
+ * Flag indicating whether subscription to registration event package
+ * is supported or not.
+ */
+ public static final String KEY_REGISTRATION_EVENT_PACKAGE_SUPPORTED_BOOL =
+ KEY_PREFIX + "registration_event_package_supported_bool";
+
+ /**
+ * Expiry timer for SUBSCRIBE in seconds.
+ * <p>Reference: RFC 3261 Section 20.19.
+ */
+ public static final String KEY_REGISTRATION_SUBSCRIBE_EXPIRY_TIMER_SEC_INT =
+ KEY_PREFIX + "registration_subscribe_expiry_timer_sec_int";
+
+ /** @hide */
+ @IntDef({
+ GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_WIFI,
+ GEOLOCATION_PIDF_FOR_EMERGENCY_ON_WIFI,
+ GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_CELLULAR,
+ GEOLOCATION_PIDF_FOR_EMERGENCY_ON_CELLULAR
+ })
+
+ public @interface GeolocationPidfAllowedType {}
+
+ /**
+ * Indicates geolocation PIDF XML needs to be included for
+ * normal/non-emergency call scenario on WiFi
+ *
+ * <p>Geolocation for normal/non-emergency call should only include
+ * country code.
+ */
+ public static final int GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_WIFI = 1;
+
+ /**
+ * Indicates geolocation PIDF XML needs to be included for emergency
+ * call scenario on WiFi
+ */
+ public static final int GEOLOCATION_PIDF_FOR_EMERGENCY_ON_WIFI = 2;
+
+ /**
+ * Indicates geolocation PIDF XML needs to be included for normal/non-emergency
+ * call scenario on Cellular
+ *
+ * <p>Geolocation for normal/non-emergency call should only include
+ * country code.
+ */
+ public static final int GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_CELLULAR = 3;
+
+ /**
+ * Indicates geolocation PIDF XML needs to be included for emergency
+ * call scenario on Cellular
+ */
+ public static final int GEOLOCATION_PIDF_FOR_EMERGENCY_ON_CELLULAR = 4;
+
+ /**
+ * List of cases where geolocation PIDF XML needs to be included in the
+ * SIP REGISTER over WiFi and Cellular.
+ *
+ * <p>Possible values are,
+ * {@link #GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_WIFI},
+ * {@link #GEOLOCATION_PIDF_FOR_EMERGENCY_ON_WIFI},
+ * {@link #GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_CELLULAR},
+ * {@link #GEOLOCATION_PIDF_FOR_EMERGENCY_ON_CELLULAR}
+ *
+ * <p>An empty array indicates geolocation PIDF XML should not be included in
+ * the SIP REGISTER over WiFi and Cellular.
+ */
+ public static final String KEY_GEOLOCATION_PIDF_IN_SIP_REGISTER_SUPPORT_INT_ARRAY =
+ KEY_PREFIX + "geolocation_pidf_in_sip_register_support_int_array";
+
+ /**
+ * List of cases where geolocation PIDF XML needs to be included in the
+ * SIP INVITE over WiFi and Cellular.
+ *
+ * <p>Possible values are,
+ * {@link #GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_WIFI},
+ * {@link #GEOLOCATION_PIDF_FOR_EMERGENCY_ON_WIFI},
+ * {@link #GEOLOCATION_PIDF_FOR_NON_EMERGENCY_ON_CELLULAR},
+ * {@link #GEOLOCATION_PIDF_FOR_EMERGENCY_ON_CELLULAR}
+ *
+ * <p>An empty array indicates geolocation PIDF XML should not be included
+ * in the SIP INVITE over WiFi and Cellular.
+ */
+ public static final String KEY_GEOLOCATION_PIDF_IN_SIP_INVITE_SUPPORT_INT_ARRAY =
+ KEY_PREFIX + "geolocation_pidf_in_sip_invite_support_int_array";
+
+ /**
+ * Specifies the IMS User Agent in template format.
+ *
+ * <p>Example: #MANUFACTURER#_#MODEL#_Android#AV#_#BUILD#".
+ * IMS Stack should internally substitute the tokens with the
+ * values from the respective android properties.
+ *
+ * <p>List of allowed tokens and the corresponding android properties are,
+ * <UL>
+ * <LI>MANUFACTURER : ro.product.manufacturer</LI>
+ * <LI>MODEL : ro.product.model</LI>
+ * <LI>AV : ro.build.version.release"</LI>
+ * <LI>BUILD : ro.build.id</LI>
+ * </UL>
+ * <p> Vendor IMS Stack should strip any whitespace characters present
+ * in the android properties values before replacing the token.
+ *
+ * <p> An empty string is invalid as per IR92 section 2.6. This key is
+ * considered invalid if the format is violated. If the key is invalid or
+ * not configured, IMS stack should use internal default values.
+ */
+ public static final String KEY_IMS_USER_AGENT_STRING =
+ KEY_PREFIX + "ims_user_agent_string";
+
+ /** @hide */
+ @IntDef({
+ NETWORK_TYPE_HOME,
+ NETWORK_TYPE_ROAMING
+ })
+
+ public @interface NetworkType {}
+
+ /** Indicates HOME Network. */
+ public static final int NETWORK_TYPE_HOME = 0;
+
+ /** Indicates Roaming Network. */
+ public static final int NETWORK_TYPE_ROAMING = 1;
+
+ /** @hide */
+ @IntDef({
+ RTCP_INACTIVITY_ON_HOLD,
+ RTCP_INACTIVITY_ON_CONNECTED,
+ RTP_INACTIVITY_ON_CONNECTED,
+ E911_RTCP_INACTIVITY_ON_CONNECTED,
+ E911_RTP_INACTIVITY_ON_CONNECTED
+ })
+
+ public @interface MediaInactivityReason {}
+
+ /** RTCP inactivity occurred when call is on HOLD. */
+ public static final int RTCP_INACTIVITY_ON_HOLD = 0;
+
+ /** RTCP inactivity occurred when call is connected. */
+ public static final int RTCP_INACTIVITY_ON_CONNECTED = 1;
+
+ /** RTP inactivity occurred when call is connected. */
+ public static final int RTP_INACTIVITY_ON_CONNECTED = 2;
+
+ /** E911 RTCP inactivity occurred when call is connected. */
+ public static final int E911_RTCP_INACTIVITY_ON_CONNECTED = 3;
+
+ /** E911 RTP inactivity occurred when call is connected. */
+ public static final int E911_RTP_INACTIVITY_ON_CONNECTED = 4;
+
private Ims() {}
private static PersistableBundle getDefaults() {
@@ -4826,6 +5218,2159 @@
"+g.gsma.rcs.botversion=\"#=1,#=2\"",
"+g.gsma.rcs.cpimext"});
+ defaults.putBoolean(KEY_GRUU_ENABLED_BOOL, true);
+ defaults.putBoolean(KEY_SIP_OVER_IPSEC_ENABLED_BOOL, true);
+ defaults.putBoolean(KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL, false);
+ defaults.putBoolean(KEY_REGISTRATION_EVENT_PACKAGE_SUPPORTED_BOOL, true);
+
+ defaults.putInt(KEY_SIP_TIMER_T1_MILLIS_INT, 2000);
+ defaults.putInt(KEY_SIP_TIMER_T2_MILLIS_INT, 16000);
+ defaults.putInt(KEY_SIP_TIMER_T4_MILLIS_INT, 17000);
+ defaults.putInt(KEY_SIP_TIMER_B_MILLIS_INT, 128000);
+ defaults.putInt(KEY_SIP_TIMER_C_MILLIS_INT, 210000);
+ defaults.putInt(KEY_SIP_TIMER_D_MILLIS_INT, 130000);
+ defaults.putInt(KEY_SIP_TIMER_F_MILLIS_INT, 128000);
+ defaults.putInt(KEY_SIP_TIMER_H_MILLIS_INT, 128000);
+ defaults.putInt(KEY_SIP_TIMER_J_MILLIS_INT, 128000);
+ defaults.putInt(KEY_SIP_SERVER_PORT_NUMBER_INT, 5060);
+ defaults.putInt(KEY_REQUEST_URI_TYPE_INT, REQUEST_URI_FORMAT_SIP);
+ defaults.putInt(KEY_SIP_PREFERRED_TRANSPORT_INT, PREFERRED_TRANSPORT_DYNAMIC_UDP_TCP);
+ defaults.putInt(KEY_IPV4_SIP_MTU_SIZE_CELLULAR_INT, 1500);
+ defaults.putInt(KEY_IPV6_SIP_MTU_SIZE_CELLULAR_INT, 1500);
+ defaults.putInt(KEY_REGISTRATION_EXPIRY_TIMER_SEC_INT, 600000);
+ defaults.putInt(KEY_REGISTRATION_RETRY_BASE_TIMER_MILLIS_INT, 30000);
+ defaults.putInt(KEY_REGISTRATION_RETRY_MAX_TIMER_MILLIS_INT, 1800000);
+ defaults.putInt(KEY_REGISTRATION_SUBSCRIBE_EXPIRY_TIMER_SEC_INT, 600000);
+
+ defaults.putIntArray(
+ KEY_IPSEC_AUTHENTICATION_ALGORITHMS_INT_ARRAY,
+ new int[] {
+ IPSEC_AUTHENTICATION_ALGORITHM_HMAC_MD5,
+ IPSEC_AUTHENTICATION_ALGORITHM_HMAC_SHA1
+ });
+ defaults.putIntArray(
+ KEY_IPSEC_ENCRYPTION_ALGORITHMS_INT_ARRAY,
+ new int[] {
+ IPSEC_ENCRYPTION_ALGORITHM_NULL,
+ IPSEC_ENCRYPTION_ALGORITHM_DES_EDE3_CBC,
+ IPSEC_ENCRYPTION_ALGORITHM_AES_CBC
+ });
+ defaults.putIntArray(
+ KEY_IMS_PDN_ENABLED_IN_NO_VOPS_SUPPORT_INT_ARRAY,
+ new int[] {
+ });
+ defaults.putIntArray(
+ KEY_GEOLOCATION_PIDF_IN_SIP_REGISTER_SUPPORT_INT_ARRAY,
+ new int[] {
+ GEOLOCATION_PIDF_FOR_EMERGENCY_ON_WIFI
+ });
+ defaults.putIntArray(
+ KEY_GEOLOCATION_PIDF_IN_SIP_INVITE_SUPPORT_INT_ARRAY,
+ new int[] {
+ GEOLOCATION_PIDF_FOR_EMERGENCY_ON_WIFI
+ });
+
+ defaults.putString(KEY_PHONE_CONTEXT_DOMAIN_NAME_STRING, "");
+ defaults.putString(KEY_IMS_USER_AGENT_STRING,
+ "#MANUFACTURER#_#MODEL#_Android#AV#_#BUILD#");
+
+ return defaults;
+ }
+ }
+
+ /**
+ * IMS Voice configs. This groups the configs required for IMS Voice - VoNR/VoLTE
+ *
+ * <p>Reference: IR.92
+ */
+ public static final class ImsVoice {
+ private ImsVoice() {}
+
+ /** Prefix of all imsvoice.KEY_* constants. */
+ public static final String KEY_PREFIX = "imsvoice.";
+
+ /**
+ * Flag specifying whether VoLTE should be available when on
+ * roaming network.
+ *
+ * <p>If {@code false}: hard disabled.
+ * If {@code true}: then depends on availability, etc.
+ */
+ public static final String KEY_CARRIER_VOLTE_ROAMING_AVAILABLE_BOOL =
+ KEY_PREFIX + "carrier_volte_roaming_available_bool";
+
+ /**
+ * Flag specifying whether to send vertical caller id service codes
+ * (*67 and *82) in the dialed string in the SIP:INVITE.
+ *
+ * <p>If {@code true}, vertical caller id service codes *67 and *82
+ * will be sent in the dialed string in the SIP:INVITE.
+ * If {@code false}, *67 and *82 will be removed.
+ */
+ public static final String KEY_INCLUDE_CALLER_ID_SERVICE_CODES_IN_SIP_INVITE_BOOL =
+ KEY_PREFIX + "include_caller_id_service_codes_in_sip_invite_bool";
+
+ /**
+ * Flag indicating whether Multi-end point setting is enabled or not.
+ */
+ public static final String KEY_MULTIENDPOINT_SUPPORTED_BOOL =
+ KEY_PREFIX + "multiendpoint_supported_bool";
+
+ /**
+ * Flag indicating whether Supported header field with the option tag
+ * 'timer' is enabled or not.
+ *
+ * <p>If {@code true}, session timer support is available.{@code false} otherwise.
+ *
+ * Reference: RFC 4028 Section 3
+ */
+ public static final String KEY_SESSION_TIMER_SUPPORTED_BOOL =
+ KEY_PREFIX + "session_timer_supported_bool";
+
+ /**
+ * Session-expires header field expressed in seconds as per
+ * RFC 4028 Section 3.
+ *
+ * <p>This establishes the upper bound for the session refresh interval.
+ */
+ public static final String KEY_SESSION_EXPIRES_TIMER_SEC_INT =
+ KEY_PREFIX + "session_expires_timer_sec_int";
+
+ /**
+ * Indicates the minimum value for the session interval in seconds.
+ * Represented as min-SE header field as per RFC 4028 Section 3.
+ *
+ * <p>This establishes the lower bound for the session refresh interval.
+ */
+ public static final String KEY_MINIMUM_SESSION_EXPIRES_TIMER_SEC_INT =
+ KEY_PREFIX + "minimum_session_expires_timer_sec_int";
+
+ /** @hide */
+ @IntDef({
+ SESSION_REFRESHER_TYPE_UNKNOWN,
+ SESSION_REFRESHER_TYPE_UAC,
+ SESSION_REFRESHER_TYPE_UAS
+ })
+
+ public @interface SessionRefresherType {}
+
+ /**
+ * Session Refresher entity is unknown. This means UE does not include the
+ * "refresher" parameter in the Session-Expires header field of
+ * the SIP INVITE request.
+ */
+ public static final int SESSION_REFRESHER_TYPE_UNKNOWN = 0;
+
+ /**
+ * Session Refresher entity is User Agent Client (UAC).
+ *
+ * <p>Type of "refresher" parameter in the Session-Expires header field
+ * of the SIP INVITE request is UAC.
+ */
+ public static final int SESSION_REFRESHER_TYPE_UAC = 1;
+
+ /**
+ * Session Refresher entity is User Agent Server (UAS).
+ *
+ * <p>Type of "refresher" parameter in the Session-Expires header field
+ * of the SIP INVITE request is UAS.
+ */
+ public static final int SESSION_REFRESHER_TYPE_UAS = 2;
+
+ /**
+ * Session Refresher entity as per RFC 4028 and IR.92 Section 2.2.8.
+ *
+ * <p>This determines,
+ * a) whether to include the "refresher" parameter
+ * b) Type of refresher" parameter
+ * in the Session-Expires header field of the SIP INVITE request.
+ *
+ * <p>Possible values are,
+ * {@link #SESSION_REFRESHER_TYPE_UNKNOWN},
+ * {@link #SESSION_REFRESHER_TYPE_UAC},
+ * {@link #SESSION_REFRESHER_TYPE_UAS}
+ */
+ public static final String KEY_SESSION_REFRESHER_TYPE_INT =
+ KEY_PREFIX + "session_refresher_type_int";
+
+ /**
+ * Flag indicating whether PRACK must be enabled for all 18x messages.
+ *
+ * <p>If {@code false}, only 18x responses with SDP are sent reliably.
+ * If {@code true}, SIP 18x responses (other than SIP 183 response)
+ * are sent reliably.
+ */
+ public static final String KEY_PRACK_SUPPORTED_FOR_18X_BOOL =
+ KEY_PREFIX + "prack_supported_for_18x_bool";
+
+ /** @hide */
+ @IntDef({
+ CONFERENCE_SUBSCRIBE_TYPE_IN_DIALOG,
+ CONFERENCE_SUBSCRIBE_TYPE_OUT_OF_DIALOG
+ })
+
+ public @interface ConferenceSubscribeType {}
+
+ /**
+ * The SIP SUBSCRIBE to conference state events is sent in the
+ * SIP INVITE dialog between the UE and the conference server.
+ *
+ * <p>Reference: IR.92 Section 2.3.3.
+ */
+ public static final int CONFERENCE_SUBSCRIBE_TYPE_IN_DIALOG = 0;
+
+ /**
+ * The SIP SUBSCRIBE to conference state events is sent out of
+ * the SIP INVITE dialog between the UE and the conference server.
+ *
+ * <p>Reference: IR.92 Section 2.3.3.
+ */
+ public static final int CONFERENCE_SUBSCRIBE_TYPE_OUT_OF_DIALOG = 1;
+
+ /**
+ * This is used to specify whether the SIP SUBSCRIBE to conference state events,
+ * is sent in or out of the SIP INVITE dialog between the UE and the
+ * conference server.
+ *
+ * <p>Reference: IR.92 Section 2.3.3.
+ *
+ * <p>Possible values are,
+ * {@link #CONFERENCE_SUBSCRIBE_TYPE_IN_DIALOG},
+ * {@link #CONFERENCE_SUBSCRIBE_TYPE_OUT_OF_DIALOG}
+ *
+ * An empty array indicates SUBSCRIBE to conference event package
+ * is not required.
+ */
+ public static final String KEY_CONFERENCE_SUBSCRIBE_TYPE_INT =
+ KEY_PREFIX + "conference_subscribe_type_int";
+
+ /**
+ * Flag specifying whether QoS preconditions are supported during call setup.
+ *
+ * <p>If {@code true}: QoS Preconditions are supported during call setup and
+ * 'precondition' tag is included in the SIP INVITE header and precondition
+ * parameters are sent in SDP as required.
+ * <p>If {@code false}: QoS Preconditions are not supported during call setup.
+ *
+ * <p>Reference: 3GPP TS 24.229
+ */
+ public static final String KEY_VOICE_QOS_PRECONDITION_SUPPORTED_BOOL =
+ KEY_PREFIX + "voice_qos_precondition_supported_bool";
+
+ /**
+ * Flag specifying whether voice is allowed on default bearer.
+ *
+ * <p>If {@code true}: voice packets can be sent on default bearer. {@code false} otherwise.
+ */
+ public static final String KEY_VOICE_ON_DEFAULT_BEARER_SUPPORTED_BOOL =
+ KEY_PREFIX + "voice_on_default_bearer_supported_bool";
+
+ /**
+ * Specifies the dedicated bearer wait time during call establishment.
+ *
+ * <p>If dedicated bearer is not established within this time and if
+ * {@link #KEY_VOICE_ON_DEFAULT_BEARER_SUPPORTED_BOOL} is false, then call setup would fail.
+ * <p>If dedicated bearer is not established within this time and if
+ * {@link #KEY_VOICE_ON_DEFAULT_BEARER_SUPPORTED_BOOL} is true, then the media is allowed
+ * on default bearer.
+ */
+ public static final String KEY_DEDICATED_BEARER_WAIT_TIMER_MILLIS_INT =
+ KEY_PREFIX + "dedicated_bearer_wait_timer_millis_int";
+
+ /** @hide */
+ @IntDef({
+ BASIC_SRVCC_SUPPORT,
+ ALERTING_SRVCC_SUPPORT,
+ PREALERTING_SRVCC_SUPPORT,
+ MIDCALL_SRVCC_SUPPORT
+ })
+
+ public @interface SrvccType {}
+
+ /**
+ * Indicates support for basic SRVCC, typically 1 active call
+ * as detailed in IR.92 Section A.3.
+ */
+ public static final int BASIC_SRVCC_SUPPORT = 0;
+
+ /**
+ * SRVCC access transfer for calls in alerting phase as per 3GPP 24.237
+ * and IR.64 Section 4.4.
+ * Media feature tag used: g.3gpp.srvcc-alerting.
+ */
+ public static final int ALERTING_SRVCC_SUPPORT = 1;
+
+ /**
+ * SRVCC access transfer for calls in pre-alerting phase as per 3GPP 24.237.
+ * Media feature tag used: g.3gpp.ps2cs-srvcc-orig-pre-alerting.
+ */
+ public static final int PREALERTING_SRVCC_SUPPORT = 2;
+
+ /**
+ * SRVCC access transfer for calls in mid-call phase as per 3GPP 24.237.
+ * and IR.64 Section 4.4.
+ * <p>This means UE supports the MSC server assisted mid-call feature.
+ * Media feature tag used: g.3gpp.mid-call.
+ */
+ public static final int MIDCALL_SRVCC_SUPPORT = 3;
+
+ /**
+ * List of different SRVCC types supported as defined in 3GPP 24.237.
+ *
+ * <p> Possible values are,
+ * {@link #BASIC_SRVCC_SUPPORT},
+ * {@link #ALERTING_SRVCC_SUPPORT},
+ * {@link #PREALERTING_SRVCC_SUPPORT},
+ * {@link #MIDCALL_SRVCC_SUPPORT}
+ *
+ * <p> Reference: IR.64, 3GPP 24.237, 3GPP 23.216
+ */
+ public static final String KEY_SRVCC_TYPE_INT_ARRAY =
+ KEY_PREFIX + "srvcc_type_int_array";
+
+ /**
+ * Specifies the ringing timer for Mobile terminated calls.
+ *
+ * <p>Ringing timer starts when the device sends SIP 180 Ringing in
+ * response to a received SIP INVITE. If Ringing timer expires,
+ * the device sends SIP 486 response.
+ */
+ public static final String KEY_RINGING_TIMER_MILLIS_INT =
+ KEY_PREFIX + "ringing_timer_millis_int";
+
+ /**
+ * Specifies the ringback timer for Mobile originated calls.
+ *
+ * <p>Ringback timer starts when the device receives SIP 180 Ringing
+ * in response to its SIP INVITE. If Ringback timer expires,
+ * the device sends SIP CANCEL.
+ */
+ public static final String KEY_RINGBACK_TIMER_MILLIS_INT =
+ KEY_PREFIX + "ringback_timer_millis_int";
+
+ /**
+ * Specifies the timeout value for RTP inactivity for audio media.
+ * <p>On timer expiry, call will end.
+ * See {@link #KEY_AUDIO_INACTIVITY_CALL_END_REASONS_INT_ARRAY} for more
+ * details.
+ * <p> Value of 0 means this timer is not enabled.
+ */
+ public static final String KEY_AUDIO_RTP_INACTIVITY_TIMER_MILLIS_INT =
+ KEY_PREFIX + "audio_rtp_inactivity_timer_millis_int";
+
+ /**
+ * Specifies the timeout value for RTCP inactivity for audio media.
+ * <p>On timer expiry, call will end.
+ * See {@link #KEY_AUDIO_INACTIVITY_CALL_END_REASONS_INT_ARRAY} for more
+ * details.
+ * <p> Value of 0 means this timer is not enabled.
+ */
+ public static final String KEY_AUDIO_RTCP_INACTIVITY_TIMER_MILLIS_INT =
+ KEY_PREFIX + "audio_rtcp_inactivity_timer_millis_int";
+
+ /**
+ * Used to specify the conference factory URI.
+ *
+ * <p>If this is empty, then conference URI is generated from MCC/MNC as
+ * specified in clause 13.10 of 3GPP 23.003.
+ */
+ public static final String KEY_CONFERENCE_FACTORY_URI_STRING =
+ KEY_PREFIX + "conference_factory_uri_string";
+
+ /** @hide */
+ @IntDef({
+ SESSION_REFRESH_METHOD_INVITE,
+ SESSION_REFRESH_METHOD_UPDATE_PREFERRED
+ })
+
+ public @interface SessionRefreshMethod {}
+
+ /**
+ * SIP INVITE is used for Session Refresh
+ */
+ public static final int SESSION_REFRESH_METHOD_INVITE = 0;
+
+ /**
+ * Both SIP INVITE and UPDATE are used for session refresh.
+ *
+ * <p>SIP UPDATE will be used if UPDATE is in 'Allow' header.
+ * If UPDATE is not in 'Allow' header, then INVITE will be used.
+ */
+ public static final int SESSION_REFRESH_METHOD_UPDATE_PREFERRED = 1;
+
+ /**
+ * This is used to specify the method used for session refresh.
+ *
+ * <p>Possible values are,
+ * {@link #SESSION_REFRESH_METHOD_INVITE},
+ * {@link #SESSION_REFRESH_METHOD_UPDATE_PREFERRED}
+ */
+ public static final String KEY_SESSION_REFRESH_METHOD_INT =
+ KEY_PREFIX + "session_refresh_method_int";
+
+ /**
+ * Flag specifying whether the 'From' header field is used for determination of
+ * the originating party identity in Originating Identification Presentation(OIP)
+ * service.
+ *
+ * <p>If {@code true}: Indicates that the 'From' header field is used for
+ * determination of the originating party identity in OIP.
+ * {@code false} otherwise.
+ */
+ public static final String KEY_OIP_SOURCE_FROM_HEADER_BOOL =
+ KEY_PREFIX + "oip_source_from_header_bool";
+
+ /**
+ * Specifies the timer value for INVITE to the first 1xx response
+ * (including 100 trying). If no response is received at timer expiry,
+ * call is redialed over CS.
+ *
+ * <p> Reference: 24.173 Table L.1
+ */
+ public static final String KEY_MO_CALL_REQUEST_TIMEOUT_MILLIS_INT =
+ KEY_PREFIX + "mo_call_request_timeout_millis_int";
+
+ /**
+ * List of various reasons of media inactivity for which
+ * voice/emergency call will end.
+ *
+ * <p>Possible values are,
+ * {@link Ims#RTCP_INACTIVITY_ON_HOLD},
+ * {@link Ims#RTCP_INACTIVITY_ON_CONNECTED},
+ * {@link Ims#RTP_INACTIVITY_ON_CONNECTED}
+ * {@link Ims#E911_RTCP_INACTIVITY_ON_CONNECTED},
+ * {@link Ims#E911_RTP_INACTIVITY_ON_CONNECTED}
+ */
+ public static final String KEY_AUDIO_INACTIVITY_CALL_END_REASONS_INT_ARRAY =
+ KEY_PREFIX + "audio_inactivity_call_end_reasons_int_array";
+
+ /**
+ * Specifies the AS (Application Specific) SDP modifier for audio media.
+ *
+ * <p>This value is expressed in kilobits per second.
+ * Reference: RFC 3556 Section 2.
+ */
+ public static final String KEY_AUDIO_AS_BANDWIDTH_KBPS_INT =
+ KEY_PREFIX + "audio_as_bandwidth_kbps_int";
+
+ /**
+ * Specifies the RS SDP modifier for audio media. This indicates the RTCP
+ * bandwidth allocated to active data senders for audio media.
+ *
+ * <p>This value is expressed in bits per second.
+ * Reference: RFC 3556 Section 2.
+ */
+ public static final String KEY_AUDIO_RS_BANDWIDTH_BPS_INT =
+ KEY_PREFIX + "audio_rs_bandwidth_bps_int";
+
+ /**
+ * Specifies the RR SDP modifier for audio media. This indicates the RTCP
+ * bandwidth allocated to receivers for audio media.
+ *
+ * <p>This value is expressed in bits per second.
+ * Reference: RFC 3556 Section 2.
+ */
+ public static final String KEY_AUDIO_RR_BANDWIDTH_BPS_INT =
+ KEY_PREFIX + "audio_rr_bandwidth_bps_int";
+
+ /**
+ * Specifies the Audio Codec capability. This contains a list of payload types
+ * representing different audio codec instances.
+ *
+ * <p> The priority of the codecs is EVS, AMRWB, AMRNB, DTMF WB, DTMF NB
+ * from highest to lowest. In each individual codec, the priority is determined
+ * by the order of the payload types from highest to lowest.
+ *
+ * <p>Possible keys in this bundle are,
+ * <UL>
+ * <LI>{@link #KEY_EVS_PAYLOAD_TYPE_INT_ARRAY}</LI>
+ * <LI>{@link #KEY_AMRWB_PAYLOAD_TYPE_INT_ARRAY}</LI>
+ * <LI>{@link #KEY_AMRNB_PAYLOAD_TYPE_INT_ARRAY}</LI>
+ * <LI>{@link #KEY_DTMFWB_PAYLOAD_TYPE_INT_ARRAY}</LI>
+ * <LI>{@link #KEY_DTMFNB_PAYLOAD_TYPE_INT_ARRAY}</LI>
+ * </UL>
+ * <p>To specify payload descriptions for each of the audio payload types, see
+ * <UL>
+ * <LI>{@link #KEY_EVS_PAYLOAD_DESCRIPTION_BUNDLE}</LI>
+ * <LI>{@link #KEY_AMRNB_PAYLOAD_DESCRIPTION_BUNDLE}</LI>
+ * <LI>{@link #KEY_AMRWB_PAYLOAD_DESCRIPTION_BUNDLE}</LI>
+ * </UL>
+ */
+ public static final String KEY_AUDIO_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE =
+ KEY_PREFIX + "audio_codec_capability_payload_types_bundle";
+
+ /**
+ * A list of integers representing the different payload types
+ * in EVS codec in priority order from highest to lowest.
+ * <p>Payload type is an integer in dynamic payload type range 96-127
+ * as per RFC RFC 3551 Section 6.
+ */
+ public static final String KEY_EVS_PAYLOAD_TYPE_INT_ARRAY =
+ KEY_PREFIX + "evs_payload_type_int_array";
+
+ /**
+ * A list of integers representing the different payload types
+ * in AMR-WB codec in priority order from highest to lowest.
+ * <p>Payload type is an integer in dynamic payload type range 96-127
+ * as per RFC RFC 3551 Section 6.
+ */
+ public static final String KEY_AMRWB_PAYLOAD_TYPE_INT_ARRAY =
+ KEY_PREFIX + "amrwb_payload_type_int_array";
+
+ /**
+ * A list of integers representing the different payload types
+ * in AMR-NB codec in priority order from highest to lowest.
+ * <p>Payload type is an integer in dynamic payload type range 96-127
+ * as per RFC RFC 3551 Section 6.
+ */
+ public static final String KEY_AMRNB_PAYLOAD_TYPE_INT_ARRAY =
+ KEY_PREFIX + "amrnb_payload_type_int_array";
+
+ /**
+ * A list of integers representing the different payload types
+ * in DTMF WB codec in priority order from highest to lowest.
+ * <p>Payload type is an integer in dynamic payload type range 96-127
+ * as per RFC RFC 3551 Section 6.
+ */
+ public static final String KEY_DTMFWB_PAYLOAD_TYPE_INT_ARRAY =
+ KEY_PREFIX + "dtmfwb_payload_type_int_array";
+
+ /**
+ * A list of integers representing the different payload types
+ * in DTMF NB codec in priority order from highest to lowest.
+ * <p>Payload type is an integer in dynamic payload type range 96-127
+ * as per RFC RFC 3551 Section 6.
+ */
+ public static final String KEY_DTMFNB_PAYLOAD_TYPE_INT_ARRAY =
+ KEY_PREFIX + "dtmfnb_payload_type_int_array";
+
+ /** @hide */
+ @IntDef({
+ BANDWIDTH_EFFICIENT,
+ OCTET_ALIGNED
+ })
+
+ public @interface AmrPayloadFormat {}
+
+ /** AMR NB/WB Payload format is bandwidth-efficient. */
+ public static final int BANDWIDTH_EFFICIENT = 0;
+
+ /** AMR NB/WB Payload format is octet-aligned. */
+ public static final int OCTET_ALIGNED = 1;
+
+ /**
+ * Specifies the payload format of the AMR-NB/AMR-WB codec.
+ *
+ * <p>Possible values are,
+ * {@link #BANDWIDTH_EFFICIENT},
+ * {@link #OCTET_ALIGNED}
+
+ * <p>If value is not specified, payload format is
+ * {@link #BANDWIDTH_EFFICIENT}.
+ *
+ * <p>Reference: RFC 4867 Section 8.1.
+ */
+ public static final String KEY_AMR_CODEC_ATTRIBUTE_PAYLOAD_FORMAT_INT =
+ KEY_PREFIX + "amr_codec_attribute_payload_format_int";
+
+ /**
+ * Restricts the active mode set to a subset of all modes in the codec.
+ *
+ * <p>This attribute is optional. If value is set, then session mode
+ * set is restricted to the modes specified in this list. If this value
+ * is not specified, then all available modes in the codec are allowed.
+ * This attribute is applicable for AMR-WB, AMR-NB,
+ * and EVS codec (operating in AMR-WB IO Mode).
+ *
+ * <p>Possible values are subset of,
+ * [0,1,2,3,4,5,6,7,8] - AMRWB with the modes representing nine speech codec modes
+ * with bit rates of 6.6, 8.85, 12.65, 14.25, 15.85, 18.25, 19.85, 23.05, 23.85 kbps.
+ * [0,1,2,3,4,5,6,7] - AMRNB with the modes representing eight speech codec modes
+ * with bit rates of 4.75, 5.15, 5.90, 6.70, 7.40, 7.95, 10.2, 12.2 kbps.
+ *
+ * <p>If value is not specified, then it means device supports all
+ * modes in the codec but not included in SDP.
+ *
+ * <p>Reference: RFC 4867 Section 8.1, 3GPP 26.445 A.3.1
+ */
+ public static final String KEY_AMR_CODEC_ATTRIBUTE_MODESET_INT_ARRAY =
+ KEY_PREFIX + "amr_codec_attribute_modeset_int_array";
+
+ /**
+ * Specifies the codec attributes of different payload types in
+ * the AMR NarrowBand (AMR-NB) codec.
+ *
+ * <p> The keys in this bundle are payload types specified
+ * in {@link #KEY_AMRNB_PAYLOAD_TYPE_INT_ARRAY}.
+ *
+ * <p>Codec attributes allowed as part of AMR-NB codec bundle are,
+ * <UL>
+ * <LI>{@link #KEY_AMR_CODEC_ATTRIBUTE_PAYLOAD_FORMAT_INT}</LI>
+ * <LI>{@link #KEY_AMR_CODEC_ATTRIBUTE_MODESET_INT_ARRAY}</LI>
+ * </UL>
+ *
+ * <p> If this bundle is not configured and AMRNB payload type is added
+ * in {@link #KEY_AMRNB_PAYLOAD_TYPE_INT_ARRAY}, then default
+ * values as in the individual codec attribute to be used
+ * for that payload type.
+ */
+ public static final String KEY_AMRNB_PAYLOAD_DESCRIPTION_BUNDLE =
+ KEY_PREFIX + "amrnb_payload_description_bundle";
+
+ /**
+ * Specifies the codec attributes of different payload types in
+ * the AMR WideBand (AMR-WB) codec.
+ *
+ * <p> The keys in this bundle are payload types specified
+ * in {@link #KEY_AMRWB_PAYLOAD_TYPE_INT_ARRAY}.
+ *
+ * <p>Codec attributes allowed as part of AMR-NB codec bundle are,
+ * <UL>
+ * <LI>{@link #KEY_AMR_CODEC_ATTRIBUTE_PAYLOAD_FORMAT_INT}</LI>
+ * <LI>{@link #KEY_AMR_CODEC_ATTRIBUTE_MODESET_INT_ARRAY}</LI>
+ * </UL>
+ *
+ * <p> If this bundle is not configured and AMRWB payload type is added
+ * in {@link #KEY_AMRWB_PAYLOAD_TYPE_INT_ARRAY}, then default
+ * values as in the individual codec attribute to be used
+ * for that payload type.
+ */
+ public static final String KEY_AMRWB_PAYLOAD_DESCRIPTION_BUNDLE =
+ KEY_PREFIX + "amrwb_payload_description_bundle";
+
+ /** @hide */
+ @IntDef({
+ EVS_OPERATIONAL_MODE_PRIMARY,
+ EVS_OPERATIONAL_MODE_AMRWB_IO
+ })
+
+ public @interface EvsOperationalMode {}
+
+ /** Indicates the EVS primary mode. 3GPP 26.445 Section 3.1 */
+ public static final int EVS_OPERATIONAL_MODE_PRIMARY = 0;
+
+ /** Indicates the EVS AMR-WB IO mode. 3GPP 26.445 Section 3.1 */
+ public static final int EVS_OPERATIONAL_MODE_AMRWB_IO = 1;
+
+ /**
+ * Specifies if the EVS mode used is EVS primary mode
+ * or EVS AMR-WB IO mode.
+ *
+ * <p>Possible values are,
+ * {@link #EVS_OPERATIONAL_MODE_PRIMARY},
+ * {@link #EVS_OPERATIONAL_MODE_AMRWB_IO}
+ *
+ * <p>If this is not present, then {@link #EVS_OPERATIONAL_MODE_PRIMARY} is used.
+ * <p>Reference: 3GPP 26.445 Section 3.1.
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_MODE_SWITCH_INT =
+ KEY_PREFIX + "evs_codec_attribute_mode_switch_int";
+
+ /** @hide */
+ @IntDef({
+ EVS_ENCODED_BW_TYPE_NB,
+ EVS_ENCODED_BW_TYPE_WB,
+ EVS_ENCODED_BW_TYPE_SWB,
+ EVS_ENCODED_BW_TYPE_FB,
+ EVS_ENCODED_BW_TYPE_NB_WB,
+ EVS_ENCODED_BW_TYPE_NB_WB_SWB,
+ EVS_ENCODED_BW_TYPE_NB_WB_SWB_FB,
+ EVS_ENCODED_BW_TYPE_WB_SWB,
+ EVS_ENCODED_BW_TYPE_WB_SWB_FB
+ })
+
+ public @interface EvsEncodedBwType {}
+
+ /**
+ * EVS encoded Bandwidth is Narrow Band (NB).
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_NB = 0;
+
+ /**
+ * EVS encoded Bandwidth is Wide Band (WB).
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_WB = 1;
+
+ /**
+ * EVS encoded Bandwidth is Super WideBand (SWB).
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_SWB = 2;
+
+ /**
+ * EVS encoded Bandwidth is Full Band (FB).
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_FB = 3;
+
+ /**
+ * EVS encoded Bandwidth is in the range NB,WB.
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_NB_WB = 4;
+
+ /**
+ * EVS encoded Bandwidth is in the range NB,WB,SWB.
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_NB_WB_SWB = 5;
+
+ /**
+ * EVS encoded Bandwidth is in the range NB,WB,SWB,FB.
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_NB_WB_SWB_FB = 6;
+
+ /**
+ * EVS encoded Bandwidth is in the range WB,SWB.
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_WB_SWB = 7;
+
+ /**
+ * EVS encoded Bandwidth is in the range WB,SWB,FB.
+ * Reference: 3GPP 26.441 Table 1.
+ */
+ public static final int EVS_ENCODED_BW_TYPE_WB_SWB_FB = 8;
+
+ /**
+ * Specifies the EVS codec encoding bandwidth options.
+ *
+ * Possible values are,
+ * {@link #EVS_ENCODED_BW_TYPE_NB},
+ * {@link #EVS_ENCODED_BW_TYPE_WB},
+ * {@link #EVS_ENCODED_BW_TYPE_SWB},
+ * {@link #EVS_ENCODED_BW_TYPE_FB},
+ * {@link #EVS_ENCODED_BW_TYPE_NB_WB},
+ * {@link #EVS_ENCODED_BW_TYPE_NB_WB_SWB},
+ * {@link #EVS_ENCODED_BW_TYPE_NB_WB_SWB_FB},
+ * {@link #EVS_ENCODED_BW_TYPE_WB_SWB},
+ * {@link #EVS_ENCODED_BW_TYPE_WB_SWB_FB}
+ *
+ * If this key is not specified, then the behavior is same as
+ * value {@link #EVS_ENCODED_BW_TYPE_NB_WB_SWB}
+ *
+ * <p>Reference: 3GPP 26.441 Table 1.
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_BANDWIDTH_INT =
+ KEY_PREFIX + "evs_codec_attribute_bandwidth_int";
+
+ /** @hide */
+ @IntDef({
+ EVS_PRIMARY_MODE_BITRATE_5_9_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_7_2_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_8_0_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_9_6_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_13_2_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_16_4_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_24_4_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_32_0_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_48_0_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_64_0_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_96_0_KBPS,
+ EVS_PRIMARY_MODE_BITRATE_128_0_KBPS
+ })
+
+ public @interface EvsPrimaryModeBitRate {}
+
+ /** EVS primary mode with bitrate 5.9 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_5_9_KBPS = 0;
+
+ /** EVS primary mode with bitrate 7.2 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_7_2_KBPS = 1;
+
+ /** EVS primary mode with bitrate 8.0 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_8_0_KBPS = 2;
+
+ /** EVS primary mode with bitrate 9.6 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_9_6_KBPS = 3;
+
+ /** EVS primary mode with bitrate 13.2 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_13_2_KBPS = 4;
+
+ /** EVS primary mode with bitrate 16.4 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_16_4_KBPS = 5;
+
+ /** EVS primary mode with bitrate 24.4 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_24_4_KBPS = 6;
+
+ /** EVS primary mode with bitrate 32.0 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_32_0_KBPS = 7;
+
+ /** EVS primary mode with bitrate 48.0 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_48_0_KBPS = 8;
+
+ /** EVS primary mode with bitrate 64.0 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_64_0_KBPS = 9;
+
+ /** EVS primary mode with bitrate 96.0 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_96_0_KBPS = 10;
+
+ /** EVS primary mode with bitrate 128.0 kbps */
+ public static final int EVS_PRIMARY_MODE_BITRATE_128_0_KBPS = 11;
+
+ /**
+ * Specifies the range of source codec bit-rate for EVS Primary mode
+ * in the session. This is expressed in kilobits per second and
+ * applicable for both the send and the receive directions.
+ *
+ * <p>The range is specified as integer aray of size 2,
+ * represented as [low, high], where low <= high
+ *
+ * <p>Possible values for low and high are,
+ * {@link #EVS_PRIMARY_MODE_BITRATE_5_9_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_7_2_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_8_0_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_9_6_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_13_2_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_16_4_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_24_4_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_32_0_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_48_0_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_64_0_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_96_0_KBPS},
+ * {@link #EVS_PRIMARY_MODE_BITRATE_128_0_KBPS}
+ *
+ * If this key is not specified, then the behavior is same as
+ * value {@link #EVS_PRIMARY_MODE_BITRATE_24_4_KBPS}
+ *
+ * <p>Reference: 3GPP 26.445 Section A.3.1
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_BITRATE_INT_ARRAY =
+ KEY_PREFIX + "evs_codec_attribute_bitrate_int_array";
+
+ /**
+ * Specifies the Channel aware mode (ch-aw-recv) for the receive direction.
+ * This is applicable for EVS codec.
+ *
+ * <p>Permissible values are -1, 0, 2, 3, 5, and 7.
+ * If this key is not specified, then the behavior is same as value 0
+ * (channel aware mode disabled).
+ * <p> If this key is configured, then device is expected to send
+ * this parameter in the SDP offer.
+ *
+ * <p>Reference: 3GPP TS 26.445 section 4.4.5, 3GPP 26.445 Section A.3.1
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_CH_AW_RECV_INT =
+ KEY_PREFIX + "evs_codec_attribute_ch_aw_recv_int";
+
+ /**
+ * Specifies whether to limit the session to header-full format.
+ * This applies to both directions in the session. This attribute
+ * is applicable for EVS codec.
+ *
+ * <p>Permissible values are 0, 1
+ * If hf-only is 1, only Header-Full format is used and hf-only is
+ * included in the SDP.
+ * <p>If hf-only is 0, both Compact and Header-Full formats are used
+ * and hf-only is included in the SDP.
+ * <p>If this key is not present, then both Compact
+ * and Header-Full formats are used and hf-only is not included in
+ * the SDP.
+ * <p> If this key is configured, then device is expected to send
+ * this parameter in the SDP offer if operator required it.
+ *
+ * <p>Reference: 3GPP 26.445 Section A.3.1.
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_HF_ONLY_INT =
+ KEY_PREFIX + "evs_codec_attribute_hf_only_int";
+
+ /**
+ * Specifies whether DTX (Discontinuous transmission) is enabled
+ * or not. This applies to both directions in the session.
+ * This attribute is applicable for EVS codec and can be used
+ * in both EVS Primary mode and EVS AMR-WB IO mode.
+ *
+ * <p>If {@code true}: Indicates DTX is enabled.
+ * If {@code false}: Indicates DTX is disabled.
+ *
+ * <p>If this is not present, then default value of {@code true}
+ * will apply.
+ * <p>Reference: 3GPP TS 26.445 Section A.3.1.
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_DTX_BOOL =
+ KEY_PREFIX + "evs_codec_attribute_dtx_bool";
+
+ /**
+ * This is used if further restriction is required on DTX in the
+ * receive direction. This attribute is applicable for EVS codec
+ * and can be used in both EVS Primary mode and EVS AMR-WB IO mode.
+ *
+ * <p> If this value is true or not present, then DTX setting is
+ * dependent on {@link #KEY_EVS_CODEC_ATTRIBUTE_DTX_BOOL}.
+ *
+ * <p> If this is not present, then default value of {@code true}
+ * will apply.
+ *
+ * <p>Reference: 3GPP TS 26.445 Section A.3.1.
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_DTX_RECV_BOOL =
+ KEY_PREFIX + "evs_codec_attribute_dtx_recv_bool";
+
+ /**
+ * Specifies the number of audio channels.
+ * If this is not present, then default value of 1 will apply.
+ *
+ * <p>Reference: RFC 3551
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_CHANNELS_INT =
+ KEY_PREFIX + "evs_codec_attribute_channels_int";
+
+ /**
+ * Indicates whether the Codec Mode Request (CMR) is supported
+ * for the session.
+ * This attribute is applicable for EVS codec in Primary Mode only.
+ *
+ * <p>Possible values are -1, 0, 1. If this key is not present,
+ * then behavior as per value 0 is applicable.
+ *
+ * <p>Reference: 3GPP 26.445 Section A.3.1, 3GPP 26.114 Table 6.2a
+ */
+ public static final String KEY_EVS_CODEC_ATTRIBUTE_CMR_INT =
+ KEY_PREFIX + "codec_attribute_cmr_int";
+
+ /**
+ * Specifies the number of frame-blocks. This indicates the frame-block period
+ * at which codec mode changes are allowed for the sender. This attribute is
+ * applicable for EVS codec in AMR-WB IO mode and AMR-WB.
+ *
+ * <p>Possible values are 1, 2.
+ * If the key is not present, behavior as per value 1 is applicable and this
+ * parameter is not included in SDP.
+ *
+ * <p>Reference: RFC 4867 Section 8.1.
+ */
+ public static final String KEY_CODEC_ATTRIBUTE_MODE_CHANGE_PERIOD_INT =
+ KEY_PREFIX + "codec_attribute_mode_change_period_int";
+
+ /**
+ * Specifies if the client is capable to transmit with a restricted mode
+ * change period. This attribute is applicable for EVS codec in
+ * AMR-WB IO mode and AMR-WB.
+ *
+ * <p>Possible values are 1, 2. If this key is not present,
+ * then behavior as per value 1 is applicable and this
+ * parameter is not included in SDP.
+ *
+ * <p>Reference: RFC 4867 Section 8.1.
+ */
+ public static final String KEY_CODEC_ATTRIBUTE_MODE_CHANGE_CAPABILITY_INT =
+ KEY_PREFIX + "codec_attribute_mode_change_capability_int";
+
+ /**
+ * Specifies the allowed mode changes for the sender in the active mode set.
+ * This attribute is applicable for EVS codec in AMR-WB IO mode
+ * and AMR-WB.
+ *
+ * <p>Possible values are 0, 1. If value is 1, then the sender should only
+ * perform mode changes to the neighboring modes in the active codec mode set.
+ * If value is 0, then mode changes between any two modes
+ * in the active codec mode set is allowed.
+ * If the key is not present, behavior as per value 0 is applicable and this
+ * parameter is not included in SDP.
+ *
+ * <p>Reference: RFC 4867 Section 8.1.
+ */
+ public static final String KEY_CODEC_ATTRIBUTE_MODE_CHANGE_NEIGHBOR_INT =
+ KEY_PREFIX + "codec_attribute_mode_change_neighbor_int";
+
+ /**
+ * Specifies the codec attributes of different payload types in
+ * the EVS codec.
+ *
+ * <p> The keys in this bundle are payload types specified
+ * in {@link #KEY_EVS_PAYLOAD_TYPE_INT_ARRAY}.
+ *
+ * <p>Codec attributes allowed as part of EVS codec are,
+ * <UL>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_BANDWIDTH_INT}</LI>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_BITRATE_INT_ARRAY}</LI>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_CH_AW_RECV_INT}</LI>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_HF_ONLY_INT}</LI>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_DTX_BOOL}</LI>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_DTX_RECV_BOOL}</LI>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_MODE_SWITCH_INT}</LI>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_CMR_INT}</LI>
+ * <LI>{@link #KEY_EVS_CODEC_ATTRIBUTE_CHANNELS_INT}</LI>
+ * <LI>{@link #KEY_CODEC_ATTRIBUTE_MODE_CHANGE_PERIOD_INT}</LI>
+ * <LI>{@link #KEY_CODEC_ATTRIBUTE_MODE_CHANGE_CAPABILITY_INT}</LI>
+ * <LI>{@link #KEY_CODEC_ATTRIBUTE_MODE_CHANGE_NEIGHBOR_INT}</LI>
+ * </UL>
+ */
+ public static final String KEY_EVS_PAYLOAD_DESCRIPTION_BUNDLE =
+ KEY_PREFIX + "evs_payload_description_bundle";
+
+ private static PersistableBundle getDefaults() {
+ PersistableBundle defaults = new PersistableBundle();
+ defaults.putBoolean(KEY_CARRIER_VOLTE_ROAMING_AVAILABLE_BOOL, true);
+ defaults.putBoolean(KEY_INCLUDE_CALLER_ID_SERVICE_CODES_IN_SIP_INVITE_BOOL, false);
+ defaults.putBoolean(KEY_MULTIENDPOINT_SUPPORTED_BOOL, false);
+ defaults.putBoolean(KEY_SESSION_TIMER_SUPPORTED_BOOL, true);
+ defaults.putBoolean(KEY_OIP_SOURCE_FROM_HEADER_BOOL, false);
+ defaults.putBoolean(KEY_PRACK_SUPPORTED_FOR_18X_BOOL, true);
+ defaults.putBoolean(KEY_VOICE_QOS_PRECONDITION_SUPPORTED_BOOL, true);
+ defaults.putBoolean(KEY_VOICE_ON_DEFAULT_BEARER_SUPPORTED_BOOL, false);
+
+ defaults.putInt(KEY_SESSION_REFRESHER_TYPE_INT, SESSION_REFRESHER_TYPE_UNKNOWN);
+ defaults.putInt(KEY_SESSION_REFRESH_METHOD_INT,
+ SESSION_REFRESH_METHOD_UPDATE_PREFERRED);
+ defaults.putInt(KEY_CONFERENCE_SUBSCRIBE_TYPE_INT,
+ CONFERENCE_SUBSCRIBE_TYPE_OUT_OF_DIALOG);
+ defaults.putInt(KEY_AUDIO_RTP_INACTIVITY_TIMER_MILLIS_INT, 20000);
+ defaults.putInt(KEY_AUDIO_RTCP_INACTIVITY_TIMER_MILLIS_INT, 20000);
+ defaults.putInt(KEY_DEDICATED_BEARER_WAIT_TIMER_MILLIS_INT, 8000);
+ defaults.putInt(KEY_RINGING_TIMER_MILLIS_INT, 90000);
+ defaults.putInt(KEY_RINGBACK_TIMER_MILLIS_INT, 90000);
+ defaults.putInt(KEY_MO_CALL_REQUEST_TIMEOUT_MILLIS_INT, 5000);
+ defaults.putInt(KEY_SESSION_EXPIRES_TIMER_SEC_INT, 1800);
+ defaults.putInt(KEY_MINIMUM_SESSION_EXPIRES_TIMER_SEC_INT, 90);
+ defaults.putInt(KEY_AUDIO_AS_BANDWIDTH_KBPS_INT, 41);
+ defaults.putInt(KEY_AUDIO_RS_BANDWIDTH_BPS_INT, 600);
+ defaults.putInt(KEY_AUDIO_RR_BANDWIDTH_BPS_INT, 2000);
+
+ defaults.putIntArray(
+ KEY_AUDIO_INACTIVITY_CALL_END_REASONS_INT_ARRAY,
+ new int[] {
+ Ims.RTCP_INACTIVITY_ON_CONNECTED,
+ Ims.RTP_INACTIVITY_ON_CONNECTED
+ });
+
+ defaults.putIntArray(
+ KEY_SRVCC_TYPE_INT_ARRAY,
+ new int[] {
+ BASIC_SRVCC_SUPPORT,
+ ALERTING_SRVCC_SUPPORT,
+ PREALERTING_SRVCC_SUPPORT,
+ MIDCALL_SRVCC_SUPPORT
+ });
+
+ defaults.putString(KEY_CONFERENCE_FACTORY_URI_STRING, "");
+
+ PersistableBundle audio_codec_capability_payload_types = new PersistableBundle();
+
+ audio_codec_capability_payload_types.putIntArray(
+ KEY_AMRWB_PAYLOAD_TYPE_INT_ARRAY,
+ new int[] { 97, 98 });
+
+ audio_codec_capability_payload_types.putIntArray(
+ KEY_AMRNB_PAYLOAD_TYPE_INT_ARRAY,
+ new int[] { 99, 100 });
+
+ audio_codec_capability_payload_types.putIntArray(
+ KEY_DTMFWB_PAYLOAD_TYPE_INT_ARRAY,
+ new int[] { 101 });
+
+ audio_codec_capability_payload_types.putIntArray(
+ KEY_DTMFNB_PAYLOAD_TYPE_INT_ARRAY,
+ new int[] { 102 });
+
+ defaults.putPersistableBundle(
+ KEY_AUDIO_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE,
+ audio_codec_capability_payload_types);
+
+ /* Setting defaults for AMRWB */
+ PersistableBundle all_amrwb_payload_bundles = new PersistableBundle();
+ PersistableBundle amrwb_bundle_instance1 = new PersistableBundle();
+
+ all_amrwb_payload_bundles.putPersistableBundle(
+ "97", /* Same value of payload type as in KEY_AMRWB_PAYLOAD_TYPE_INT_ARRAY */
+ amrwb_bundle_instance1);
+
+ PersistableBundle amrwb_bundle_instance2 = new PersistableBundle();
+
+ amrwb_bundle_instance2.putInt(KEY_AMR_CODEC_ATTRIBUTE_PAYLOAD_FORMAT_INT,
+ OCTET_ALIGNED);
+
+ all_amrwb_payload_bundles.putPersistableBundle(
+ "98", /* Same value of payload type as in KEY_AMRWB_PAYLOAD_TYPE_INT_ARRAY */
+ amrwb_bundle_instance2);
+
+ defaults.putPersistableBundle(
+ KEY_AMRWB_PAYLOAD_DESCRIPTION_BUNDLE,
+ all_amrwb_payload_bundles);
+
+ /* Setting defaults for AMRNB */
+ PersistableBundle all_amrnb_payload_bundles = new PersistableBundle();
+ PersistableBundle amrnb_bundle_instance1 = new PersistableBundle();
+
+ all_amrnb_payload_bundles.putPersistableBundle(
+ "99", /* Same value of payload type as in KEY_AMRNB_PAYLOAD_TYPE_INT_ARRAY */
+ amrnb_bundle_instance1);
+
+ PersistableBundle amrnb_bundle_instance2 = new PersistableBundle();
+
+ amrnb_bundle_instance2.putInt(KEY_AMR_CODEC_ATTRIBUTE_PAYLOAD_FORMAT_INT,
+ OCTET_ALIGNED);
+
+ all_amrnb_payload_bundles.putPersistableBundle(
+ "100", /* Same value of payload type as in KEY_AMRNB_PAYLOAD_TYPE_INT_ARRAY */
+ amrnb_bundle_instance2);
+
+ defaults.putPersistableBundle(
+ KEY_AMRNB_PAYLOAD_DESCRIPTION_BUNDLE,
+ all_amrnb_payload_bundles);
+
+ return defaults;
+ }
+ }
+
+ /**
+ * IMS SMS configs. This groups the configs specific for SMS over IMS
+ */
+ public static final class ImsSms {
+ private ImsSms() {}
+
+ /** Prefix of all imssms.KEY_* constants. */
+ public static final String KEY_PREFIX = "imssms.";
+
+ /**
+ * Flag specifying if SMS over IMS support is available or not.
+ *
+ * <p>If {@code true}: SMS over IMS support available.
+ * {@code false}: otherwise.
+ */
+ public static final String KEY_SMS_OVER_IMS_SUPPORTED_BOOL =
+ KEY_PREFIX + "sms_over_ims_supported_bool";
+
+ /**
+ * Flag specifying whether to allow SMS CSFB in case of
+ * SMS over PS failure.
+ *
+ * <p>If {@code true}: allow SMS CSFB in case of SMS over PS failure.
+ * {@code false} otherwise.
+ */
+ public static final String KEY_SMS_CSFB_RETRY_ON_FAILURE_BOOL =
+ KEY_PREFIX + "sms_csfb_retry_on_failure_bool";
+
+ /** @hide */
+ @IntDef({
+ SMS_FORMAT_3GPP,
+ SMS_FORMAT_3GPP2
+ })
+
+ public @interface SmsFormat {}
+
+ /** SMS format is 3GPP. */
+ public static final int SMS_FORMAT_3GPP = 0;
+
+ /** SMS format is 3GPP2. */
+ public static final int SMS_FORMAT_3GPP2 = 1;
+
+ /**
+ * Specifies the SMS over IMS format.
+ *
+ * <p>Possible values are,
+ * {@link #SMS_FORMAT_3GPP},
+ * {@link #SMS_FORMAT_3GPP2}
+ */
+ public static final String KEY_SMS_OVER_IMS_FORMAT_INT =
+ KEY_PREFIX + "sms_over_ims_format_int";
+
+ /**
+ * List of different RAT technologies on which SMS over IMS
+ * is supported.
+ *
+ * <p>Possible values are,
+ * {@link AccessNetworkConstants.AccessNetworkType#NGRAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#EUTRAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#IWLAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#UTRAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#GERAN}
+ */
+ public static final String KEY_SMS_OVER_IMS_SUPPORTED_RATS_INT_ARRAY =
+ KEY_PREFIX + "sms_over_ims_supported_rats_int_array";
+
+ private static PersistableBundle getDefaults() {
+ PersistableBundle defaults = new PersistableBundle();
+ defaults.putBoolean(KEY_SMS_OVER_IMS_SUPPORTED_BOOL, true);
+ defaults.putBoolean(KEY_SMS_CSFB_RETRY_ON_FAILURE_BOOL, true);
+
+ defaults.putInt(KEY_SMS_OVER_IMS_FORMAT_INT, SMS_FORMAT_3GPP);
+
+ defaults.putIntArray(
+ KEY_SMS_OVER_IMS_SUPPORTED_RATS_INT_ARRAY,
+ new int[] {
+ AccessNetworkType.EUTRAN,
+ AccessNetworkType.IWLAN
+ });
+
+ return defaults;
+ }
+ }
+
+ /**
+ * IMS RTT configs. This groups the configs specific for text media,
+ * RTT (Real Time Text).
+ */
+ public static final class ImsRtt {
+ private ImsRtt() {}
+
+ /** Prefix of all imsrtt.KEY_* constants. */
+ public static final String KEY_PREFIX = "imsrtt.";
+
+ /**
+ * Flag specifying whether text media is allowed on default bearer.
+ *
+ * <p>If {@code true}: text media can be sent on default bearer.
+ * {@code false} otherwise.
+ */
+ public static final String KEY_TEXT_ON_DEFAULT_BEARER_SUPPORTED_BOOL =
+ KEY_PREFIX + "text_on_default_bearer_supported_bool";
+
+ /**
+ * Flag specifying whether QoS preconditions are supported for text.
+ *
+ * <p>If {@code true}: QoS Preconditions are supported.
+ * {@code false} otherwise.
+ * <p>Reference: 3GPP TS 24.229
+ */
+ public static final String KEY_TEXT_QOS_PRECONDITION_SUPPORTED_BOOL =
+ KEY_PREFIX + "text_qos_precondition_supported_bool";
+
+ /**
+ * Specifies the AS (Application Specific) SDP modifier for text media.
+ *
+ * <p>Expressed in kilobits per second as per RFC 3556 Section 2.
+ */
+ public static final String KEY_TEXT_AS_BANDWIDTH_KBPS_INT =
+ KEY_PREFIX + "text_as_bandwidth_kbps_int";
+
+ /**
+ * Specifies the RS (RTCP bandwidth-Sender) SDP modifier for text media.
+ *
+ * <p>This indicates the RTCP bandwidth allocated to active data senders
+ * for text media.
+ *
+ * <p>Expressed in bits per second as per RFC 3556 Section 2.
+ */
+ public static final String KEY_TEXT_RS_BANDWIDTH_BPS_INT =
+ KEY_PREFIX + "text_rs_bandwidth_bps_int";
+
+ /**
+ * Specifies the RR (RTCP bandwidth-Receiver) SDP modifier for
+ * text media.
+ *
+ * <p>This indicates the RTCP bandwidth allocated to receivers
+ * for text media.
+ *
+ * <p>Expressed in bits per second as per RFC 3556 Section 2.
+ */
+ public static final String KEY_TEXT_RR_BANDWIDTH_BPS_INT =
+ KEY_PREFIX + "text_rr_bandwidth_bps_int";
+
+ /**
+ * List of various reasons for RTT call to end due to
+ * media inactivity.
+ *
+ * <p>Possible values are,
+ * <UL>
+ * <LI>{@link Ims#RTCP_INACTIVITY_ON_HOLD}</LI>
+ * <LI>{@link Ims#RTCP_INACTIVITY_ON_CONNECTED}</LI>
+ * <LI>{@link Ims#RTP_INACTIVITY_ON_CONNECTED}</LI>
+ * <LI>{@link Ims#E911_RTCP_INACTIVITY_ON_CONNECTED}</LI>
+ * <LI>{@link Ims#E911_RTP_INACTIVITY_ON_CONNECTED}</LI>
+ * </UL>
+ */
+ public static final String KEY_TEXT_INACTIVITY_CALL_END_REASONS_INT_ARRAY =
+ KEY_PREFIX + "text_inactivity_call_end_reasons_int_array";
+
+ /**
+ * Specifies the Text Codec capability.
+ *
+ * <p>Possible keys in this bundle are,
+ * <UL>
+ * <LI>{@link #KEY_T140_PAYLOAD_TYPE_INT}</LI>
+ * <LI>{@link #KEY_RED_PAYLOAD_TYPE_INT}</LI>
+ * </UL>
+ */
+ public static final String KEY_TEXT_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE =
+ KEY_PREFIX + "text_codec_capability_payload_types_bundle";
+
+ /** Integer representing payload type for T140 codec.
+ * <p>Payload type is an integer in dynamic payload type range 96-127
+ * as per RFC RFC 3551 Section 6.
+ */
+ public static final String KEY_T140_PAYLOAD_TYPE_INT =
+ KEY_PREFIX + "t140_payload_type_int";
+
+ /** Integer representing payload type for RED/redundancy codec.
+ * <p>Payload type is an integer in dynamic payload type range 96-127
+ * as per RFC RFC 3551 Section 6.
+ */
+ public static final String KEY_RED_PAYLOAD_TYPE_INT =
+ KEY_PREFIX + "red_payload_type_int";
+
+ private static PersistableBundle getDefaults() {
+ PersistableBundle defaults = new PersistableBundle();
+ defaults.putBoolean(KEY_TEXT_ON_DEFAULT_BEARER_SUPPORTED_BOOL, false);
+ defaults.putBoolean(KEY_TEXT_QOS_PRECONDITION_SUPPORTED_BOOL, true);
+
+ defaults.putInt(KEY_TEXT_AS_BANDWIDTH_KBPS_INT, 4);
+ defaults.putInt(KEY_TEXT_RS_BANDWIDTH_BPS_INT, 100);
+ defaults.putInt(KEY_TEXT_RR_BANDWIDTH_BPS_INT, 300);
+
+ defaults.putIntArray(
+ KEY_TEXT_INACTIVITY_CALL_END_REASONS_INT_ARRAY,
+ new int[] {
+ Ims.RTCP_INACTIVITY_ON_CONNECTED,
+ Ims.RTP_INACTIVITY_ON_CONNECTED
+ });
+
+ PersistableBundle text_codec_capability_payload_types = new PersistableBundle();
+
+ text_codec_capability_payload_types.putInt(
+ KEY_RED_PAYLOAD_TYPE_INT,
+ 112);
+
+ text_codec_capability_payload_types.putInt(
+ KEY_T140_PAYLOAD_TYPE_INT,
+ 111);
+
+ defaults.putPersistableBundle(
+ KEY_TEXT_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE,
+ text_codec_capability_payload_types);
+
+ return defaults;
+ }
+ }
+
+ /**
+ * Emergency Call/E911. This groups the configs specific for emergency call
+ * over IMS.
+ *
+ * <p> Reference: 3GPP 24.229, 3GPP 23.167 Annex H, 3GPP 24.301.
+ */
+ public static final class ImsEmergency {
+ private ImsEmergency() {}
+
+ /** Prefix of all imsemergency.KEY_* constants. */
+ public static final String KEY_PREFIX = "imsemergency.";
+
+ /**
+ * Flag specifying whether UE would retry E911 call on
+ * IMS PDN if emergency PDN setup failed.
+ *
+ * <p>If {@code true}: Allow UE to retry emergency call on
+ * IMS PDN if emergency PDN setup failed.{@code false} otherwise.
+ */
+ public static final String KEY_RETRY_EMERGENCY_ON_IMS_PDN_BOOL =
+ KEY_PREFIX + "retry_emergency_on_ims_pdn_bool";
+
+ /**
+ * Flag specifying whether UE should enter Emergency CallBack Mode(ECBM)
+ * after E911 call is ended.
+ *
+ * <p>If {@code true}: Enter ECBM mode after E911 call is ended.
+ * {@code false} otherwise.
+ */
+ public static final String KEY_EMERGENCY_CALLBACK_MODE_SUPPORTED_BOOL =
+ KEY_PREFIX + "emergency_callback_mode_supported_bool";
+
+ /**
+ * Flag specifying whether QoS preconditions are supported for emergency
+ * call setup.
+ *
+ * <p>If {@code true}: QoS Preconditions are supported.
+ * {@code false} otherwise.
+ *
+ * <p>Reference: 3GPP TS 24.229
+ */
+ public static final String KEY_EMERGENCY_QOS_PRECONDITION_SUPPORTED_BOOL =
+ KEY_PREFIX + "emergency_qos_precondition_supported_bool";
+
+ /**
+ * List of different RAT technologies on which emergency call using IMS
+ * is supported.
+ *
+ * <p>Possible values are,
+ * {@link AccessNetworkConstants.AccessNetworkType#NGRAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#EUTRAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#IWLAN}
+ */
+ public static final String KEY_EMERGENCY_OVER_IMS_SUPPORTED_RATS_INT_ARRAY =
+ KEY_PREFIX + "emergency_over_ims_supported_rats_int_array";
+
+ /**
+ * Specifies the maximum time from deciding that an emergency service is to
+ * be established until completion of the emergency registration procedure.
+ * Upon timer expiry, the UE considers the emergency REGISTER request or
+ * the emergency call attempt as failed.
+ */
+ public static final String KEY_EMERGENCY_REGISTRATION_TIMER_MILLIS_INT =
+ KEY_PREFIX + "emergency_registration_timer_millis_int";
+
+ private static PersistableBundle getDefaults() {
+ PersistableBundle defaults = new PersistableBundle();
+ defaults.putBoolean(KEY_RETRY_EMERGENCY_ON_IMS_PDN_BOOL, false);
+ defaults.putBoolean(KEY_EMERGENCY_CALLBACK_MODE_SUPPORTED_BOOL, false);
+ defaults.putBoolean(KEY_EMERGENCY_QOS_PRECONDITION_SUPPORTED_BOOL, true);
+
+ defaults.putIntArray(
+ KEY_EMERGENCY_OVER_IMS_SUPPORTED_RATS_INT_ARRAY,
+ new int[] {
+ AccessNetworkType.EUTRAN,
+ AccessNetworkType.IWLAN
+ });
+
+ defaults.putInt(KEY_EMERGENCY_REGISTRATION_TIMER_MILLIS_INT, 20000);
+
+ return defaults;
+ }
+ }
+
+ /**
+ * IMS Video Telephony configs. This groups the configs that are specific for video call.
+ */
+ public static final class ImsVt {
+ private ImsVt() {}
+
+ /** Prefix of all imsvt.KEY_* constants. */
+ public static final String KEY_PREFIX = "imsvt.";
+
+ /**
+ * Flag specifying whether video media is allowed on default bearer.
+ *
+ * <p>If {@code true}: video media can be sent on default bearer.
+ * {@code false} otherwise.
+ */
+ public static final String KEY_VIDEO_ON_DEFAULT_BEARER_SUPPORTED_BOOL =
+ KEY_PREFIX + "video_on_default_bearer_supported_bool";
+
+ /**
+ * Specifies the timeout value for no video RTP packets received.
+ * <p>On timer expiry, VT call can downgrade to voice call or end
+ * or continue depending on the operator requirement.
+ */
+ public static final String KEY_VIDEO_RTP_INACTIVITY_TIMER_MILLIS_INT =
+ KEY_PREFIX + "video_rtp_inactivity_timer_millis_int";
+
+ /**
+ * Specifies the timeout value for no video RTCP packets received.
+ * <p>On timer expiry, VT call can downgrade to voice call or end
+ * or continue depending on the operator requirement.
+ */
+ public static final String KEY_VIDEO_RTCP_INACTIVITY_TIMER_MILLIS_INT =
+ KEY_PREFIX + "video_rtcp_inactivity_timer_millis_int";
+
+ /**
+ * Specifies the AS (Application Specific) SDP modifier for video media.
+ *
+ * <p>Expressed in kilobits per second as per RFC 3556 Section 2.
+ */
+ public static final String KEY_VIDEO_AS_BANDWIDTH_KBPS_INT =
+ KEY_PREFIX + "video_as_bandwidth_kbps_int";
+
+ /**
+ * Specifies the RS (RTCP bandwidth-Sender) SDP modifier for video media.
+ *
+ * <p>This indicates the RTCP bandwidth allocated to active data senders
+ * for video media.
+ *
+ * <p>Expressed in bits per second as per RFC 3556 Section 2.
+ */
+ public static final String KEY_VIDEO_RS_BANDWIDTH_BPS_INT =
+ KEY_PREFIX + "video_rs_bandwidth_bps_int";
+
+ /**
+ * Specifies the RR (RTCP bandwidth-Receiver) SDP modifier
+ * for video media.
+ *
+ * <p>This indicates the RTCP bandwidth allocated to receivers
+ * for video media.
+ *
+ * <p>Expressed in bits per second as per RFC 3556 Section 2.
+ */
+ public static final String KEY_VIDEO_RR_BANDWIDTH_BPS_INT =
+ KEY_PREFIX + "video_rr_bandwidth_bps_int";
+
+ /**
+ * Specifies the differentiated services code point (DSCP) value
+ * for Video RTP.
+ *
+ * <p>Reference: RFC 4594 Section 1.4.4
+ */
+ public static final String KEY_VIDEO_RTP_DSCP_INT =
+ KEY_PREFIX + "video_rtp_dscp_int";
+
+ /**
+ * Flag specifying whether QoS preconditions are supported for Video.
+ *
+ * <p>If {@code true}: QoS Preconditions are supported.
+ * {@code false} otherwise.
+ * <p>Reference: 3GPP TS 24.229
+ */
+ public static final String KEY_VIDEO_QOS_PRECONDITION_SUPPORTED_BOOL =
+ KEY_PREFIX + "video_qos_precondition_supported_bool";
+
+ /**
+ * Specifies the Video Codec capability. This contains a list of
+ * payload types representing different Video codec instances.
+
+ * <p>Possible key(s) in this bundle are,
+ * <UL>
+ * <LI>{@link #KEY_H264_PAYLOAD_TYPE_INT_ARRAY}</LI>
+ * </UL>
+ * <p>To specify payload descriptions for each of the payload types, see
+ * <UL>
+ * <LI>{@link #KEY_H264_PAYLOAD_DESCRIPTION_BUNDLE}</LI>
+ * </UL>
+ */
+ public static final String KEY_VIDEO_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE =
+ KEY_PREFIX + "video_codec_capability_payload_types_bundle";
+
+ /**
+ * A list of integers representing the different payload types
+ * in H264 video codec in priority order from highest to lowest.
+ * <p>Payload type is an integer in dynamic payload type range 96-127
+ * as per RFC RFC 3551 Section 6.
+ */
+ public static final String KEY_H264_PAYLOAD_TYPE_INT_ARRAY =
+ KEY_PREFIX + "h264_payload_type_int_array";
+
+ /**
+ * Specifies the codec attributes of different payload types
+ * representing H264 video codec instances.
+ *
+ * <p> The allowed payload types of the video codecs are specified in,
+ * {@link #KEY_H264_PAYLOAD_TYPE_INT_ARRAY}.
+ *
+ * <p>Codec attributes allowed as part of H264 codec bundle are,
+ * <UL>
+ * <LI>{@link #KEY_H264_VIDEO_CODEC_ATTRIBUTE_PROFILE_LEVEL_ID_STRING}</LI>
+ * <LI>{@link #KEY_VIDEO_CODEC_ATTRIBUTE_PACKETIZATION_MODE_INT}</LI>
+ * <LI>{@link #KEY_VIDEO_CODEC_ATTRIBUTE_FRAME_RATE_INT}</LI>
+ * <LI>{@link #KEY_VIDEO_CODEC_ATTRIBUTE_RESOLUTION_INT_ARRAY}</LI>
+ * </UL>
+ *
+ * <p>If this bundle is not configured and
+ * {@link #KEY_H264_PAYLOAD_TYPE_INT_ARRAY} is not empty,
+ * then default values as in the individual codec attributes to
+ * be used for that payload type.
+ * <p>If the codec attributes in a particular codec instance bundle
+ * is not valid together, then that codec instance should not be used.
+ */
+ public static final String KEY_H264_PAYLOAD_DESCRIPTION_BUNDLE =
+ KEY_PREFIX + "h264_payload_description_bundle";
+
+ /**
+ * Specifies the packetization mode of the video codec.
+ *
+ * <p>Permissible values are 0 (Single NAL unit mode),
+ * 1(Non-interleaved mode).
+ *
+ * <p>If this key is not specified or invalid, then the following
+ * default value to be used.
+ * <UL>
+ * <LI>For H264: 1(Non-interleaved mode)</LI>
+ * <UL>
+ *
+ * <p>Reference: RFC 6184 Section 5.4
+ */
+ public static final String KEY_VIDEO_CODEC_ATTRIBUTE_PACKETIZATION_MODE_INT =
+ KEY_PREFIX + "video_codec_attribute_packetization_mode_int";
+
+ /**
+ * Specifies the maximum frame rate the offerer wishes to receive.
+ * This gives the maximum video frame rate in frames/sec.
+ *
+ * <p>If this key is not specified or invalid, then the following
+ * default value to be used.
+ * <UL>
+ * <LI>For H264: 15 </LI>
+ * <UL>
+ * <p>Reference: RFC 4566 Section 6, 3GPP 26.114 Section 6.2.3.2
+ */
+ public static final String KEY_VIDEO_CODEC_ATTRIBUTE_FRAME_RATE_INT =
+ KEY_PREFIX + "video_codec_attribute_frame_rate_int";
+
+ /**
+ * Specifies the maximum resolution allowed for the video codec
+ * instance.
+ *
+ * <p>This is specified as an array of two integers, with
+ * index 0 : Width,
+ * index 1 : Height
+ *
+ * <p>If this key is not specified or invalid as per the video codec,
+ * then the following default value to be used.
+ * <UL>
+ * <LI>For H264: 240 (WIDTH) x 320 (HEIGHT) </LI>
+ * <UL>
+ * <p>Reference: RFC 4566 Section 6, 3GPP 26.114 Section 6.2.3.2
+ *
+ */
+ public static final String KEY_VIDEO_CODEC_ATTRIBUTE_RESOLUTION_INT_ARRAY =
+ KEY_PREFIX + "video_codec_attribute_resolution_int_array";
+
+ /**
+ * Specifies the profile level id of the H264 video codec.
+ * This value is represented as "profile-level-id" in the SDP offer
+ * as per RFC 6184 Section 8.1.
+ *
+ * <p>If this key is not specified or invalid as per the video codec,
+ * then default value of 42C00C to be used.
+ *
+ * <p>Reference: RFC 6184 Section 8.1, ITU-T Recommendation H.264
+ */
+ public static final String KEY_H264_VIDEO_CODEC_ATTRIBUTE_PROFILE_LEVEL_ID_STRING =
+ KEY_PREFIX + "h264_video_codec_attribute_profile_level_id_string";
+
+ private static PersistableBundle getDefaults() {
+ PersistableBundle defaults = new PersistableBundle();
+ defaults.putBoolean(KEY_VIDEO_ON_DEFAULT_BEARER_SUPPORTED_BOOL, false);
+ defaults.putBoolean(KEY_VIDEO_QOS_PRECONDITION_SUPPORTED_BOOL, true);
+
+ defaults.putInt(KEY_VIDEO_RTP_INACTIVITY_TIMER_MILLIS_INT, 0);
+ defaults.putInt(KEY_VIDEO_RTCP_INACTIVITY_TIMER_MILLIS_INT, 0);
+
+ defaults.putInt(KEY_VIDEO_AS_BANDWIDTH_KBPS_INT, 960);
+ defaults.putInt(KEY_VIDEO_RS_BANDWIDTH_BPS_INT, 8000);
+ defaults.putInt(KEY_VIDEO_RR_BANDWIDTH_BPS_INT, 6000);
+ defaults.putInt(KEY_VIDEO_RTP_DSCP_INT, 40);
+
+ PersistableBundle video_codec_capability_payload_types = new PersistableBundle();
+
+ video_codec_capability_payload_types.putIntArray(
+ KEY_H264_PAYLOAD_TYPE_INT_ARRAY,
+ new int[] { 99, 100 });
+
+ defaults.putPersistableBundle(
+ KEY_VIDEO_CODEC_CAPABILITY_PAYLOAD_TYPES_BUNDLE,
+ video_codec_capability_payload_types);
+
+ PersistableBundle all_h264_payload_bundles = new PersistableBundle();
+
+ /* Setting default codec attributes for individual H264 profiles*/
+
+ /* For H264 profile-level-id: 42C00C, frame rate:15, Resolution: 240x320 */
+ PersistableBundle h264_bundle_instance1 = new PersistableBundle();
+ all_h264_payload_bundles.putPersistableBundle(
+ "99", /* Same value of payload type as in KEY_H264_PAYLOAD_TYPE_INT_ARRAY */
+ h264_bundle_instance1);
+
+ /* For H264 profile-level-id: 42C00C, packetisation mode:0, frame rate:15,
+ * Resolution: 240x320 */
+ PersistableBundle h264_bundle_instance2 = new PersistableBundle();
+ h264_bundle_instance2.putInt(
+ KEY_VIDEO_CODEC_ATTRIBUTE_PACKETIZATION_MODE_INT,
+ 0);
+
+ all_h264_payload_bundles.putPersistableBundle(
+ "100", /* Same value of payload type as in KEY_H264_PAYLOAD_TYPE_INT_ARRAY */
+ h264_bundle_instance2);
+
+ defaults.putPersistableBundle(
+ KEY_H264_PAYLOAD_DESCRIPTION_BUNDLE,
+ all_h264_payload_bundles);
+
+ return defaults;
+ }
+ }
+
+ /**
+ * WiFi Calling. This groups the configs specific for Voice over WiFi/WFC call.
+ */
+ public static final class ImsWfc {
+ private ImsWfc() {}
+
+ /** Prefix of all imswfc.KEY_* constants. */
+ public static final String KEY_PREFIX = "imswfc.";
+
+ /**
+ * List of MDNs for which Geo-location PIDF XML with country info
+ * needs to included for normal calls involving short code.
+ */
+ public static final String KEY_PIDF_SHORT_CODE_STRING_ARRAY =
+ KEY_PREFIX + "pidf_short_code_string_array";
+
+ /**
+ * Flag specifying whether emergency call over VoWiFi is requested over
+ * emergency PDN or IMS PDN.
+ *
+ * <p>If {@code false}: E911 call uses IMS PDN for E911 call over VoWiFi.
+ * If {@code true}: E911 call uses Emergency PDN for E911 call over VoWiFi.
+ */
+ public static final String KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL =
+ KEY_PREFIX + "emergency_call_over_emergency_pdn_bool";
+
+
+ private static PersistableBundle getDefaults() {
+ PersistableBundle defaults = new PersistableBundle();
+
+ defaults.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, false);
+ defaults.putStringArray(KEY_PIDF_SHORT_CODE_STRING_ARRAY, new String[] {});
+
+ return defaults;
+ }
+ }
+
+ /**
+ * IMS supplementary services configs. This groups the configs required for
+ * supplementary services (SS) like XCAP over UT,
+ * Unstructured Supplementary Service Data(USSD).
+ */
+ public static final class ImsSs {
+ private ImsSs() {}
+
+ /** Prefix of all imsss.KEY_* constants. */
+ public static final String KEY_PREFIX = "imsss.";
+
+ /**
+ * Flag that controls whether XCAP over UT status need to be
+ * dependent on IMS registration.
+ *
+ * <p>If {@code true}: XCAP over UT status need to be
+ * dependent on IMS registration.
+ * {@code false} otherwise.
+ */
+ public static final String KEY_UT_REQUIRES_IMS_REGISTRATION_BOOL =
+ KEY_PREFIX + "ut_requires_ims_registration_bool";
+
+ /**
+ * Flag that controls whether Circuit Switched Fallback (CSFB)
+ * option is available when XCAP over UT fails.
+ *
+ * <p>If {@code false}: XCAP over UT only with no CSFB option.
+ * If XCAP over UT fails, return error.
+ * if {@code true}, Use CSFB if XCAP over UT fails.
+ */
+ public static final String KEY_USE_CSFB_ON_XCAP_OVER_UT_FAILURE_BOOL =
+ KEY_PREFIX + "use_csfb_on_xcap_over_ut_failure_bool";
+
+ /**
+ * Flag that controls whether XCAP over UT is enabled or not
+ * when PS data is turned off.
+ *
+ * <p>If {@code true}: XCAP over UT is enabled when PS data is off.
+ * {@code false}: Otherwise.
+ *
+ * Reference: IR.92 Section 5.5.1
+ */
+ public static final String KEY_UT_SUPPORTED_WHEN_PS_DATA_OFF_BOOL =
+ KEY_PREFIX + "ut_supported_when_ps_data_off_bool";
+
+ /**
+ * Flag that controls whether network initiated USSD over IMS is
+ * supported by the UE.
+ *
+ * <p>If {@code true}: Support Available.{@code false}: Otherwise.
+ * Reference: 3GPP 24.390.
+ */
+ public static final String KEY_NETWORK_INITIATED_USSD_OVER_IMS_SUPPORTED_BOOL =
+ KEY_PREFIX + "network_initiated_ussd_over_ims_supported_bool";
+
+ /**
+ * Specifies the 'XCAP over UT' IP Type when device is
+ * on Home Network.
+ *
+ * <p>Possible values are,
+ * {@link ApnSetting#PROTOCOL_IPV4V6},
+ * {@link ApnSetting#PROTOCOL_IP},
+ * {@link ApnSetting#PROTOCOL_IPV6}
+ *
+ * If key is invalid or not configured, the default value
+ * {@link ApnSetting#PROTOCOL_IPV4V6} will apply.
+ */
+ public static final String KEY_UT_IPTYPE_HOME_INT =
+ KEY_PREFIX + "ut_iptype_home_int";
+
+ /**
+ * Specifies the 'XCAP over UT' IP Type when device is roaming.
+ *
+ * <p>Possible values are,
+ * {@link ApnSetting#PROTOCOL_IPV4V6},
+ * {@link ApnSetting#PROTOCOL_IP},
+ * {@link ApnSetting#PROTOCOL_IPV6}
+
+ * If key is invalid or not configured, the default value
+ * {@link ApnSetting#PROTOCOL_IPV4V6} will apply.
+ */
+ public static final String KEY_UT_IPTYPE_ROAMING_INT =
+ KEY_PREFIX + "ut_iptype_roaming_int";
+
+ /**
+ * Specifies the XCAP Application Server fully qualified domain name (FQDN).
+ * <p> Reference: 24.623 Section 5.2.3.
+ */
+ public static final String KEY_UT_AS_SERVER_FQDN_STRING =
+ KEY_PREFIX + "ut_as_server_fqdn_string";
+
+ /**
+ * Specifies the XCAP Application Server Remote port.
+ * As XCAP is a usage of HTTP, the default value is same as HTTP, i.e. 80.
+ */
+ public static final String KEY_UT_AS_SERVER_PORT_INT =
+ KEY_PREFIX + "ut_as_server_port_int";
+
+ /**
+ * Specifies the preferred transport to be used for XCAP over UT.
+ *
+ * <p>Possible values are,
+ * {@link Ims#PREFERRED_TRANSPORT_TCP},
+ * {@link Ims#PREFERRED_TRANSPORT_TLS}
+ *
+ * <p>If key is invalid or not configured, the default value
+ * {@link Ims#PREFERRED_TRANSPORT_TCP} will apply.
+ */
+ public static final String KEY_UT_TRANSPORT_TYPE_INT =
+ KEY_PREFIX + "ut_transport_type_int";
+
+ /** @hide */
+ @IntDef({
+ SUPPLEMENTARY_SERVICE_CW,
+ SUPPLEMENTARY_SERVICE_CF_ALL,
+ SUPPLEMENTARY_SERVICE_CF_CFU,
+ SUPPLEMENTARY_SERVICE_CF_ALL_CONDITONAL_FORWARDING,
+ SUPPLEMENTARY_SERVICE_CF_CFB,
+ SUPPLEMENTARY_SERVICE_CF_CFNRY,
+ SUPPLEMENTARY_SERVICE_CF_CFNRC,
+ SUPPLEMENTARY_SERVICE_CF_CFNL,
+ SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIP,
+ SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIP,
+ SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIR,
+ SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIR,
+ SUPPLEMENTARY_SERVICE_CB_ALL,
+ SUPPLEMENTARY_SERVICE_CB_OBS,
+ SUPPLEMENTARY_SERVICE_CB_BAOC,
+ SUPPLEMENTARY_SERVICE_CB_BOIC,
+ SUPPLEMENTARY_SERVICE_CB_BOIC_EXHC,
+ SUPPLEMENTARY_SERVICE_CB_IBS,
+ SUPPLEMENTARY_SERVICE_CB_BAIC,
+ SUPPLEMENTARY_SERVICE_CB_BIC_ROAM,
+ SUPPLEMENTARY_SERVICE_CB_ACR,
+ SUPPLEMENTARY_SERVICE_CB_BIL
+ })
+
+ public @interface SsType {}
+
+ /** Communication Waiting (CW) support as per 3GPP 24.615. */
+ public static final int SUPPLEMENTARY_SERVICE_CW = 0;
+
+ /**
+ * Call Diversion - All call forwarding support as per 3GPP 24.604.
+ *
+ * <p>This value is associated with MMI support service code 002
+ * as indicated in TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CF_ALL = 1;
+
+ /**
+ * Call Diversion - All Unconditional call forwarding support (CFU) as
+ * per 3GPP 24.604.
+ *
+ * <p>This value is associated with MMI support service code 21
+ * as indicated in TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CF_CFU = 2;
+
+ /**
+ * Call Diversion - All conditional call forwarding support as
+ * per 3GPP 24.604.
+ *
+ * <p>This value is associated with MMI support service code 004
+ * as indicated in TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CF_ALL_CONDITONAL_FORWARDING = 3;
+
+ /**
+ * Call Diversion - Call forwarding on mobile subscriber busy (CFB)
+ * support as per 3GPP 24.604.
+ *
+ * <p>This value is associated with MMI support service code 67
+ * as indicated in TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CF_CFB = 4;
+
+ /**
+ * Call Diversion - Call forwarding on no reply (CFNRY)
+ * support as per 3GPP 24.604.
+ *
+ * <p>This value is associated with MMI support service code 61
+ * as indicated in TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CF_CFNRY = 5;
+
+ /**
+ * Call Diversion - Call forwarding on mobile subscriber not reachable
+ * (CFNRC) support as per 3GPP 24.604.
+ *
+ * <p>This value is associated with MMI support service code 62
+ * as indicated in TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CF_CFNRC = 6;
+
+ /**
+ * Communication Forwarding on Not Logged-in (CFNL).
+ * support as per 3GPP 24.604 Section 4.2.1.7
+ *
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CF_CFNL = 7;
+
+ /**
+ * Originating Identification Presentation (OIP) support
+ * as per 3GPP 24.607.
+ *
+ */
+ public static final int SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIP = 8;
+
+ /**
+ * Terminating Identification Presentation (TIP) support
+ * as per 3GPP 24.608.
+ */
+ public static final int SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIP = 9;
+
+ /**
+ * Originating Identification Restriction (OIR) support
+ * as per 3GPP 24.607.
+ */
+ public static final int SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIR = 10;
+
+ /**
+ * Terminating Identification Restriction (TIR) support
+ * as per 3GPP 24.608.
+ */
+ public static final int SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIR = 11;
+
+ /**
+ * Call Barring - All barring services,
+ * This value is associated with MMI support service code 330
+ * as indicated TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_ALL = 12;
+
+ /**
+ * Call Barring - Outgoing barring services,
+ * This value is associated with MMI support service code 333
+ * as indicated TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_OBS = 13;
+
+ /**
+ * Call Barring - Barring of all outgoing calls (BAOC)
+ * support as per 3GPP TS 24.611.
+ *
+ * <p>This value is associated with MMI support service code 33
+ * as indicated TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_BAOC = 14;
+
+ /**
+ * Call Barring - Barring of outgoing international calls
+ * (BOIC) support as per 3GPP TS 24.611.
+ *
+ * <p>This value is associated with MMI support service code 331
+ * as indicated TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_BOIC = 15;
+
+ /**
+ * Call Barring - Barring of outgoing international calls
+ * except those directed to the home PLMN country (BOIC-EXHC) support
+ * as per 3GPP TS 24.611.
+ *
+ * <p>This value is associated with MMI support service code 332
+ * as indicated TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_BOIC_EXHC = 16;
+
+ /**
+ * Call Barring - Incoming barring services,
+ * This value is associated with MMI support service code 353
+ * as indicated TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_IBS = 17;
+
+ /**
+ * Call Barring - Barring of all incoming calls (BAIC)
+ * support as per 3GPP TS 24.611.
+ *
+ * <p>This value is associated with MMI support service code 35
+ * as indicated TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_BAIC = 18;
+
+ /**
+ * Call Barring - Barring of incoming calls when roaming outside
+ * the home PLMN country (BIC-ROAM) support as per 3GPP TS 24.611.
+ *
+ * <p>This value is associated with MMI support service code 351
+ * as indicated TS 22.030 Table B.1
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_BIC_ROAM = 19;
+
+ /**
+ * Call Barring - Anonymous Call Rejection/Barring of all anonymous
+ * incoming number support as per 3GPP TS 24.611.
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_ACR = 20;
+
+ /**
+ * Call Barring - Barring list of incoming numbers support.
+ */
+ public static final int SUPPLEMENTARY_SERVICE_CB_BIL = 21;
+
+ /**
+ * List of UT services that are Server based.
+ *
+ * <p>Possible values are,
+ * <UL>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CW}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CF_ALL}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CF_CFU}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CF_ALL_CONDITONAL_FORWARDING}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CF_CFB}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CF_CFNRY}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CF_CFNRC}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CF_CFNL}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIP}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIP}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIR}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIR}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_ALL}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_OBS}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_IBS}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_BAOC}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_BOIC}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_BOIC_EXHC}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_BAIC}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_BIC_ROAM}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_ACR}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CB_BIL}</LI>
+ * </UL>
+ */
+ public static final String KEY_UT_SERVER_BASED_SERVICES_INT_ARRAY =
+ KEY_PREFIX + "ut_server_based_services_int_array";
+
+ /**
+ * List of UT services that are terminal based.
+ *
+ * By default, all services are server based and defined in
+ * {@link #KEY_UT_SERVER_BASED_SERVICES_INT_ARRAY}.
+ * Adding here will override that service setting to terminal based.
+ *
+ * <p>Possible values are,
+ * <UL>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_CW}</LI>
+ * <LI>{@link #SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIR}</LI>
+ * </UL>
+ */
+ public static final String KEY_UT_TERMINAL_BASED_SERVICES_INT_ARRAY =
+ KEY_PREFIX + "ut_terminal_based_services_int_array";
+
+ /**
+ * List of different RAT technologies on which XCAP over UT
+ * is supported.
+ *
+ * <p>Possible values are,
+ * {@link AccessNetworkConstants.AccessNetworkType#NGRAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#EUTRAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#IWLAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#UTRAN}
+ * {@link AccessNetworkConstants.AccessNetworkType#GERAN}
+ */
+ public static final String KEY_XCAP_OVER_UT_SUPPORTED_RATS_INT_ARRAY =
+ KEY_PREFIX + "xcap_over_ut_supported_rats_int_array";
+
+ private static PersistableBundle getDefaults() {
+ PersistableBundle defaults = new PersistableBundle();
+ defaults.putBoolean(KEY_UT_REQUIRES_IMS_REGISTRATION_BOOL, true);
+ defaults.putBoolean(KEY_USE_CSFB_ON_XCAP_OVER_UT_FAILURE_BOOL, true);
+ defaults.putBoolean(KEY_UT_SUPPORTED_WHEN_PS_DATA_OFF_BOOL, true);
+ defaults.putBoolean(KEY_NETWORK_INITIATED_USSD_OVER_IMS_SUPPORTED_BOOL, true);
+
+ defaults.putInt(KEY_UT_IPTYPE_HOME_INT, ApnSetting.PROTOCOL_IPV4V6);
+ defaults.putInt(KEY_UT_IPTYPE_ROAMING_INT, ApnSetting.PROTOCOL_IPV4V6);
+ defaults.putInt(KEY_UT_AS_SERVER_PORT_INT, 80);
+ defaults.putInt(KEY_UT_TRANSPORT_TYPE_INT, Ims.PREFERRED_TRANSPORT_TCP);
+
+ defaults.putIntArray(
+ KEY_UT_SERVER_BASED_SERVICES_INT_ARRAY,
+ new int[] {
+ SUPPLEMENTARY_SERVICE_CW,
+ SUPPLEMENTARY_SERVICE_CF_ALL,
+ SUPPLEMENTARY_SERVICE_CF_CFU,
+ SUPPLEMENTARY_SERVICE_CF_CFNRC,
+ SUPPLEMENTARY_SERVICE_CF_ALL_CONDITONAL_FORWARDING,
+ SUPPLEMENTARY_SERVICE_CF_CFB,
+ SUPPLEMENTARY_SERVICE_CF_CFNRY,
+ SUPPLEMENTARY_SERVICE_CF_CFNL,
+ SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIP,
+ SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIP,
+ SUPPLEMENTARY_SERVICE_IDENTIFICATION_OIR,
+ SUPPLEMENTARY_SERVICE_IDENTIFICATION_TIR,
+ SUPPLEMENTARY_SERVICE_CB_ALL,
+ SUPPLEMENTARY_SERVICE_CB_OBS,
+ SUPPLEMENTARY_SERVICE_CB_IBS,
+ SUPPLEMENTARY_SERVICE_CB_BAOC,
+ SUPPLEMENTARY_SERVICE_CB_BOIC,
+ SUPPLEMENTARY_SERVICE_CB_BOIC_EXHC,
+ SUPPLEMENTARY_SERVICE_CB_BAIC,
+ SUPPLEMENTARY_SERVICE_CB_BIC_ROAM,
+ SUPPLEMENTARY_SERVICE_CB_ACR,
+ SUPPLEMENTARY_SERVICE_CB_BIL
+ });
+ defaults.putIntArray(
+ KEY_UT_TERMINAL_BASED_SERVICES_INT_ARRAY,
+ new int[] {});
+
+ defaults.putIntArray(
+ KEY_XCAP_OVER_UT_SUPPORTED_RATS_INT_ARRAY,
+ new int[] {
+ AccessNetworkType.EUTRAN,
+ AccessNetworkType.IWLAN
+ });
+ defaults.putString(KEY_UT_AS_SERVER_FQDN_STRING, "");
+
+ return defaults;
+ }
+ }
+
+ /**
+ * This groups the BSF (BootStrapping Function) related configs.
+ * Reference: 3GPP TS 24.109.
+ */
+ public static final class Bsf {
+ private Bsf() {}
+
+ /** Prefix of all bsf.KEY_* constants. */
+ public static final String KEY_PREFIX = "bsf.";
+
+ /** Specifies the fully qualified domain name (FQDN) of BSF Server
+ * as per 3GPP 24.109.
+ */
+ public static final String KEY_BSF_SERVER_FQDN_STRING =
+ KEY_PREFIX + "bsf_server_fqdn_string";
+
+ /**
+ * Specifies the port number of the BSF server as per 3GPP 24.109.
+ * This is usually default port number of HTTP, i.e. 80.
+ */
+ public static final String KEY_BSF_SERVER_PORT_INT =
+ KEY_PREFIX + "bsf_server_port_int";
+
+ /**
+ * Specifies the transport type used in communication with
+ * BSF server.
+ *
+ * <p>Possible values are,
+ * {@link Ims#PREFERRED_TRANSPORT_TCP},
+ * {@link Ims#PREFERRED_TRANSPORT_TLS}
+ *
+ * <p>If key is invalid or not configured, the default value
+ * {@link Ims#PREFERRED_TRANSPORT_TCP} will apply.
+ */
+ public static final String KEY_BSF_TRANSPORT_TYPE_INT =
+ KEY_PREFIX + "bsf_transport type_int";
+
+ private static PersistableBundle getDefaults() {
+ PersistableBundle defaults = new PersistableBundle();
+
+ defaults.putInt(KEY_BSF_SERVER_PORT_INT, 80);
+ defaults.putInt(KEY_BSF_TRANSPORT_TYPE_INT, Ims.PREFERRED_TRANSPORT_TCP);
+ defaults.putString(KEY_BSF_SERVER_FQDN_STRING, "");
+
return defaults;
}
}
@@ -5036,6 +7581,10 @@
/** Specifies the PCO id for IPv4 Epdg server address */
public static final String KEY_EPDG_PCO_ID_IPV4_INT = KEY_PREFIX + "epdg_pco_id_ipv4_int";
+ /** Controls if the IKE tunnel setup supports EAP-AKA fast reauth */
+ public static final String KEY_ENABLE_SUPPORT_FOR_EAP_AKA_FAST_REAUTH_BOOL =
+ KEY_PREFIX + "enable_support_for_eap_aka_fast_reauth_bool";
+
/** @hide */
@IntDef({AUTHENTICATION_METHOD_EAP_ONLY, AUTHENTICATION_METHOD_CERT})
public @interface AuthenticationMethodType {}
@@ -5179,6 +7728,7 @@
defaults.putBoolean(KEY_ADD_KE_TO_CHILD_SESSION_REKEY_BOOL, false);
defaults.putInt(KEY_EPDG_PCO_ID_IPV6_INT, 0);
defaults.putInt(KEY_EPDG_PCO_ID_IPV4_INT, 0);
+ defaults.putBoolean(KEY_ENABLE_SUPPORT_FOR_EAP_AKA_FAST_REAUTH_BOOL, false);
return defaults;
}
@@ -6157,6 +8707,14 @@
});
sDefaults.putBoolean(KEY_SUPPORT_WPS_OVER_IMS_BOOL, true);
sDefaults.putAll(Ims.getDefaults());
+ sDefaults.putAll(ImsVoice.getDefaults());
+ sDefaults.putAll(ImsSms.getDefaults());
+ sDefaults.putAll(ImsRtt.getDefaults());
+ sDefaults.putAll(ImsEmergency.getDefaults());
+ sDefaults.putAll(ImsVt.getDefaults());
+ sDefaults.putAll(ImsWfc.getDefaults());
+ sDefaults.putAll(ImsSs.getDefaults());
+ sDefaults.putAll(Bsf.getDefaults());
sDefaults.putAll(Iwlan.getDefaults());
sDefaults.putStringArray(KEY_CARRIER_CERTIFICATE_STRING_ARRAY, new String[0]);
sDefaults.putBoolean(KEY_FORMAT_INCOMING_NUMBER_TO_NATIONAL_FOR_JP_BOOL, false);
diff --git a/telephony/java/android/telephony/NetworkScanRequest.java b/telephony/java/android/telephony/NetworkScanRequest.java
index c8b8ffb..326f417 100644
--- a/telephony/java/android/telephony/NetworkScanRequest.java
+++ b/telephony/java/android/telephony/NetworkScanRequest.java
@@ -221,7 +221,8 @@
private NetworkScanRequest(Parcel in) {
mScanType = in.readInt();
- Parcelable[] tempSpecifiers = in.readParcelableArray(Object.class.getClassLoader());
+ Parcelable[] tempSpecifiers = in.readParcelableArray(Object.class.getClassLoader(),
+ RadioAccessSpecifier.class);
if (tempSpecifiers != null) {
mSpecifiers = new RadioAccessSpecifier[tempSpecifiers.length];
for (int i = 0; i < tempSpecifiers.length; i++) {
diff --git a/telephony/java/android/telephony/UiccCardInfo.java b/telephony/java/android/telephony/UiccCardInfo.java
index 74f9c87..464389b 100644
--- a/telephony/java/android/telephony/UiccCardInfo.java
+++ b/telephony/java/android/telephony/UiccCardInfo.java
@@ -156,11 +156,9 @@
@Nullable
@Deprecated
public String getIccId() {
- // Temporarily bypassing exception
- // TODO: add exception once refactoring completed.
- //if (mIccIdAccessRestricted) {
- // throw new UnsupportedOperationException("getIccId from UiccPortInfo");
- //}
+ if (mIccIdAccessRestricted) {
+ throw new UnsupportedOperationException("getIccId from UiccPortInfo");
+ }
//always return ICCID from first port.
return getPorts().stream().findFirst().get().getIccId();
}
diff --git a/telephony/java/android/telephony/UiccSlotInfo.java b/telephony/java/android/telephony/UiccSlotInfo.java
index a8668e7..2b1c8c8 100644
--- a/telephony/java/android/telephony/UiccSlotInfo.java
+++ b/telephony/java/android/telephony/UiccSlotInfo.java
@@ -159,11 +159,9 @@
*/
@Deprecated
public boolean getIsActive() {
- // Temporarily bypassing exception
- // TODO: add exception once refactoring completed.
- //if (mLogicalSlotAccessRestricted) {
- // throw new UnsupportedOperationException("get port status from UiccPortInfo");
- //}
+ if (mLogicalSlotAccessRestricted) {
+ throw new UnsupportedOperationException("get port status from UiccPortInfo");
+ }
//always return status from first port.
return getPorts().stream().findFirst().get().isActive();
}
@@ -198,11 +196,9 @@
*/
@Deprecated
public int getLogicalSlotIdx() {
- // Temporarily bypassing exception
- // TODO: add exception once refactoring completed.
- //if (mLogicalSlotAccessRestricted) {
- // throw new UnsupportedOperationException("get logical slot index from UiccPortInfo");
- //}
+ if (mLogicalSlotAccessRestricted) {
+ throw new UnsupportedOperationException("get logical slot index from UiccPortInfo");
+ }
//always return logical slot index from first port.
//portList always have at least one element.
return getPorts().stream().findFirst().get().getLogicalSlotIndex();
diff --git a/telephony/java/android/telephony/data/QosBearerFilter.java b/telephony/java/android/telephony/data/QosBearerFilter.java
index 5a7189f..0ab7b61 100644
--- a/telephony/java/android/telephony/data/QosBearerFilter.java
+++ b/telephony/java/android/telephony/data/QosBearerFilter.java
@@ -18,6 +18,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.net.LinkAddress;
import android.os.Parcel;
import android.os.Parcelable;
@@ -35,11 +36,10 @@
* @hide
*/
public final class QosBearerFilter implements Parcelable {
-
- private List<LinkAddress> localAddresses;
- private List<LinkAddress> remoteAddresses;
- private PortRange localPort;
- private PortRange remotePort;
+ private @NonNull List<LinkAddress> localAddresses;
+ private @NonNull List<LinkAddress> remoteAddresses;
+ private @Nullable PortRange localPort;
+ private @Nullable PortRange remotePort;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@@ -56,13 +56,12 @@
public static final int QOS_PROTOCOL_AH = android.hardware.radio.V1_6.QosProtocol.AH;
public static final int QOS_MIN_PORT = android.hardware.radio.V1_6.QosPortRange.MIN;
/**
- * Hardcoded inplace of android.hardware.radio.V1_6.QosPortRange.MAX as it
+ * Hardcoded in place of android.hardware.radio.V1_6.QosPortRange.MAX as it
* returns -1 due to uint16_t to int conversion in java. (TODO: Fix the HAL)
*/
public static final int QOS_MAX_PORT = 65535; // android.hardware.radio.V1_6.QosPortRange.MIN;
- @QosProtocol
- private int protocol;
+ private @QosProtocol int protocol;
private int typeOfServiceMask;
@@ -85,8 +84,7 @@
public static final int QOS_FILTER_DIRECTION_BIDIRECTIONAL =
android.hardware.radio.V1_6.QosFilterDirection.BIDIRECTIONAL;
- @QosBearerFilterDirection
- private int filterDirection;
+ private @QosBearerFilterDirection int filterDirection;
/**
* Specified the order in which the filter needs to be matched.
@@ -94,9 +92,10 @@
*/
private int precedence;
- public QosBearerFilter(List<LinkAddress> localAddresses, List<LinkAddress> remoteAddresses,
- PortRange localPort, PortRange remotePort, int protocol, int tos,
- long flowLabel, long spi, int direction, int precedence) {
+ public QosBearerFilter(@NonNull List<LinkAddress> localAddresses,
+ @NonNull List<LinkAddress> remoteAddresses, @Nullable PortRange localPort,
+ @Nullable PortRange remotePort, @QosProtocol int protocol, int tos, long flowLabel,
+ long spi, @QosBearerFilterDirection int direction, int precedence) {
this.localAddresses = new ArrayList<>();
this.localAddresses.addAll(localAddresses);
this.remoteAddresses = new ArrayList<>();
@@ -111,19 +110,19 @@
this.precedence = precedence;
}
- public List<LinkAddress> getLocalAddresses() {
+ public @NonNull List<LinkAddress> getLocalAddresses() {
return localAddresses;
}
- public List<LinkAddress> getRemoteAddresses() {
+ public @NonNull List<LinkAddress> getRemoteAddresses() {
return remoteAddresses;
}
- public PortRange getLocalPortRange() {
+ public @Nullable PortRange getLocalPortRange() {
return localPort;
}
- public PortRange getRemotePortRange() {
+ public @Nullable PortRange getRemotePortRange() {
return remotePort;
}
@@ -245,8 +244,8 @@
&& localAddresses.containsAll(other.localAddresses)
&& remoteAddresses.size() == other.remoteAddresses.size()
&& remoteAddresses.containsAll(other.remoteAddresses)
- && localPort.equals(other.localPort)
- && remotePort.equals(other.remotePort)
+ && Objects.equals(localPort, other.localPort)
+ && Objects.equals(remotePort, other.remotePort)
&& protocol == other.protocol
&& typeOfServiceMask == other.typeOfServiceMask
&& flowLabel == other.flowLabel
diff --git a/telephony/java/android/telephony/ims/ImsCallProfile.java b/telephony/java/android/telephony/ims/ImsCallProfile.java
index 7e2d80e..e6d7df3 100644
--- a/telephony/java/android/telephony/ims/ImsCallProfile.java
+++ b/telephony/java/android/telephony/ims/ImsCallProfile.java
@@ -851,7 +851,8 @@
mHasKnownUserIntentEmergency = in.readBoolean();
mRestrictCause = in.readInt();
mCallerNumberVerificationStatus = in.readInt();
- Object[] accepted = in.readArray(RtpHeaderExtensionType.class.getClassLoader());
+ Object[] accepted = in.readArray(RtpHeaderExtensionType.class.getClassLoader(),
+ RtpHeaderExtensionType.class);
mAcceptedRtpHeaderExtensionTypes = Arrays.stream(accepted)
.map(o -> (RtpHeaderExtensionType) o).collect(Collectors.toSet());
}
diff --git a/telephony/java/android/telephony/ims/SipMessage.java b/telephony/java/android/telephony/ims/SipMessage.java
index 391372a..acc6243 100644
--- a/telephony/java/android/telephony/ims/SipMessage.java
+++ b/telephony/java/android/telephony/ims/SipMessage.java
@@ -57,7 +57,7 @@
* @param startLine The start line of the message, containing either the request-line or
* status-line.
* @param headerSection A String containing the full unencoded SIP message header.
- * @param content UTF-8 encoded SIP message body.
+ * @param content SIP message body.
*/
public SipMessage(@NonNull String startLine, @NonNull String headerSection,
@NonNull byte[] content) {
@@ -105,7 +105,7 @@
}
/**
- * @return only the UTF-8 encoded SIP message body.
+ * @return the SIP message body.
*/
public @NonNull byte[] getContent() {
return mContent;
diff --git a/tests/AppLaunchWear/Android.bp b/tests/AppLaunchWear/Android.bp
deleted file mode 100644
index e2fc473..0000000
--- a/tests/AppLaunchWear/Android.bp
+++ /dev/null
@@ -1,22 +0,0 @@
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-android_test {
- name: "AppLaunchWear",
- // Only compile source java files in this apk.
- srcs: ["src/**/*.java"],
- platform_apis: true,
- certificate: "platform",
- libs: [
- "android.test.base",
- "android.test.runner",
- ],
- static_libs: ["androidx.test.rules"],
- test_suites: ["device-tests"],
-}
diff --git a/tests/AppLaunchWear/AndroidManifest.xml b/tests/AppLaunchWear/AndroidManifest.xml
deleted file mode 100644
index 7dfd7ba..0000000
--- a/tests/AppLaunchWear/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.tests.applaunch"
- android:sharedUserId="android.uid.system" >
-
- <uses-permission android:name="android.permission.REAL_GET_TASKS" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
- <uses-sdk
- android:minSdkVersion="22"
- android:targetSdkVersion="24" />
-
- <instrumentation android:label="Measure app start up time"
- android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.android.tests.applaunch" />
-
- <application android:label="App Launch Test">
- <uses-library android:name="android.test.runner" />
- </application>
-</manifest>
diff --git a/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java
deleted file mode 100644
index 97701c6..0000000
--- a/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java
+++ /dev/null
@@ -1,864 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tests.applaunch;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.app.ActivityManager;
-import android.app.ActivityManager.ProcessErrorStateInfo;
-import android.app.IActivityManager;
-import android.app.UiAutomation;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ResolveInfo;
-import android.os.Bundle;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.test.InstrumentationTestCase;
-import android.test.InstrumentationTestRunner;
-import android.util.Log;
-
-import androidx.test.rule.logging.AtraceLogger;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * This test is intended to measure the time it takes for the apps to start.
- * Names of the applications are passed in command line, and the
- * test starts each application, and reports the start up time in milliseconds.
- * The instrumentation expects the following key to be passed on the command line:
- * apps - A list of applications to start and their corresponding result keys
- * in the following format:
- * -e apps <app name>^<result key>|<app name>^<result key>
- */
-public class AppLaunch extends InstrumentationTestCase {
-
- private static final int JOIN_TIMEOUT = 10000;
- private static final String TAG = AppLaunch.class.getSimpleName();
-
- // optional parameter: comma separated list of required account types before proceeding
- // with the app launch
- private static final String KEY_REQUIRED_ACCOUNTS = "required_accounts";
- private static final String KEY_APPS = "apps";
- private static final String KEY_TRIAL_LAUNCH = "trial_launch";
- private static final String KEY_LAUNCH_ITERATIONS = "launch_iterations";
- private static final String KEY_LAUNCH_ORDER = "launch_order";
- private static final String KEY_DROP_CACHE = "drop_cache";
- private static final String KEY_SIMPLEPERF_CMD = "simpleperf_cmd";
- private static final String KEY_SIMPLEPERF_APP = "simpleperf_app";
- private static final String KEY_TRACE_ITERATIONS = "trace_iterations";
- private static final String KEY_LAUNCH_DIRECTORY = "launch_directory";
- private static final String KEY_TRACE_DIRECTORY = "trace_directory";
- private static final String KEY_TRACE_CATEGORY = "trace_categories";
- private static final String KEY_TRACE_BUFFERSIZE = "trace_bufferSize";
- private static final String KEY_TRACE_DUMPINTERVAL = "tracedump_interval";
- private static final String KEY_COMPILER_FILTERS = "compiler_filters";
-
- private static final String SIMPLEPERF_APP_CMD =
- "simpleperf --log fatal stat --csv -e cpu-cycles,major-faults --app %s & %s";
- private static final String WEARABLE_ACTION_GOOGLE =
- "com.google.android.wearable.action.GOOGLE";
- private static final int INITIAL_LAUNCH_IDLE_TIMEOUT = 5000; // 5s to allow app to idle
- private static final int POST_LAUNCH_IDLE_TIMEOUT = 750; // 750ms idle for non initial launches
- private static final int BETWEEN_LAUNCH_SLEEP_TIMEOUT = 5000; // 5s between launching apps
- private static final String LAUNCH_SUB_DIRECTORY = "launch_logs";
- private static final String LAUNCH_FILE = "applaunch.txt";
- private static final String TRACE_SUB_DIRECTORY = "atrace_logs";
- private static final String DEFAULT_TRACE_CATEGORIES =
- "sched,freq,gfx,view,dalvik,webview,input,wm,disk,am,wm";
- private static final String DEFAULT_TRACE_BUFFER_SIZE = "20000";
- private static final String DEFAULT_TRACE_DUMP_INTERVAL = "10";
- private static final String TRIAL_LAUNCH = "TRIAL_LAUNCH";
- private static final String DELIMITER = ",";
- private static final String DROP_CACHE_SCRIPT = "/data/local/tmp/dropCache.sh";
- private static final String APP_LAUNCH_CMD = "am start -W -n";
- private static final String SUCCESS_MESSAGE = "Status: ok";
- private static final String WARNING_MESSAGE = "Warning: Activity not started";
- private static final String COMPILE_SUCCESS = "Success";
- private static final String THIS_TIME = "ThisTime:";
- private static final String LAUNCH_ITERATION = "LAUNCH_ITERATION - %d";
- private static final String TRACE_ITERATION = "TRACE_ITERATION-%d";
- private static final String LAUNCH_ITERATION_PREFIX = "LAUNCH_ITERATION";
- private static final String TRACE_ITERATION_PREFIX = "TRACE_ITERATION";
- private static final String LAUNCH_ORDER_CYCLIC = "cyclic";
- private static final String LAUNCH_ORDER_SEQUENTIAL = "sequential";
- private static final String COMPILE_CMD = "cmd package compile -f -m %s %s";
- private static final String SPEED_PROFILE_FILTER = "speed-profile";
- private static final String VERIFY_FILTER = "verify";
- private static final String LAUNCH_SCRIPT_NAME = "appLaunch";
- private static final String WEARABLE_HOME_PACKAGE = "com.google.android.wearable.app";
-
- private Map<String, Intent> mNameToIntent;
- private List<LaunchOrder> mLaunchOrderList = new ArrayList<LaunchOrder>();
- private Map<String, String> mNameToResultKey;
- private Map<String, Map<String, List<AppLaunchResult>>> mNameToLaunchTime;
- private IActivityManager mAm;
- private String mSimplePerfCmd = null;
- private String mLaunchOrder = null;
- private boolean mDropCache = false;
- private int mLaunchIterations = 10;
- private int mTraceLaunchCount = 0;
- private String mTraceDirectoryStr = null;
- private Bundle mResult = new Bundle();
- private Set<String> mRequiredAccounts;
- private boolean mTrialLaunch = false;
- private BufferedWriter mBufferedWriter = null;
- private boolean mSimplePerfAppOnly = false;
- private String[] mCompilerFilters = null;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- getInstrumentation().getUiAutomation().setRotation(UiAutomation.ROTATION_FREEZE_0);
- }
-
- @Override
- protected void tearDown() throws Exception {
- getInstrumentation().getUiAutomation().setRotation(UiAutomation.ROTATION_UNFREEZE);
- super.tearDown();
- }
-
- private void addLaunchResult(LaunchOrder launch, AppLaunchResult result) {
- mNameToLaunchTime.get(launch.getApp()).get(launch.getCompilerFilter()).add(result);
- }
-
- private boolean hasFailureOnFirstLaunch(LaunchOrder launch) {
- List<AppLaunchResult> results =
- mNameToLaunchTime.get(launch.getApp()).get(launch.getCompilerFilter());
- return (results.size() > 0) && (results.get(0).mLaunchTime < 0);
- }
-
- public void testMeasureStartUpTime() throws RemoteException, NameNotFoundException,
- IOException, InterruptedException {
- InstrumentationTestRunner instrumentation =
- (InstrumentationTestRunner)getInstrumentation();
- Bundle args = instrumentation.getArguments();
- mAm = ActivityManager.getService();
- String launchDirectory = args.getString(KEY_LAUNCH_DIRECTORY);
-
- createMappings();
- parseArgs(args);
- checkAccountSignIn();
-
- // Root directory for applaunch file to log the app launch output
- // Will be useful in case of simpleperf command is used
- File launchRootDir = null;
- if (null != launchDirectory && !launchDirectory.isEmpty()) {
- launchRootDir = new File(launchDirectory);
- if (!launchRootDir.exists() && !launchRootDir.mkdirs()) {
- throw new IOException("Unable to create the destination directory");
- }
- }
-
- try {
- File launchSubDir = new File(launchRootDir, LAUNCH_SUB_DIRECTORY);
-
- if (!launchSubDir.exists() && !launchSubDir.mkdirs()) {
- throw new IOException("Unable to create the lauch file sub directory");
- }
- File file = new File(launchSubDir, LAUNCH_FILE);
- FileOutputStream outputStream = new FileOutputStream(file);
- mBufferedWriter = new BufferedWriter(new OutputStreamWriter(
- outputStream));
-
- // Root directory for trace file during the launches
- File rootTrace = null;
- File rootTraceSubDir = null;
- int traceBufferSize = 0;
- int traceDumpInterval = 0;
- Set<String> traceCategoriesSet = null;
- if (null != mTraceDirectoryStr && !mTraceDirectoryStr.isEmpty()) {
- rootTrace = new File(mTraceDirectoryStr);
- if (!rootTrace.exists() && !rootTrace.mkdirs()) {
- throw new IOException("Unable to create the trace directory");
- }
- rootTraceSubDir = new File(rootTrace, TRACE_SUB_DIRECTORY);
- if (!rootTraceSubDir.exists() && !rootTraceSubDir.mkdirs()) {
- throw new IOException("Unable to create the trace sub directory");
- }
- assertNotNull("Trace iteration parameter is mandatory",
- args.getString(KEY_TRACE_ITERATIONS));
- mTraceLaunchCount = Integer.parseInt(args.getString(KEY_TRACE_ITERATIONS));
- String traceCategoriesStr = args
- .getString(KEY_TRACE_CATEGORY, DEFAULT_TRACE_CATEGORIES);
- traceBufferSize = Integer.parseInt(args.getString(KEY_TRACE_BUFFERSIZE,
- DEFAULT_TRACE_BUFFER_SIZE));
- traceDumpInterval = Integer.parseInt(args.getString(KEY_TRACE_DUMPINTERVAL,
- DEFAULT_TRACE_DUMP_INTERVAL));
- traceCategoriesSet = new HashSet<String>();
- if (!traceCategoriesStr.isEmpty()) {
- String[] traceCategoriesSplit = traceCategoriesStr.split(DELIMITER);
- for (int i = 0; i < traceCategoriesSplit.length; i++) {
- traceCategoriesSet.add(traceCategoriesSplit[i]);
- }
- }
- }
-
- // Get the app launch order based on launch order, trial launch,
- // launch iterations and trace iterations
- setLaunchOrder();
-
- for (LaunchOrder launch : mLaunchOrderList) {
- if (mNameToIntent.get(launch.getApp()) == null) {
- continue;
- }
- dropCache();
- String appPkgName = mNameToIntent.get(launch.getApp())
- .getComponent().getPackageName();
- Log.v(TAG, String.format("\nApp name: %s", launch.getApp()));
- Log.v(TAG, String.format("Adding app package name: %s", appPkgName));
- // App launch times for trial launch will not be used for final
- // launch time calculations.
- if (launch.getLaunchReason().equals(TRIAL_LAUNCH)) {
- // In the "applaunch.txt" file, trail launches is referenced using
- // "TRIAL_LAUNCH"
- Log.v(TAG, "Trial Launch");
- if (SPEED_PROFILE_FILTER.equals(launch.getCompilerFilter())) {
- assertTrue(String.format("Not able to compile the app : %s", appPkgName),
- compileApp(VERIFY_FILTER, appPkgName));
- } else if (launch.getCompilerFilter() != null) {
- assertTrue(String.format("Not able to compile the app : %s", appPkgName),
- compileApp(launch.getCompilerFilter(), appPkgName));
- }
- // We only need to run a trial for the speed-profile filter, but we always
- // run one for "applaunch.txt" consistency.
- AppLaunchResult launchResult = null;
- if (appPkgName.contains(WEARABLE_HOME_PACKAGE)) {
- Log.v(TAG, "Home package detected. Not killing app");
- launchResult = startApp(launch.getApp(), false, launch.getLaunchReason());
- } else {
- Log.v(TAG, "Will kill app before launch");
- launchResult = startApp(launch.getApp(), true, launch.getLaunchReason());
- }
- if (launchResult.mLaunchTime < 0) {
- addLaunchResult(launch, new AppLaunchResult());
- // simply pass the app if launch isn't successful
- // error should have already been logged by startApp
- continue;
- }
- sleep(INITIAL_LAUNCH_IDLE_TIMEOUT);
- if (SPEED_PROFILE_FILTER.equals(launch.getCompilerFilter())) {
- // Send SIGUSR1 to force dumping a profile.
- String sendSignalCommand =
- String.format("killall -s SIGUSR1 %s", appPkgName);
- getInstrumentation().getUiAutomation().executeShellCommand(
- sendSignalCommand);
- assertTrue(String.format("Not able to compile the app : %s", appPkgName),
- compileApp(launch.getCompilerFilter(), appPkgName));
- }
- }
-
- // App launch times used for final calculation
- else if (launch.getLaunchReason().contains(LAUNCH_ITERATION_PREFIX)) {
- Log.v(TAG, "Launch iteration prefix.");
- AppLaunchResult launchResults = null;
- if (hasFailureOnFirstLaunch(launch)) {
- // skip if the app has failures while launched first
- continue;
- }
- // In the "applaunch.txt" file app launches are referenced using
- // "LAUNCH_ITERATION - ITERATION NUM"
- if (appPkgName.contains(WEARABLE_HOME_PACKAGE)) {
- Log.v(TAG, "Home package detected. Not killing app");
- launchResults = startApp(launch.getApp(), false, launch.getLaunchReason());
- } else {
- Log.v(TAG, "Will kill app before launch");
- launchResults = startApp(launch.getApp(), true, launch.getLaunchReason());
- }
- if (launchResults.mLaunchTime < 0) {
- addLaunchResult(launch, new AppLaunchResult());
- // if it fails once, skip the rest of the launches
- continue;
- } else {
- addLaunchResult(launch, launchResults);
- }
- sleep(POST_LAUNCH_IDLE_TIMEOUT);
- }
-
- // App launch times for trace launch will not be used for final
- // launch time calculations.
- else if (launch.getLaunchReason().contains(TRACE_ITERATION_PREFIX)) {
- Log.v(TAG, "Trace iteration prefix");
- AtraceLogger atraceLogger = AtraceLogger
- .getAtraceLoggerInstance(getInstrumentation());
- // Start the trace
- try {
- atraceLogger.atraceStart(traceCategoriesSet, traceBufferSize,
- traceDumpInterval, rootTraceSubDir,
- String.format("%s-%s", launch.getApp(), launch.getLaunchReason()));
- if (appPkgName.contains(WEARABLE_HOME_PACKAGE)) {
- Log.v(TAG, "Home package detected. Not killing app");
- startApp(launch.getApp(), false, launch.getLaunchReason());
- } else {
- Log.v(TAG, "Will kill app before launch");
- startApp(launch.getApp(), true, launch.getLaunchReason());
- }
- sleep(POST_LAUNCH_IDLE_TIMEOUT);
- } finally {
- // Stop the trace
- atraceLogger.atraceStop();
- }
- }
- closeApp(launch.getApp(), true);
- sleep(BETWEEN_LAUNCH_SLEEP_TIMEOUT);
- }
- } finally {
- if (null != mBufferedWriter) {
- mBufferedWriter.close();
- }
- }
-
- for (String app : mNameToResultKey.keySet()) {
- for (String compilerFilter : mCompilerFilters) {
- StringBuilder launchTimes = new StringBuilder();
- StringBuilder cpuCycles = new StringBuilder();
- StringBuilder majorFaults = new StringBuilder();
- for (AppLaunchResult result : mNameToLaunchTime.get(app).get(compilerFilter)) {
- launchTimes.append(result.mLaunchTime);
- launchTimes.append(",");
- if (mSimplePerfAppOnly) {
- cpuCycles.append(result.mCpuCycles);
- cpuCycles.append(",");
- majorFaults.append(result.mMajorFaults);
- majorFaults.append(",");
- }
- }
- String filterName = (compilerFilter == null) ? "" : ("-" + compilerFilter);
- mResult.putString(mNameToResultKey.get(app) + filterName, launchTimes.toString());
- if (mSimplePerfAppOnly) {
- mResult.putString(mNameToResultKey.get(app) + filterName + "-cpuCycles",
- cpuCycles.toString());
- mResult.putString(mNameToResultKey.get(app) + filterName + "-majorFaults",
- majorFaults.toString());
- }
- }
- }
- instrumentation.sendStatus(0, mResult);
- }
-
- /**
- * Compile the app package using compilerFilter and return true or false
- * based on status of the compilation command.
- */
- private boolean compileApp(String compilerFilter, String appPkgName) throws IOException {
- try (ParcelFileDescriptor result = getInstrumentation().getUiAutomation().
- executeShellCommand(String.format(COMPILE_CMD, compilerFilter, appPkgName));
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
- new FileInputStream(result.getFileDescriptor())))) {
- String line;
- while ((line = bufferedReader.readLine()) != null) {
- if (line.contains(COMPILE_SUCCESS)) {
- return true;
- }
- }
- return false;
- }
- }
-
- /**
- * If launch order is "cyclic" then apps will be launched one after the
- * other for each iteration count.
- * If launch order is "sequential" then each app will be launched for given number
- * iterations at once before launching the other apps.
- */
- private void setLaunchOrder() {
- if (LAUNCH_ORDER_CYCLIC.equalsIgnoreCase(mLaunchOrder)) {
- for (String compilerFilter : mCompilerFilters) {
- if (mTrialLaunch) {
- for (String app : mNameToResultKey.keySet()) {
- mLaunchOrderList.add(new LaunchOrder(app, compilerFilter, TRIAL_LAUNCH));
- }
- }
- for (int launchCount = 0; launchCount < mLaunchIterations; launchCount++) {
- for (String app : mNameToResultKey.keySet()) {
- mLaunchOrderList.add(new LaunchOrder(app, compilerFilter,
- String.format(LAUNCH_ITERATION, launchCount)));
- }
- }
- if (mTraceDirectoryStr != null && !mTraceDirectoryStr.isEmpty()) {
- for (int traceCount = 0; traceCount < mTraceLaunchCount; traceCount++) {
- for (String app : mNameToResultKey.keySet()) {
- mLaunchOrderList.add(new LaunchOrder(app, compilerFilter,
- String.format(TRACE_ITERATION, traceCount)));
- }
- }
- }
- }
- } else if (LAUNCH_ORDER_SEQUENTIAL.equalsIgnoreCase(mLaunchOrder)) {
- for (String compilerFilter : mCompilerFilters) {
- for (String app : mNameToResultKey.keySet()) {
- if (mTrialLaunch) {
- mLaunchOrderList.add(new LaunchOrder(app, compilerFilter, TRIAL_LAUNCH));
- }
- for (int launchCount = 0; launchCount < mLaunchIterations; launchCount++) {
- mLaunchOrderList.add(new LaunchOrder(app, compilerFilter,
- String.format(LAUNCH_ITERATION, launchCount)));
- }
- if (mTraceDirectoryStr != null && !mTraceDirectoryStr.isEmpty()) {
- for (int traceCount = 0; traceCount < mTraceLaunchCount; traceCount++) {
- mLaunchOrderList.add(new LaunchOrder(app, compilerFilter,
- String.format(TRACE_ITERATION, traceCount)));
- }
- }
- }
- }
- } else {
- assertTrue("Launch order is not valid parameter", false);
- }
- }
-
- private void dropCache() {
- if (mDropCache) {
- assertNotNull("Issue in dropping the cache",
- getInstrumentation().getUiAutomation()
- .executeShellCommand(DROP_CACHE_SCRIPT));
- }
- }
-
- private void parseArgs(Bundle args) {
- mNameToResultKey = new LinkedHashMap<String, String>();
- mNameToLaunchTime = new HashMap<>();
- String launchIterations = args.getString(KEY_LAUNCH_ITERATIONS);
- if (launchIterations != null) {
- mLaunchIterations = Integer.parseInt(launchIterations);
- }
- String appList = args.getString(KEY_APPS);
- if (appList == null)
- return;
-
- String appNames[] = appList.split("\\|");
- for (String pair : appNames) {
- String[] parts = pair.split("\\^");
- if (parts.length != 2) {
- Log.e(TAG, "The apps key is incorrectly formatted");
- fail();
- }
-
- mNameToResultKey.put(parts[0], parts[1]);
- mNameToLaunchTime.put(parts[0], null);
- }
- String requiredAccounts = args.getString(KEY_REQUIRED_ACCOUNTS);
- if (requiredAccounts != null) {
- mRequiredAccounts = new HashSet<String>();
- for (String accountType : requiredAccounts.split(",")) {
- mRequiredAccounts.add(accountType);
- }
- }
-
- String compilerFilterList = args.getString(KEY_COMPILER_FILTERS);
- if (compilerFilterList != null) {
- // If a compiler filter is passed, we make a trial launch to force compilation
- // of the apps.
- mTrialLaunch = true;
- mCompilerFilters = compilerFilterList.split("\\|");
- } else {
- // Just pass a null compiler filter to use the current state of the app.
- mCompilerFilters = new String[1];
- }
-
- // Pre-populate the results map to avoid null checks.
- for (String app : mNameToLaunchTime.keySet()) {
- HashMap<String, List<AppLaunchResult>> map = new HashMap<>();
- mNameToLaunchTime.put(app, map);
- for (String compilerFilter : mCompilerFilters) {
- map.put(compilerFilter, new ArrayList<>());
- }
- }
-
- mTraceDirectoryStr = args.getString(KEY_TRACE_DIRECTORY);
- mDropCache = Boolean.parseBoolean(args.getString(KEY_DROP_CACHE));
- mSimplePerfCmd = args.getString(KEY_SIMPLEPERF_CMD);
- mLaunchOrder = args.getString(KEY_LAUNCH_ORDER, LAUNCH_ORDER_CYCLIC);
- mSimplePerfAppOnly = Boolean.parseBoolean(args.getString(KEY_SIMPLEPERF_APP));
- mTrialLaunch = mTrialLaunch || Boolean.parseBoolean(args.getString(KEY_TRIAL_LAUNCH));
-
- if (mSimplePerfCmd != null && mSimplePerfAppOnly) {
- Log.w(TAG, String.format("Passing both %s and %s is not supported, ignoring %s",
- KEY_SIMPLEPERF_CMD, KEY_SIMPLEPERF_APP));
- }
- }
-
- private boolean hasLeanback(Context context) {
- return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK);
- }
-
- private void createMappings() {
- mNameToIntent = new LinkedHashMap<String, Intent>();
-
- PackageManager pm = getInstrumentation().getContext()
- .getPackageManager();
- Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
- intentToResolve.addCategory(hasLeanback(getInstrumentation().getContext()) ?
- Intent.CATEGORY_LEANBACK_LAUNCHER :
- Intent.CATEGORY_LAUNCHER);
- List<ResolveInfo> ris = pm.queryIntentActivities(intentToResolve, 0);
- resolveLoop(ris, intentToResolve, pm);
- // For Wear
- intentToResolve = new Intent(WEARABLE_ACTION_GOOGLE);
- ris = pm.queryIntentActivities(intentToResolve, 0);
- resolveLoop(ris, intentToResolve, pm);
- }
-
- private void resolveLoop(List<ResolveInfo> ris, Intent intentToResolve, PackageManager pm) {
- if (ris == null || ris.isEmpty()) {
- Log.i(TAG, "Could not find any apps");
- } else {
- for (ResolveInfo ri : ris) {
- Intent startIntent = new Intent(intentToResolve);
- startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- startIntent.setClassName(ri.activityInfo.packageName,
- ri.activityInfo.name);
- String appName = ri.loadLabel(pm).toString();
- if (appName != null) {
- // Support launching intent using package name or app name
- mNameToIntent.put(ri.activityInfo.packageName, startIntent);
- mNameToIntent.put(appName, startIntent);
- }
- }
- }
- }
-
- private AppLaunchResult startApp(String appName, boolean forceStopBeforeLaunch,
- String launchReason) throws NameNotFoundException, RemoteException {
- Log.i(TAG, "Starting " + appName);
-
- Intent startIntent = mNameToIntent.get(appName);
- if (startIntent == null) {
- Log.w(TAG, "App does not exist: " + appName);
- mResult.putString(mNameToResultKey.get(appName), "App does not exist");
- return new AppLaunchResult();
- }
- AppLaunchRunnable runnable = new AppLaunchRunnable(startIntent, forceStopBeforeLaunch,
- launchReason);
- Thread t = new Thread(runnable);
- t.start();
- try {
- t.join(JOIN_TIMEOUT);
- } catch (InterruptedException e) {
- // ignore
- }
- return runnable.getResult();
- }
-
- private void checkAccountSignIn() {
- // ensure that the device has the required account types before starting test
- // e.g. device must have a valid Google account sign in to measure a meaningful launch time
- // for Gmail
- if (mRequiredAccounts == null || mRequiredAccounts.isEmpty()) {
- return;
- }
- final AccountManager am =
- (AccountManager) getInstrumentation().getTargetContext().getSystemService(
- Context.ACCOUNT_SERVICE);
- Account[] accounts = am.getAccounts();
- // use set here in case device has multiple accounts of the same type
- Set<String> foundAccounts = new HashSet<String>();
- for (Account account : accounts) {
- if (mRequiredAccounts.contains(account.type)) {
- foundAccounts.add(account.type);
- }
- }
- // check if account type matches, if not, fail test with message on what account types
- // are missing
- if (mRequiredAccounts.size() != foundAccounts.size()) {
- mRequiredAccounts.removeAll(foundAccounts);
- StringBuilder sb = new StringBuilder("Device missing these accounts:");
- for (String account : mRequiredAccounts) {
- sb.append(' ');
- sb.append(account);
- }
- fail(sb.toString());
- }
- }
-
- private void closeApp(String appName, boolean forceStopApp) {
- Intent homeIntent = new Intent(Intent.ACTION_MAIN);
- homeIntent.addCategory(Intent.CATEGORY_HOME);
- homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- getInstrumentation().getContext().startActivity(homeIntent);
- sleep(POST_LAUNCH_IDLE_TIMEOUT);
- if (forceStopApp) {
- Intent startIntent = mNameToIntent.get(appName);
- if (startIntent != null) {
- String packageName = startIntent.getComponent().getPackageName();
- try {
- mAm.forceStopPackage(packageName, UserHandle.USER_CURRENT);
- } catch (RemoteException e) {
- Log.w(TAG, "Error closing app", e);
- }
- }
- }
- }
-
- private void sleep(int time) {
- try {
- Thread.sleep(time);
- } catch (InterruptedException e) {
- // ignore
- }
- }
-
- private void reportError(String appName, String processName) {
- ActivityManager am = (ActivityManager) getInstrumentation()
- .getContext().getSystemService(Context.ACTIVITY_SERVICE);
- List<ProcessErrorStateInfo> crashes = am.getProcessesInErrorState();
- if (crashes != null) {
- for (ProcessErrorStateInfo crash : crashes) {
- if (!crash.processName.equals(processName))
- continue;
-
- Log.w(TAG, appName + " crashed: " + crash.shortMsg);
- mResult.putString(mNameToResultKey.get(appName), crash.shortMsg);
- return;
- }
- }
-
- mResult.putString(mNameToResultKey.get(appName),
- "Crashed for unknown reason");
- Log.w(TAG, appName
- + " not found in process list, most likely it is crashed");
- }
-
- private class LaunchOrder {
- private String mApp;
- private String mCompilerFilter;
- private String mLaunchReason;
-
- LaunchOrder(String app, String compilerFilter, String launchReason){
- mApp = app;
- mCompilerFilter = compilerFilter;
- mLaunchReason = launchReason;
- }
-
- public String getApp() {
- return mApp;
- }
-
- public void setApp(String app) {
- mApp = app;
- }
-
- public String getCompilerFilter() {
- return mCompilerFilter;
- }
-
- public String getLaunchReason() {
- return mLaunchReason;
- }
-
- public void setLaunchReason(String launchReason) {
- mLaunchReason = launchReason;
- }
- }
-
- private class AppLaunchResult {
- long mLaunchTime;
- long mCpuCycles;
- long mMajorFaults;
-
- AppLaunchResult() {
- mLaunchTime = -1L;
- mCpuCycles = -1L;
- mMajorFaults = -1L;
- }
-
- AppLaunchResult(String launchTime, String cpuCycles, String majorFaults) {
- try {
- mLaunchTime = Long.parseLong(launchTime, 10);
- mCpuCycles = Long.parseLong(cpuCycles, 10);
- mMajorFaults = Long.parseLong(majorFaults, 10);
- } catch (NumberFormatException e) {
- Log.e(TAG, "Error parsing result", e);
- }
- }
- }
-
- private class AppLaunchRunnable implements Runnable {
- private Intent mLaunchIntent;
- private AppLaunchResult mLaunchResult;
- private boolean mForceStopBeforeLaunch;
- private String mLaunchReason;
-
- public AppLaunchRunnable(Intent intent, boolean forceStopBeforeLaunch,
- String launchReason) {
- mLaunchIntent = intent;
- mForceStopBeforeLaunch = forceStopBeforeLaunch;
- mLaunchReason = launchReason;
- mLaunchResult = new AppLaunchResult();
- }
-
- public AppLaunchResult getResult() {
- return mLaunchResult;
- }
-
- public void run() {
- File launchFile = null;
- try {
- String packageName = mLaunchIntent.getComponent().getPackageName();
- String componentName = mLaunchIntent.getComponent().flattenToShortString();
- if (mForceStopBeforeLaunch) {
- Log.v(TAG, "Stopping app before launch");
- mAm.forceStopPackage(packageName, UserHandle.USER_CURRENT);
- } else {
- Log.v(TAG, "Not killing app. Going to Home Screen.");
- ParcelFileDescriptor goHome = getInstrumentation().getUiAutomation()
- .executeShellCommand("input keyevent 3");
- }
- String launchCmd = String.format("%s %s", APP_LAUNCH_CMD, componentName);
- if (mSimplePerfAppOnly) {
- try {
- // executeShellCommand cannot handle shell specific actions, like '&'.
- // Therefore, we create a file containing the command and make that
- // the command to launch.
- launchFile = File.createTempFile(LAUNCH_SCRIPT_NAME, ".sh");
- launchFile.setExecutable(true);
- try (FileOutputStream stream = new FileOutputStream(launchFile);
- BufferedWriter writer =
- new BufferedWriter(new OutputStreamWriter(stream))) {
- String cmd = String.format(SIMPLEPERF_APP_CMD, packageName, launchCmd);
- writer.write(cmd);
- }
- launchCmd = launchFile.getAbsolutePath();
- } catch (IOException e) {
- Log.w(TAG, "Error writing the launch command", e);
- return;
- }
- } else if (null != mSimplePerfCmd) {
- launchCmd = String.format("%s %s", mSimplePerfCmd, launchCmd);
- }
- Log.v(TAG, "Final launch cmd:" + launchCmd);
- ParcelFileDescriptor parcelDesc = getInstrumentation().getUiAutomation()
- .executeShellCommand(launchCmd);
- mLaunchResult = parseLaunchTimeAndWrite(parcelDesc, String.format
- ("App Launch :%s %s", componentName, mLaunchReason));
- } catch (RemoteException e) {
- Log.w(TAG, "Error launching app", e);
- } finally {
- if (launchFile != null) {
- launchFile.delete();
- }
- }
- }
-
- /**
- * Method to parse the launch time info and write the result to file
- *
- * @param parcelDesc
- * @return
- */
- private AppLaunchResult parseLaunchTimeAndWrite(ParcelFileDescriptor parcelDesc,
- String headerInfo) {
- String launchTime = "-1";
- String cpuCycles = "-1";
- String majorFaults = "-1";
- boolean launchSuccess = false;
- try {
- InputStream inputStream = new FileInputStream(parcelDesc.getFileDescriptor());
- /* SAMPLE OUTPUT :
- Starting: Intent { cmp=com.google.android.calculator/com.android.calculator2.Calculator }
- Status: ok
- Activity: com.google.android.calculator/com.android.calculator2.Calculator
- ThisTime: 357
- TotalTime: 357
- WaitTime: 377
- Complete*/
- /* WHEN NOT KILLING HOME :
- Starting: Intent { cmp=com.google.android.wearable.app/
- com.google.android.clockwork.home.calendar.AgendaActivity }
- Warning: Activity not started, its current task has been brought to the front
- Status: ok
- Activity: com.google.android.wearable.app/
- com.google.android.clockwork.home.calendar.AgendaActivity
- ThisTime: 209
- TotalTime: 209
- WaitTime: 285
- Complete*/
- /* WITH SIMPLEPERF :
- Performance counter statistics,
- 6595722690,cpu-cycles,4.511040,GHz,(100%),
- 0,major-faults,0.000,/sec,(100%),
- Total test time,1.462129,seconds,*/
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
- inputStream));
- String line = null;
- int lineCount = 1;
- int addLineForWarning = 0;
- mBufferedWriter.newLine();
- mBufferedWriter.write(headerInfo);
- mBufferedWriter.newLine();
- while ((line = bufferedReader.readLine()) != null) {
- if (lineCount == 2 && line.contains(WARNING_MESSAGE)) {
- addLineForWarning = 1;
- }
- if (lineCount == (2 + addLineForWarning) && line.contains(SUCCESS_MESSAGE)) {
- launchSuccess = true;
- }
- // Parse TotalTime which is the launch time
- if (launchSuccess && lineCount == (5 + addLineForWarning)) {
- String launchSplit[] = line.split(":");
- launchTime = launchSplit[1].trim();
- }
-
- if (mSimplePerfAppOnly) {
- // Parse simpleperf output.
- if (lineCount == (9 + addLineForWarning)) {
- if (!line.contains("cpu-cycles")) {
- Log.e(TAG, "Error in simpleperf output");
- } else {
- cpuCycles = line.split(",")[0].trim();
- }
- } else if (lineCount == (10 + addLineForWarning)) {
- if (!line.contains("major-faults")) {
- Log.e(TAG, "Error in simpleperf output");
- } else {
- majorFaults = line.split(",")[0].trim();
- }
- }
- }
- mBufferedWriter.write(line);
- mBufferedWriter.newLine();
- lineCount++;
- }
- mBufferedWriter.flush();
- inputStream.close();
- } catch (IOException e) {
- Log.w(TAG, "Error writing the launch file", e);
- }
- return new AppLaunchResult(launchTime, cpuCycles, majorFaults);
- }
-
- }
-}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
index eef7b57..e07a8f9 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt
@@ -99,11 +99,7 @@
/** {@inheritDoc} */
@Presubmit
@Test
- override fun appLayerReplacesLauncher() {
- // This test doesn't work in shell transitions because of b/206094140
- assumeFalse(isShellTransitionsEnabled)
- super.appLayerReplacesLauncher()
- }
+ override fun appLayerReplacesLauncher() = super.appLayerReplacesLauncher()
/** {@inheritDoc} */
@Presubmit
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
index dfa8f8e..cd209b2 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppWarmTest.kt
@@ -96,20 +96,14 @@
/** {@inheritDoc} */
@Presubmit
@Test
- override fun appWindowReplacesLauncherAsTopWindow() {
- // This test doesn't work in shell transitions because of b/206094140
- assumeFalse(isShellTransitionsEnabled)
- super.appWindowReplacesLauncherAsTopWindow()
- }
+ override fun appWindowReplacesLauncherAsTopWindow() =
+ super.appWindowReplacesLauncherAsTopWindow()
/** {@inheritDoc} */
@Presubmit
@Test
- override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
- // This test doesn't work in shell transitions because of b/206094140
- assumeFalse(isShellTransitionsEnabled)
- super.visibleLayersShownMoreThanOneConsecutiveEntry()
- }
+ override fun visibleLayersShownMoreThanOneConsecutiveEntry() =
+ super.visibleLayersShownMoreThanOneConsecutiveEntry()
/** {@inheritDoc} */
@FlakyTest
@@ -119,11 +113,7 @@
/** {@inheritDoc} */
@Presubmit
@Test
- override fun appLayerReplacesLauncher() {
- // This test doesn't work in shell transitions because of b/206094140
- assumeFalse(isShellTransitionsEnabled)
- super.appLayerReplacesLauncher()
- }
+ override fun appLayerReplacesLauncher() = super.appLayerReplacesLauncher()
/** {@inheritDoc} */
@Presubmit
diff --git a/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml b/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml
index cb37fc7..0a88f6b 100644
--- a/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml
+++ b/tests/FlickerTests/test-apps/flickerapp/AndroidManifest.xml
@@ -23,6 +23,7 @@
android:supportsRtl="true">
<activity android:name=".SimpleActivity"
android:taskAffinity="com.android.server.wm.flicker.testapp.SimpleActivity"
+ android:theme="@style/CutoutShortEdges"
android:label="SimpleApp"
android:exported="true">
<intent-filter>
@@ -32,6 +33,7 @@
</activity>
<activity android:name=".ImeActivity"
android:taskAffinity="com.android.server.wm.flicker.testapp.ImeActivity"
+ android:theme="@style/CutoutShortEdges"
android:label="ImeApp"
android:exported="true">
<intent-filter>
@@ -40,6 +42,7 @@
</intent-filter>
</activity>
<activity android:name=".ImeActivityAutoFocus"
+ android:theme="@style/CutoutShortEdges"
android:taskAffinity="com.android.server.wm.flicker.testapp.ImeActivityAutoFocus"
android:windowSoftInputMode="stateVisible"
android:label="ImeAppAutoFocus"
@@ -51,6 +54,7 @@
</activity>
<activity android:name=".SeamlessRotationActivity"
android:taskAffinity="com.android.server.wm.flicker.testapp.SeamlessRotationActivity"
+ android:theme="@style/CutoutShortEdges"
android:configChanges="orientation|screenSize"
android:label="SeamlessApp"
android:exported="true">
@@ -60,6 +64,7 @@
</intent-filter>
</activity>
<activity android:name=".NonResizeableActivity"
+ android:theme="@style/CutoutShortEdges"
android:resizeableActivity="false"
android:taskAffinity="com.android.server.wm.flicker.testapp.NonResizeableActivity"
android:label="NonResizeableApp"
@@ -72,6 +77,7 @@
</activity>
<activity android:name=".ButtonActivity"
android:taskAffinity="com.android.server.wm.flicker.testapp.ButtonActivity"
+ android:theme="@style/CutoutShortEdges"
android:configChanges="orientation|screenSize"
android:label="ButtonActivity"
android:exported="true">
@@ -82,6 +88,7 @@
</activity>
<activity android:name=".LaunchNewTaskActivity"
android:taskAffinity="com.android.server.wm.flicker.testapp.LaunchNewTaskActivity"
+ android:theme="@style/CutoutShortEdges"
android:configChanges="orientation|screenSize"
android:label="LaunchNewTaskActivity"
android:exported="true">
diff --git a/packages/SystemUI/res-keyguard/values-sw720dp/bools.xml b/tests/FlickerTests/test-apps/flickerapp/res/values/styles.xml
similarity index 60%
copy from packages/SystemUI/res-keyguard/values-sw720dp/bools.xml
copy to tests/FlickerTests/test-apps/flickerapp/res/values/styles.xml
index 54bb1fc..87a61a8 100644
--- a/packages/SystemUI/res-keyguard/values-sw720dp/bools.xml
+++ b/tests/FlickerTests/test-apps/flickerapp/res/values/styles.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- ~ Copyright (C) 2021 The Android Open Source Project
+ ~ Copyright (C) 2022 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.
@@ -16,11 +16,15 @@
-->
<resources>
- <!-- Allows PIN/Pattern to be drawn on one side of a display, and for the user to
- switch sides -->
- <bool name="can_use_one_handed_bouncer">false</bool>
+ <style name="CutoutDefault">
+ <item name="android:windowLayoutInDisplayCutoutMode">default</item>
+ </style>
- <!-- Will display the bouncer on one side of the display, and the current user icon and
- user switcher on the other side -->
- <bool name="bouncer_display_user_switcher">true</bool>
-</resources>
+ <style name="CutoutShortEdges">
+ <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
+ </style>
+
+ <style name="CutoutNever">
+ <item name="android:windowLayoutInDisplayCutoutMode">never</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
index 46d3a3d..65d168b 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java
@@ -84,7 +84,7 @@
mBlendPaint.setColorFilter(new PorterDuffColorFilter(0, PorterDuff.Mode.SRC_OVER));
mRuntimeShader = new RuntimeShader(sSkSL, false);
- mRuntimeShader.setUniform("param1", mShaderParam1);
+ mRuntimeShader.setFloatUniform("param1", mShaderParam1);
mRuntimeShader.setInputShader("bitmapShader", new BitmapShader(mBitmap1,
Shader.TileMode.CLAMP,
Shader.TileMode.CLAMP));
@@ -177,7 +177,7 @@
public void setShaderParam1(float value) {
mShaderParam1 = value;
- mRuntimeShader.setUniform("param1", mShaderParam1);
+ mRuntimeShader.setFloatUniform("param1", mShaderParam1);
invalidate();
}
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java
index 83e2de9..73c4b8a 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java
@@ -110,7 +110,7 @@
mPaint = CanvasProperty.createPaint(p);
mRuntimeShader = new RuntimeShader(sSkSL, false);
- mRuntimeShader.setUniform("in_maxRadius", MAX_RADIUS);
+ mRuntimeShader.setFloatUniform("in_maxRadius", MAX_RADIUS);
}
@Override
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java
index fcdee63..12e338c 100644
--- a/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java
@@ -357,18 +357,18 @@
float uScrollX = mScrollX;
float uScrollY = mScrollY;
- mRuntimeShader.setUniform("uMaxStretchIntensity", mMaxStretchIntensity);
- mRuntimeShader.setUniform("uStretchAffectedDist", mStretchAffectedDistance);
- mRuntimeShader.setUniform("uDistanceStretchedX", distanceStretchedX);
- mRuntimeShader.setUniform("uDistanceStretchedY", distanceStretchedY);
- mRuntimeShader.setUniform("uDistDiffX", diffX);
- mRuntimeShader.setUniform("uDistDiffY", diffY);
- mRuntimeShader.setUniform("uOverscrollX", normOverScrollDistX);
- mRuntimeShader.setUniform("uOverscrollY", normOverScrollDistY);
- mRuntimeShader.setUniform("uScrollX", uScrollX);
- mRuntimeShader.setUniform("uScrollY", uScrollY);
- mRuntimeShader.setUniform("viewportWidth", width);
- mRuntimeShader.setUniform("viewportHeight", height);
+ mRuntimeShader.setFloatUniform("uMaxStretchIntensity", mMaxStretchIntensity);
+ mRuntimeShader.setFloatUniform("uStretchAffectedDist", mStretchAffectedDistance);
+ mRuntimeShader.setFloatUniform("uDistanceStretchedX", distanceStretchedX);
+ mRuntimeShader.setFloatUniform("uDistanceStretchedY", distanceStretchedY);
+ mRuntimeShader.setFloatUniform("uDistDiffX", diffX);
+ mRuntimeShader.setFloatUniform("uDistDiffY", diffY);
+ mRuntimeShader.setFloatUniform("uOverscrollX", normOverScrollDistX);
+ mRuntimeShader.setFloatUniform("uOverscrollY", normOverScrollDistY);
+ mRuntimeShader.setFloatUniform("uScrollX", uScrollX);
+ mRuntimeShader.setFloatUniform("uScrollY", uScrollY);
+ mRuntimeShader.setFloatUniform("viewportWidth", width);
+ mRuntimeShader.setFloatUniform("viewportHeight", height);
mImageView.setRenderEffect(RenderEffect.createShaderEffect(mRuntimeShader));
diff --git a/tests/vcn/java/android/net/vcn/VcnCellUnderlyingNetworkPriorityTest.java b/tests/vcn/java/android/net/vcn/VcnCellUnderlyingNetworkPriorityTest.java
deleted file mode 100644
index 476be44..0000000
--- a/tests/vcn/java/android/net/vcn/VcnCellUnderlyingNetworkPriorityTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.
- */
-package android.net.vcn;
-
-import static android.net.vcn.VcnUnderlyingNetworkPriority.NETWORK_QUALITY_ANY;
-import static android.net.vcn.VcnUnderlyingNetworkPriority.NETWORK_QUALITY_OK;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class VcnCellUnderlyingNetworkPriorityTest {
- private static final Set<String> ALLOWED_PLMN_IDS = new HashSet<>();
- private static final Set<Integer> ALLOWED_CARRIER_IDS = new HashSet<>();
-
- // Package private for use in VcnGatewayConnectionConfigTest
- static VcnCellUnderlyingNetworkPriority getTestNetworkPriority() {
- return new VcnCellUnderlyingNetworkPriority.Builder()
- .setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(true /* allowMetered */)
- .setAllowedOperatorPlmnIds(ALLOWED_PLMN_IDS)
- .setAllowedSpecificCarrierIds(ALLOWED_CARRIER_IDS)
- .setAllowRoaming(true /* allowRoaming */)
- .setRequireOpportunistic(true /* requireOpportunistic */)
- .build();
- }
-
- @Test
- public void testBuilderAndGetters() {
- final VcnCellUnderlyingNetworkPriority networkPriority = getTestNetworkPriority();
- assertEquals(NETWORK_QUALITY_OK, networkPriority.getNetworkQuality());
- assertTrue(networkPriority.allowMetered());
- assertEquals(ALLOWED_PLMN_IDS, networkPriority.getAllowedOperatorPlmnIds());
- assertEquals(ALLOWED_CARRIER_IDS, networkPriority.getAllowedSpecificCarrierIds());
- assertTrue(networkPriority.allowRoaming());
- assertTrue(networkPriority.requireOpportunistic());
- }
-
- @Test
- public void testBuilderAndGettersForDefaultValues() {
- final VcnCellUnderlyingNetworkPriority networkPriority =
- new VcnCellUnderlyingNetworkPriority.Builder().build();
- assertEquals(NETWORK_QUALITY_ANY, networkPriority.getNetworkQuality());
- assertFalse(networkPriority.allowMetered());
- assertEquals(new HashSet<String>(), networkPriority.getAllowedOperatorPlmnIds());
- assertEquals(new HashSet<Integer>(), networkPriority.getAllowedSpecificCarrierIds());
- assertFalse(networkPriority.allowRoaming());
- assertFalse(networkPriority.requireOpportunistic());
- }
-
- @Test
- public void testPersistableBundle() {
- final VcnCellUnderlyingNetworkPriority networkPriority = getTestNetworkPriority();
- assertEquals(
- networkPriority,
- VcnUnderlyingNetworkPriority.fromPersistableBundle(
- networkPriority.toPersistableBundle()));
- }
-}
diff --git a/tests/vcn/java/android/net/vcn/VcnCellUnderlyingNetworkTemplateTest.java b/tests/vcn/java/android/net/vcn/VcnCellUnderlyingNetworkTemplateTest.java
new file mode 100644
index 0000000..4a724b7
--- /dev/null
+++ b/tests/vcn/java/android/net/vcn/VcnCellUnderlyingNetworkTemplateTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.
+ */
+package android.net.vcn;
+
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_ANY;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_FORBIDDEN;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_REQUIRED;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.NETWORK_QUALITY_ANY;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.NETWORK_QUALITY_OK;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class VcnCellUnderlyingNetworkTemplateTest {
+ private static final Set<String> ALLOWED_PLMN_IDS = new HashSet<>();
+ private static final Set<Integer> ALLOWED_CARRIER_IDS = new HashSet<>();
+
+ // Package private for use in VcnGatewayConnectionConfigTest
+ static VcnCellUnderlyingNetworkTemplate getTestNetworkTemplate() {
+ return new VcnCellUnderlyingNetworkTemplate.Builder()
+ .setNetworkQuality(NETWORK_QUALITY_OK)
+ .setMetered(MATCH_FORBIDDEN)
+ .setOperatorPlmnIds(ALLOWED_PLMN_IDS)
+ .setSimSpecificCarrierIds(ALLOWED_CARRIER_IDS)
+ .setRoaming(MATCH_FORBIDDEN)
+ .setOpportunistic(MATCH_REQUIRED)
+ .build();
+ }
+
+ @Test
+ public void testBuilderAndGetters() {
+ final VcnCellUnderlyingNetworkTemplate networkPriority = getTestNetworkTemplate();
+ assertEquals(NETWORK_QUALITY_OK, networkPriority.getNetworkQuality());
+ assertEquals(MATCH_FORBIDDEN, networkPriority.getMetered());
+ assertEquals(ALLOWED_PLMN_IDS, networkPriority.getOperatorPlmnIds());
+ assertEquals(ALLOWED_CARRIER_IDS, networkPriority.getSimSpecificCarrierIds());
+ assertEquals(MATCH_FORBIDDEN, networkPriority.getRoaming());
+ assertEquals(MATCH_REQUIRED, networkPriority.getOpportunistic());
+ }
+
+ @Test
+ public void testBuilderAndGettersForDefaultValues() {
+ final VcnCellUnderlyingNetworkTemplate networkPriority =
+ new VcnCellUnderlyingNetworkTemplate.Builder().build();
+ assertEquals(NETWORK_QUALITY_ANY, networkPriority.getNetworkQuality());
+ assertEquals(MATCH_ANY, networkPriority.getMetered());
+ assertEquals(new HashSet<String>(), networkPriority.getOperatorPlmnIds());
+ assertEquals(new HashSet<Integer>(), networkPriority.getSimSpecificCarrierIds());
+ assertEquals(MATCH_ANY, networkPriority.getRoaming());
+ assertEquals(MATCH_ANY, networkPriority.getOpportunistic());
+ }
+
+ @Test
+ public void testPersistableBundle() {
+ final VcnCellUnderlyingNetworkTemplate networkPriority = getTestNetworkTemplate();
+ assertEquals(
+ networkPriority,
+ VcnUnderlyingNetworkTemplate.fromPersistableBundle(
+ networkPriority.toPersistableBundle()));
+ }
+}
diff --git a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
index 377f526..2aef9ae 100644
--- a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
+++ b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
@@ -17,8 +17,8 @@
package android.net.vcn;
import static android.net.ipsec.ike.IkeSessionParams.IKE_OPTION_MOBIKE;
-import static android.net.vcn.VcnGatewayConnectionConfig.DEFAULT_UNDERLYING_NETWORK_PRIORITIES;
-import static android.net.vcn.VcnGatewayConnectionConfig.UNDERLYING_NETWORK_PRIORITIES_KEY;
+import static android.net.vcn.VcnGatewayConnectionConfig.DEFAULT_UNDERLYING_NETWORK_TEMPLATES;
+import static android.net.vcn.VcnGatewayConnectionConfig.UNDERLYING_NETWORK_TEMPLATES_KEY;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
@@ -40,8 +40,9 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.ArrayList;
import java.util.Arrays;
-import java.util.LinkedHashSet;
+import java.util.List;
import java.util.concurrent.TimeUnit;
@RunWith(AndroidJUnit4.class)
@@ -54,17 +55,17 @@
};
public static final int[] UNDERLYING_CAPS = new int[] {NetworkCapabilities.NET_CAPABILITY_DUN};
- private static final LinkedHashSet<VcnUnderlyingNetworkPriority> UNDERLYING_NETWORK_PRIORITIES =
- new LinkedHashSet();
+ private static final List<VcnUnderlyingNetworkTemplate> UNDERLYING_NETWORK_TEMPLATES =
+ new ArrayList();
static {
Arrays.sort(EXPOSED_CAPS);
Arrays.sort(UNDERLYING_CAPS);
- UNDERLYING_NETWORK_PRIORITIES.add(
- VcnCellUnderlyingNetworkPriorityTest.getTestNetworkPriority());
- UNDERLYING_NETWORK_PRIORITIES.add(
- VcnWifiUnderlyingNetworkPriorityTest.getTestNetworkPriority());
+ UNDERLYING_NETWORK_TEMPLATES.add(
+ VcnCellUnderlyingNetworkTemplateTest.getTestNetworkTemplate());
+ UNDERLYING_NETWORK_TEMPLATES.add(
+ VcnWifiUnderlyingNetworkTemplateTest.getTestNetworkTemplate());
}
public static final long[] RETRY_INTERVALS_MS =
@@ -95,7 +96,7 @@
// Public for use in VcnGatewayConnectionTest
public static VcnGatewayConnectionConfig buildTestConfig() {
final VcnGatewayConnectionConfig.Builder builder =
- newBuilder().setVcnUnderlyingNetworkPriorities(UNDERLYING_NETWORK_PRIORITIES);
+ newBuilder().setVcnUnderlyingNetworkPriorities(UNDERLYING_NETWORK_TEMPLATES);
return buildTestConfigWithExposedCaps(builder, EXPOSED_CAPS);
}
@@ -174,10 +175,10 @@
}
@Test
- public void testBuilderRequiresNonNullNetworkPriorities() {
+ public void testBuilderRequiresNonNullNetworkTemplates() {
try {
newBuilder().setVcnUnderlyingNetworkPriorities(null);
- fail("Expected exception due to invalid underlyingNetworkPriorities");
+ fail("Expected exception due to invalid underlyingNetworkTemplates");
} catch (NullPointerException e) {
}
}
@@ -219,7 +220,7 @@
Arrays.sort(exposedCaps);
assertArrayEquals(EXPOSED_CAPS, exposedCaps);
- assertEquals(UNDERLYING_NETWORK_PRIORITIES, config.getVcnUnderlyingNetworkPriorities());
+ assertEquals(UNDERLYING_NETWORK_TEMPLATES, config.getVcnUnderlyingNetworkPriorities());
assertEquals(TUNNEL_CONNECTION_PARAMS, config.getTunnelConnectionParams());
assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMillis());
@@ -234,13 +235,13 @@
}
@Test
- public void testParsePersistableBundleWithoutVcnUnderlyingNetworkPriorities() {
+ public void testParsePersistableBundleWithoutVcnUnderlyingNetworkTemplates() {
PersistableBundle configBundle = buildTestConfig().toPersistableBundle();
- configBundle.putPersistableBundle(UNDERLYING_NETWORK_PRIORITIES_KEY, null);
+ configBundle.putPersistableBundle(UNDERLYING_NETWORK_TEMPLATES_KEY, null);
final VcnGatewayConnectionConfig config = new VcnGatewayConnectionConfig(configBundle);
assertEquals(
- DEFAULT_UNDERLYING_NETWORK_PRIORITIES, config.getVcnUnderlyingNetworkPriorities());
+ DEFAULT_UNDERLYING_NETWORK_TEMPLATES, config.getVcnUnderlyingNetworkPriorities());
}
private static IkeTunnelConnectionParams buildTunnelConnectionParams(String ikePsk) {
@@ -285,39 +286,36 @@
assertNotEquals(config, anotherConfig);
}
- private static VcnGatewayConnectionConfig buildTestConfigWithVcnUnderlyingNetworkPriorities(
- LinkedHashSet<VcnUnderlyingNetworkPriority> networkPriorities) {
+ private static VcnGatewayConnectionConfig buildTestConfigWithVcnUnderlyingNetworkTemplates(
+ List<VcnUnderlyingNetworkTemplate> networkTemplates) {
return buildTestConfigWithExposedCaps(
new VcnGatewayConnectionConfig.Builder(
- "buildTestConfigWithVcnUnderlyingNetworkPriorities",
+ "buildTestConfigWithVcnUnderlyingNetworkTemplates",
TUNNEL_CONNECTION_PARAMS)
- .setVcnUnderlyingNetworkPriorities(networkPriorities),
+ .setVcnUnderlyingNetworkPriorities(networkTemplates),
EXPOSED_CAPS);
}
@Test
- public void testVcnUnderlyingNetworkPrioritiesEquality() throws Exception {
+ public void testVcnUnderlyingNetworkTemplatesEquality() throws Exception {
final VcnGatewayConnectionConfig config =
- buildTestConfigWithVcnUnderlyingNetworkPriorities(UNDERLYING_NETWORK_PRIORITIES);
+ buildTestConfigWithVcnUnderlyingNetworkTemplates(UNDERLYING_NETWORK_TEMPLATES);
- final LinkedHashSet<VcnUnderlyingNetworkPriority> networkPrioritiesEqual =
- new LinkedHashSet();
- networkPrioritiesEqual.add(VcnCellUnderlyingNetworkPriorityTest.getTestNetworkPriority());
- networkPrioritiesEqual.add(VcnWifiUnderlyingNetworkPriorityTest.getTestNetworkPriority());
+ final List<VcnUnderlyingNetworkTemplate> networkTemplatesEqual = new ArrayList();
+ networkTemplatesEqual.add(VcnCellUnderlyingNetworkTemplateTest.getTestNetworkTemplate());
+ networkTemplatesEqual.add(VcnWifiUnderlyingNetworkTemplateTest.getTestNetworkTemplate());
final VcnGatewayConnectionConfig configEqual =
- buildTestConfigWithVcnUnderlyingNetworkPriorities(networkPrioritiesEqual);
+ buildTestConfigWithVcnUnderlyingNetworkTemplates(networkTemplatesEqual);
- final LinkedHashSet<VcnUnderlyingNetworkPriority> networkPrioritiesNotEqual =
- new LinkedHashSet();
- networkPrioritiesNotEqual.add(
- VcnWifiUnderlyingNetworkPriorityTest.getTestNetworkPriority());
+ final List<VcnUnderlyingNetworkTemplate> networkTemplatesNotEqual = new ArrayList();
+ networkTemplatesNotEqual.add(VcnWifiUnderlyingNetworkTemplateTest.getTestNetworkTemplate());
final VcnGatewayConnectionConfig configNotEqual =
- buildTestConfigWithVcnUnderlyingNetworkPriorities(networkPrioritiesNotEqual);
+ buildTestConfigWithVcnUnderlyingNetworkTemplates(networkTemplatesNotEqual);
- assertEquals(UNDERLYING_NETWORK_PRIORITIES, networkPrioritiesEqual);
+ assertEquals(UNDERLYING_NETWORK_TEMPLATES, networkTemplatesEqual);
assertEquals(config, configEqual);
- assertNotEquals(UNDERLYING_NETWORK_PRIORITIES, networkPrioritiesNotEqual);
+ assertNotEquals(UNDERLYING_NETWORK_TEMPLATES, networkTemplatesNotEqual);
assertNotEquals(config, configNotEqual);
}
}
diff --git a/tests/vcn/java/android/net/vcn/VcnWifiUnderlyingNetworkPriorityTest.java b/tests/vcn/java/android/net/vcn/VcnWifiUnderlyingNetworkPriorityTest.java
deleted file mode 100644
index dd272cb..0000000
--- a/tests/vcn/java/android/net/vcn/VcnWifiUnderlyingNetworkPriorityTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.
- */
-package android.net.vcn;
-
-import static android.net.vcn.VcnUnderlyingNetworkPriority.NETWORK_QUALITY_ANY;
-import static android.net.vcn.VcnUnderlyingNetworkPriority.NETWORK_QUALITY_OK;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
-
-public class VcnWifiUnderlyingNetworkPriorityTest {
- private static final String SSID = "TestWifi";
- private static final int INVALID_NETWORK_QUALITY = -1;
-
- // Package private for use in VcnGatewayConnectionConfigTest
- static VcnWifiUnderlyingNetworkPriority getTestNetworkPriority() {
- return new VcnWifiUnderlyingNetworkPriority.Builder()
- .setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(true /* allowMetered */)
- .setSsid(SSID)
- .build();
- }
-
- @Test
- public void testBuilderAndGetters() {
- final VcnWifiUnderlyingNetworkPriority networkPriority = getTestNetworkPriority();
- assertEquals(NETWORK_QUALITY_OK, networkPriority.getNetworkQuality());
- assertTrue(networkPriority.allowMetered());
- assertEquals(SSID, networkPriority.getSsid());
- }
-
- @Test
- public void testBuilderAndGettersForDefaultValues() {
- final VcnWifiUnderlyingNetworkPriority networkPriority =
- new VcnWifiUnderlyingNetworkPriority.Builder().build();
- assertEquals(NETWORK_QUALITY_ANY, networkPriority.getNetworkQuality());
- assertFalse(networkPriority.allowMetered());
- assertNull(SSID, networkPriority.getSsid());
- }
-
- @Test
- public void testBuildWithInvalidNetworkQuality() {
- try {
- new VcnWifiUnderlyingNetworkPriority.Builder()
- .setNetworkQuality(INVALID_NETWORK_QUALITY);
- fail("Expected to fail due to the invalid network quality");
- } catch (Exception expected) {
- }
- }
-
- @Test
- public void testPersistableBundle() {
- final VcnWifiUnderlyingNetworkPriority networkPriority = getTestNetworkPriority();
- assertEquals(
- networkPriority,
- VcnUnderlyingNetworkPriority.fromPersistableBundle(
- networkPriority.toPersistableBundle()));
- }
-}
diff --git a/tests/vcn/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplateTest.java b/tests/vcn/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplateTest.java
new file mode 100644
index 0000000..cb5b47b
--- /dev/null
+++ b/tests/vcn/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplateTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+package android.net.vcn;
+
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_ANY;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_FORBIDDEN;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.NETWORK_QUALITY_ANY;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.NETWORK_QUALITY_OK;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+
+import java.util.Set;
+
+public class VcnWifiUnderlyingNetworkTemplateTest {
+ private static final String SSID = "TestWifi";
+ private static final int INVALID_NETWORK_QUALITY = -1;
+
+ // Package private for use in VcnGatewayConnectionConfigTest
+ static VcnWifiUnderlyingNetworkTemplate getTestNetworkTemplate() {
+ return new VcnWifiUnderlyingNetworkTemplate.Builder()
+ .setNetworkQuality(NETWORK_QUALITY_OK)
+ .setMetered(MATCH_FORBIDDEN)
+ .setSsids(Set.of(SSID))
+ .build();
+ }
+
+ @Test
+ public void testBuilderAndGetters() {
+ final VcnWifiUnderlyingNetworkTemplate networkPriority = getTestNetworkTemplate();
+ assertEquals(NETWORK_QUALITY_OK, networkPriority.getNetworkQuality());
+ assertEquals(MATCH_FORBIDDEN, networkPriority.getMetered());
+ assertEquals(Set.of(SSID), networkPriority.getSsids());
+ }
+
+ @Test
+ public void testBuilderAndGettersForDefaultValues() {
+ final VcnWifiUnderlyingNetworkTemplate networkPriority =
+ new VcnWifiUnderlyingNetworkTemplate.Builder().build();
+ assertEquals(NETWORK_QUALITY_ANY, networkPriority.getNetworkQuality());
+ assertEquals(MATCH_ANY, networkPriority.getMetered());
+ assertTrue(networkPriority.getSsids().isEmpty());
+ }
+
+ @Test
+ public void testBuildWithInvalidNetworkQuality() {
+ try {
+ new VcnWifiUnderlyingNetworkTemplate.Builder()
+ .setNetworkQuality(INVALID_NETWORK_QUALITY);
+ fail("Expected to fail due to the invalid network quality");
+ } catch (Exception expected) {
+ }
+ }
+
+ @Test
+ public void testPersistableBundle() {
+ final VcnWifiUnderlyingNetworkTemplate networkPriority = getTestNetworkTemplate();
+ assertEquals(
+ networkPriority,
+ VcnUnderlyingNetworkTemplate.fromPersistableBundle(
+ networkPriority.toPersistableBundle()));
+ }
+}
diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
index 7c7dc4d..bb98bc0 100644
--- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
+++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
@@ -23,7 +23,6 @@
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_ACTIVE;
import static android.net.vcn.VcnManager.VCN_STATUS_CODE_SAFE_MODE;
-import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS;
import static android.telephony.TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
@@ -264,6 +263,7 @@
@Test
public void testSystemReady() throws Exception {
mVcnMgmtSvc.systemReady();
+ mTestLooper.dispatchAll();
verify(mConnMgr).registerNetworkProvider(any(VcnNetworkProvider.class));
verify(mSubscriptionTracker).register();
@@ -475,10 +475,8 @@
mVcnMgmtSvc.addVcnUnderlyingNetworkPolicyListener(mMockPolicyListener);
triggerSubscriptionTrackerCbAndGetSnapshot(null, Collections.emptySet());
-
- // Verify teardown after delay
- mTestLooper.moveTimeForward(VcnManagementService.CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS);
mTestLooper.dispatchAll();
+
verify(vcn).teardownAsynchronously();
verify(mMockPolicyListener).onPolicyChanged();
}
@@ -504,92 +502,6 @@
assertEquals(0, mVcnMgmtSvc.getAllVcns().size());
}
- /**
- * Tests an intermediate state where carrier privileges are marked as lost before active data
- * subId changes during a SIM ejection.
- *
- * <p>The expected outcome is that the VCN is torn down after a delay, as opposed to
- * immediately.
- */
- @Test
- public void testTelephonyNetworkTrackerCallbackLostCarrierPrivilegesBeforeActiveDataSubChanges()
- throws Exception {
- setupActiveSubscription(TEST_UUID_2);
-
- final TelephonySubscriptionTrackerCallback cb = getTelephonySubscriptionTrackerCallback();
- final Vcn vcn = startAndGetVcnInstance(TEST_UUID_2);
-
- // Simulate privileges lost
- triggerSubscriptionTrackerCbAndGetSnapshot(
- TEST_SUBSCRIPTION_ID,
- TEST_UUID_2,
- Collections.emptySet(),
- Collections.emptyMap(),
- false /* hasCarrierPrivileges */);
-
- // Verify teardown after delay
- mTestLooper.moveTimeForward(VcnManagementService.CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS);
- mTestLooper.dispatchAll();
- verify(vcn).teardownAsynchronously();
- }
-
- @Test
- public void testTelephonyNetworkTrackerCallbackSimSwitchesDoNotKillVcnInstances()
- throws Exception {
- setupActiveSubscription(TEST_UUID_2);
-
- final TelephonySubscriptionTrackerCallback cb = getTelephonySubscriptionTrackerCallback();
- final Vcn vcn = startAndGetVcnInstance(TEST_UUID_2);
-
- // Simulate SIM unloaded
- triggerSubscriptionTrackerCbAndGetSnapshot(
- INVALID_SUBSCRIPTION_ID,
- null /* activeDataSubscriptionGroup */,
- Collections.emptySet(),
- Collections.emptyMap(),
- false /* hasCarrierPrivileges */);
-
- // Simulate new SIM loaded right during teardown delay.
- mTestLooper.moveTimeForward(
- VcnManagementService.CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS / 2);
- mTestLooper.dispatchAll();
- triggerSubscriptionTrackerCbAndGetSnapshot(TEST_UUID_2, Collections.singleton(TEST_UUID_2));
-
- // Verify that even after the full timeout duration, the VCN instance is not torn down
- mTestLooper.moveTimeForward(VcnManagementService.CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS);
- mTestLooper.dispatchAll();
- verify(vcn, never()).teardownAsynchronously();
- }
-
- @Test
- public void testTelephonyNetworkTrackerCallbackDoesNotKillNewVcnInstances() throws Exception {
- setupActiveSubscription(TEST_UUID_2);
-
- final TelephonySubscriptionTrackerCallback cb = getTelephonySubscriptionTrackerCallback();
- final Vcn oldInstance = startAndGetVcnInstance(TEST_UUID_2);
-
- // Simulate SIM unloaded
- triggerSubscriptionTrackerCbAndGetSnapshot(null, Collections.emptySet());
-
- // Config cleared, SIM reloaded & config re-added right before teardown delay, staring new
- // vcnInstance.
- mTestLooper.moveTimeForward(
- VcnManagementService.CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS / 2);
- mTestLooper.dispatchAll();
- mVcnMgmtSvc.clearVcnConfig(TEST_UUID_2, TEST_PACKAGE_NAME);
- triggerSubscriptionTrackerCbAndGetSnapshot(TEST_UUID_2, Collections.singleton(TEST_UUID_2));
- final Vcn newInstance = startAndGetVcnInstance(TEST_UUID_2);
-
- // Verify that new instance was different, and the old one was torn down
- assertTrue(oldInstance != newInstance);
- verify(oldInstance).teardownAsynchronously();
-
- // Verify that even after the full timeout duration, the new VCN instance is not torn down
- mTestLooper.moveTimeForward(VcnManagementService.CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS);
- mTestLooper.dispatchAll();
- verify(newInstance, never()).teardownAsynchronously();
- }
-
@Test
public void testPackageChangeListenerRegistered() throws Exception {
verify(mMockContext).registerReceiver(any(BroadcastReceiver.class), argThat(filter -> {
@@ -925,6 +837,8 @@
private void setupSubscriptionAndStartVcn(
int subId, ParcelUuid subGrp, boolean isVcnActive, boolean hasCarrierPrivileges) {
mVcnMgmtSvc.systemReady();
+ mTestLooper.dispatchAll();
+
triggerSubscriptionTrackerCbAndGetSnapshot(
subGrp,
Collections.singleton(subGrp),
@@ -1020,6 +934,7 @@
private void setupTrackedCarrierWifiNetwork(NetworkCapabilities caps) {
mVcnMgmtSvc.systemReady();
+ mTestLooper.dispatchAll();
final ArgumentCaptor<NetworkCallback> captor =
ArgumentCaptor.forClass(NetworkCallback.class);
@@ -1264,15 +1179,14 @@
true /* isActive */,
true /* hasCarrierPrivileges */);
- // VCN is currently active. Lose carrier privileges for TEST_PACKAGE and hit teardown
- // timeout so the VCN goes inactive.
+ // VCN is currently active. Lose carrier privileges for TEST_PACKAGE so the VCN goes
+ // inactive.
final TelephonySubscriptionSnapshot snapshot =
triggerSubscriptionTrackerCbAndGetSnapshot(
TEST_UUID_1,
Collections.singleton(TEST_UUID_1),
Collections.singletonMap(TEST_SUBSCRIPTION_ID, TEST_UUID_1),
false /* hasCarrierPrivileges */);
- mTestLooper.moveTimeForward(VcnManagementService.CARRIER_PRIVILEGES_LOST_TEARDOWN_DELAY_MS);
mTestLooper.dispatchAll();
// Giving TEST_PACKAGE privileges again will restart the VCN (which will indicate ACTIVE
diff --git a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
index 1f0df62..978bf3e 100644
--- a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
+++ b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
@@ -22,6 +22,7 @@
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
import static android.telephony.TelephonyCallback.ActiveDataSubscriptionIdListener;
+import static android.telephony.TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED;
import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot;
import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionTrackerCallback;
@@ -34,8 +35,10 @@
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -57,6 +60,8 @@
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
+import android.telephony.TelephonyManager.CarrierPrivilegesListener;
+import android.util.ArrayMap;
import android.util.ArraySet;
import androidx.test.filters.SmallTest;
@@ -83,7 +88,7 @@
private static final String PACKAGE_NAME =
TelephonySubscriptionTrackerTest.class.getPackage().getName();
private static final ParcelUuid TEST_PARCEL_UUID = new ParcelUuid(UUID.randomUUID());
- private static final int TEST_SIM_SLOT_INDEX = 1;
+ private static final int TEST_SIM_SLOT_INDEX = 0;
private static final int TEST_SUBSCRIPTION_ID_1 = 2;
private static final SubscriptionInfo TEST_SUBINFO_1 = mock(SubscriptionInfo.class);
private static final int TEST_SUBSCRIPTION_ID_2 = 3;
@@ -151,6 +156,8 @@
@Before
public void setUp() throws Exception {
+ doReturn(2).when(mTelephonyManager).getActiveModemCount();
+
mCallback = mock(TelephonySubscriptionTrackerCallback.class);
mTelephonySubscriptionTracker =
new TelephonySubscriptionTracker(mContext, mHandler, mCallback, mDeps);
@@ -180,6 +187,15 @@
return captor.getValue();
}
+ private List<CarrierPrivilegesListener> getCarrierPrivilegesListeners() {
+ final ArgumentCaptor<CarrierPrivilegesListener> captor =
+ ArgumentCaptor.forClass(CarrierPrivilegesListener.class);
+ verify(mTelephonyManager, atLeastOnce())
+ .addCarrierPrivilegesListener(anyInt(), any(), captor.capture());
+
+ return captor.getAllValues();
+ }
+
private ActiveDataSubscriptionIdListener getActiveDataSubscriptionIdListener() {
final ArgumentCaptor<TelephonyCallback> captor =
ArgumentCaptor.forClass(TelephonyCallback.class);
@@ -188,6 +204,11 @@
return (ActiveDataSubscriptionIdListener) captor.getValue();
}
+ private Intent buildTestMultiSimConfigBroadcastIntent() {
+ Intent intent = new Intent(ACTION_MULTI_SIM_CONFIG_CHANGED);
+ return intent;
+ }
+
private Intent buildTestBroadcastIntent(boolean hasValidSubscription) {
Intent intent = new Intent(ACTION_CARRIER_CONFIG_CHANGED);
intent.putExtra(EXTRA_SLOT_INDEX, TEST_SIM_SLOT_INDEX);
@@ -239,12 +260,21 @@
any(),
eq(mHandler));
final IntentFilter filter = getIntentFilter();
- assertEquals(1, filter.countActions());
+ assertEquals(2, filter.countActions());
assertTrue(filter.hasAction(ACTION_CARRIER_CONFIG_CHANGED));
+ assertTrue(filter.hasAction(ACTION_MULTI_SIM_CONFIG_CHANGED));
verify(mSubscriptionManager)
.addOnSubscriptionsChangedListener(any(HandlerExecutor.class), any());
assertNotNull(getOnSubscriptionsChangedListener());
+
+ verify(mTelephonyManager, times(2))
+ .addCarrierPrivilegesListener(anyInt(), any(HandlerExecutor.class), any());
+ verify(mTelephonyManager)
+ .addCarrierPrivilegesListener(eq(0), any(HandlerExecutor.class), any());
+ verify(mTelephonyManager)
+ .addCarrierPrivilegesListener(eq(1), any(HandlerExecutor.class), any());
+ assertEquals(2, getCarrierPrivilegesListeners().size());
}
@Test
@@ -255,6 +285,49 @@
final OnSubscriptionsChangedListener listener = getOnSubscriptionsChangedListener();
verify(mSubscriptionManager).removeOnSubscriptionsChangedListener(eq(listener));
+
+ for (CarrierPrivilegesListener carrierPrivilegesListener :
+ getCarrierPrivilegesListeners()) {
+ verify(mTelephonyManager)
+ .removeCarrierPrivilegesListener(eq(carrierPrivilegesListener));
+ }
+ }
+
+ @Test
+ public void testMultiSimConfigChanged() throws Exception {
+ final ArrayMap<Integer, Integer> readySubIdsBySlotId = new ArrayMap<>();
+ readySubIdsBySlotId.put(TEST_SIM_SLOT_INDEX, TEST_SUBSCRIPTION_ID_1);
+ readySubIdsBySlotId.put(TEST_SIM_SLOT_INDEX + 1, TEST_SUBSCRIPTION_ID_1);
+
+ mTelephonySubscriptionTracker.setReadySubIdsBySlotId(readySubIdsBySlotId);
+ doReturn(1).when(mTelephonyManager).getActiveModemCount();
+
+ List<CarrierPrivilegesListener> carrierPrivilegesListeners =
+ getCarrierPrivilegesListeners();
+
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestMultiSimConfigBroadcastIntent());
+ mTestLooper.dispatchAll();
+
+ for (CarrierPrivilegesListener carrierPrivilegesListener : carrierPrivilegesListeners) {
+ verify(mTelephonyManager)
+ .removeCarrierPrivilegesListener(eq(carrierPrivilegesListener));
+ }
+
+ // Expect cache cleared for inactive slots.
+ assertNull(
+ mTelephonySubscriptionTracker
+ .getReadySubIdsBySlotId()
+ .get(TEST_SIM_SLOT_INDEX + 1));
+
+ // Expect a new CarrierPrivilegesListener to have been registered for slot 0, and none other
+ // (2 previously registered during startup, for slots 0 & 1)
+ verify(mTelephonyManager, times(3))
+ .addCarrierPrivilegesListener(anyInt(), any(HandlerExecutor.class), any());
+ verify(mTelephonyManager, times(2))
+ .addCarrierPrivilegesListener(eq(0), any(HandlerExecutor.class), any());
+
+ // Verify that this triggers a re-evaluation
+ verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(TEST_PRIVILEGED_PACKAGES)));
}
@Test
@@ -314,6 +387,17 @@
}
@Test
+ public void testOnCarrierPrivilegesChanged() throws Exception {
+ setupReadySubIds();
+
+ final CarrierPrivilegesListener listener = getCarrierPrivilegesListeners().get(0);
+ listener.onCarrierPrivilegesChanged(Collections.emptyList(), new int[] {});
+ mTestLooper.dispatchAll();
+
+ verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(TEST_PRIVILEGED_PACKAGES)));
+ }
+
+ @Test
public void testReceiveBroadcast_ConfigReadyWithSubscriptions() throws Exception {
mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
mTestLooper.dispatchAll();
diff --git a/tests/vcn/java/com/android/server/vcn/routeselection/NetworkPriorityClassifierTest.java b/tests/vcn/java/com/android/server/vcn/routeselection/NetworkPriorityClassifierTest.java
index 46a614f..4bb7de8 100644
--- a/tests/vcn/java/com/android/server/vcn/routeselection/NetworkPriorityClassifierTest.java
+++ b/tests/vcn/java/com/android/server/vcn/routeselection/NetworkPriorityClassifierTest.java
@@ -16,7 +16,9 @@
package com.android.server.vcn.routeselection;
-import static android.net.vcn.VcnUnderlyingNetworkPriority.NETWORK_QUALITY_OK;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_FORBIDDEN;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.MATCH_REQUIRED;
+import static android.net.vcn.VcnUnderlyingNetworkTemplate.NETWORK_QUALITY_OK;
import static com.android.server.vcn.VcnTestUtils.setupSystemService;
import static com.android.server.vcn.routeselection.NetworkPriorityClassifier.PRIORITY_ANY;
@@ -39,10 +41,10 @@
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.TelephonyNetworkSpecifier;
-import android.net.vcn.VcnCellUnderlyingNetworkPriority;
+import android.net.vcn.VcnCellUnderlyingNetworkTemplate;
import android.net.vcn.VcnGatewayConnectionConfig;
import android.net.vcn.VcnManager;
-import android.net.vcn.VcnWifiUnderlyingNetworkPriority;
+import android.net.vcn.VcnWifiUnderlyingNetworkTemplate;
import android.os.ParcelUuid;
import android.os.PersistableBundle;
import android.os.test.TestLooper;
@@ -142,10 +144,10 @@
@Test
public void testMatchWithoutNotMeteredBit() {
- final VcnWifiUnderlyingNetworkPriority wifiNetworkPriority =
- new VcnWifiUnderlyingNetworkPriority.Builder()
+ final VcnWifiUnderlyingNetworkTemplate wifiNetworkPriority =
+ new VcnWifiUnderlyingNetworkTemplate.Builder()
.setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(false /* allowMetered */)
+ .setMetered(MATCH_FORBIDDEN)
.build();
assertFalse(
@@ -161,10 +163,9 @@
private void verifyMatchWifi(
boolean isSelectedNetwork, PersistableBundle carrierConfig, boolean expectMatch) {
- final VcnWifiUnderlyingNetworkPriority wifiNetworkPriority =
- new VcnWifiUnderlyingNetworkPriority.Builder()
+ final VcnWifiUnderlyingNetworkTemplate wifiNetworkPriority =
+ new VcnWifiUnderlyingNetworkTemplate.Builder()
.setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(true /* allowMetered */)
.build();
final UnderlyingNetworkRecord selectedNetworkRecord =
isSelectedNetwork ? mWifiNetworkRecord : null;
@@ -211,11 +212,10 @@
private void verifyMatchWifiWithSsid(boolean useMatchedSsid, boolean expectMatch) {
final String nwPrioritySsid = useMatchedSsid ? SSID : SSID_OTHER;
- final VcnWifiUnderlyingNetworkPriority wifiNetworkPriority =
- new VcnWifiUnderlyingNetworkPriority.Builder()
+ final VcnWifiUnderlyingNetworkTemplate wifiNetworkPriority =
+ new VcnWifiUnderlyingNetworkTemplate.Builder()
.setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(true /* allowMetered */)
- .setSsid(nwPrioritySsid)
+ .setSsids(Set.of(nwPrioritySsid))
.build();
assertEquals(
@@ -237,11 +237,8 @@
verifyMatchWifiWithSsid(false /* useMatchedSsid */, false /* expectMatch */);
}
- private static VcnCellUnderlyingNetworkPriority.Builder getCellNetworkPriorityBuilder() {
- return new VcnCellUnderlyingNetworkPriority.Builder()
- .setNetworkQuality(NETWORK_QUALITY_OK)
- .setAllowMetered(true /* allowMetered */)
- .setAllowRoaming(true /* allowRoaming */);
+ private static VcnCellUnderlyingNetworkTemplate.Builder getCellNetworkPriorityBuilder() {
+ return new VcnCellUnderlyingNetworkTemplate.Builder().setNetworkQuality(NETWORK_QUALITY_OK);
}
@Test
@@ -257,10 +254,8 @@
@Test
public void testMatchOpportunisticCell() {
- final VcnCellUnderlyingNetworkPriority opportunisticCellNetworkPriority =
- getCellNetworkPriorityBuilder()
- .setRequireOpportunistic(true /* requireOpportunistic */)
- .build();
+ final VcnCellUnderlyingNetworkTemplate opportunisticCellNetworkPriority =
+ getCellNetworkPriorityBuilder().setOpportunistic(MATCH_REQUIRED).build();
when(mSubscriptionSnapshot.isOpportunistic(SUB_ID)).thenReturn(true);
when(mSubscriptionSnapshot.getAllSubIdsInGroup(SUB_GROUP)).thenReturn(new ArraySet<>());
@@ -277,9 +272,9 @@
private void verifyMatchMacroCellWithAllowedPlmnIds(
boolean useMatchedPlmnId, boolean expectMatch) {
final String networkPriorityPlmnId = useMatchedPlmnId ? PLMN_ID : PLMN_ID_OTHER;
- final VcnCellUnderlyingNetworkPriority networkPriority =
+ final VcnCellUnderlyingNetworkTemplate networkPriority =
getCellNetworkPriorityBuilder()
- .setAllowedOperatorPlmnIds(Set.of(networkPriorityPlmnId))
+ .setOperatorPlmnIds(Set.of(networkPriorityPlmnId))
.build();
assertEquals(
@@ -306,9 +301,9 @@
private void verifyMatchMacroCellWithAllowedSpecificCarrierIds(
boolean useMatchedCarrierId, boolean expectMatch) {
final int networkPriorityCarrierId = useMatchedCarrierId ? CARRIER_ID : CARRIER_ID_OTHER;
- final VcnCellUnderlyingNetworkPriority networkPriority =
+ final VcnCellUnderlyingNetworkTemplate networkPriority =
getCellNetworkPriorityBuilder()
- .setAllowedSpecificCarrierIds(Set.of(networkPriorityCarrierId))
+ .setSimSpecificCarrierIds(Set.of(networkPriorityCarrierId))
.build();
assertEquals(
@@ -335,8 +330,8 @@
@Test
public void testMatchWifiFailWithoutNotRoamingBit() {
- final VcnCellUnderlyingNetworkPriority networkPriority =
- getCellNetworkPriorityBuilder().setAllowRoaming(false /* allowRoaming */).build();
+ final VcnCellUnderlyingNetworkTemplate networkPriority =
+ getCellNetworkPriorityBuilder().setRoaming(MATCH_FORBIDDEN).build();
assertFalse(
checkMatchesCellPriorityRule(
@@ -353,7 +348,7 @@
calculatePriorityClass(
mVcnContext,
networkRecord,
- VcnGatewayConnectionConfig.DEFAULT_UNDERLYING_NETWORK_PRIORITIES,
+ VcnGatewayConnectionConfig.DEFAULT_UNDERLYING_NETWORK_TEMPLATES,
SUB_GROUP,
mSubscriptionSnapshot,
null /* currentlySelected */,
diff --git a/tools/aapt2/cmd/Compile_test.cpp b/tools/aapt2/cmd/Compile_test.cpp
index 8975713..fbfbf68 100644
--- a/tools/aapt2/cmd/Compile_test.cpp
+++ b/tools/aapt2/cmd/Compile_test.cpp
@@ -19,12 +19,11 @@
#include "android-base/file.h"
#include "android-base/stringprintf.h"
#include "android-base/utf8.h"
-
+#include "format/proto/ProtoDeserialize.h"
#include "io/StringStream.h"
#include "io/ZipArchive.h"
#include "java/AnnotationProcessor.h"
#include "test/Test.h"
-#include "format/proto/ProtoDeserialize.h"
namespace aapt {
@@ -59,55 +58,56 @@
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
const std::string kResDir = BuildPath({android::base::Dirname(android::base::GetExecutablePath()),
"integration-tests", "CompileTest", "res"});
+ const std::string kOutDir = testing::TempDir();
// Resource files without periods in the file name should not throw errors
const std::string path0 = BuildPath({kResDir, "values", "values.xml"});
- const std::string path0_out = BuildPath({kResDir, "values_values.arsc.flat"});
+ const std::string path0_out = BuildPath({kOutDir, "values_values.arsc.flat"});
::android::base::utf8::unlink(path0_out.c_str());
- ASSERT_EQ(TestCompile(path0, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_EQ(TestCompile(path0, kOutDir, /** legacy */ false, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path0_out.c_str()), 0);
- ASSERT_EQ(TestCompile(path0, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(TestCompile(path0, kOutDir, /** legacy */ true, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path0_out.c_str()), 0);
const std::string path1 = BuildPath({kResDir, "drawable", "image.png"});
- const std::string path1_out = BuildPath({kResDir, "drawable_image.png.flat"});
+ const std::string path1_out = BuildPath({kOutDir, "drawable_image.png.flat"});
::android::base::utf8::unlink(path1_out.c_str());
- ASSERT_EQ(TestCompile(path1, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_EQ(TestCompile(path1, kOutDir, /** legacy */ false, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path1_out.c_str()), 0);
- ASSERT_EQ(TestCompile(path1, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(TestCompile(path1, kOutDir, /** legacy */ true, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path1_out.c_str()), 0);
const std::string path2 = BuildPath({kResDir, "drawable", "image.9.png"});
- const std::string path2_out = BuildPath({kResDir, "drawable_image.9.png.flat"});
+ const std::string path2_out = BuildPath({kOutDir, "drawable_image.9.png.flat"});
::android::base::utf8::unlink(path2_out.c_str());
- ASSERT_EQ(TestCompile(path2, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_EQ(TestCompile(path2, kOutDir, /** legacy */ false, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path2_out.c_str()), 0);
- ASSERT_EQ(TestCompile(path2, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(TestCompile(path2, kOutDir, /** legacy */ true, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path2_out.c_str()), 0);
// Resource files with periods in the file name should fail on non-legacy compilations
const std::string path3 = BuildPath({kResDir, "values", "values.all.xml"});
- const std::string path3_out = BuildPath({kResDir, "values_values.all.arsc.flat"});
+ const std::string path3_out = BuildPath({kOutDir, "values_values.all.arsc.flat"});
::android::base::utf8::unlink(path3_out.c_str());
- ASSERT_NE(TestCompile(path3, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_NE(TestCompile(path3, kOutDir, /** legacy */ false, diag), 0);
ASSERT_NE(::android::base::utf8::unlink(path3_out.c_str()), 0);
- ASSERT_EQ(TestCompile(path3, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(TestCompile(path3, kOutDir, /** legacy */ true, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path3_out.c_str()), 0);
const std::string path4 = BuildPath({kResDir, "drawable", "image.small.png"});
- const std::string path4_out = BuildPath({kResDir, "drawable_image.small.png.flat"});
+ const std::string path4_out = BuildPath({kOutDir, "drawable_image.small.png.flat"});
::android::base::utf8::unlink(path4_out.c_str());
- ASSERT_NE(TestCompile(path4, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_NE(TestCompile(path4, kOutDir, /** legacy */ false, diag), 0);
ASSERT_NE(::android::base::utf8::unlink(path4_out.c_str()), 0);
- ASSERT_EQ(TestCompile(path4, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(TestCompile(path4, kOutDir, /** legacy */ true, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path4_out.c_str()), 0);
const std::string path5 = BuildPath({kResDir, "drawable", "image.small.9.png"});
- const std::string path5_out = BuildPath({kResDir, "drawable_image.small.9.png.flat"});
+ const std::string path5_out = BuildPath({kOutDir, "drawable_image.small.9.png.flat"});
::android::base::utf8::unlink(path5_out.c_str());
- ASSERT_NE(TestCompile(path5, kResDir, /** legacy */ false, diag), 0);
+ ASSERT_NE(TestCompile(path5, kOutDir, /** legacy */ false, diag), 0);
ASSERT_NE(::android::base::utf8::unlink(path5_out.c_str()), 0);
- ASSERT_EQ(TestCompile(path5, kResDir, /** legacy */ true, diag), 0);
+ ASSERT_EQ(TestCompile(path5, kOutDir, /** legacy */ true, diag), 0);
ASSERT_EQ(::android::base::utf8::unlink(path5_out.c_str()), 0);
}
@@ -116,9 +116,7 @@
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
const std::string kResDir = BuildPath({android::base::Dirname(android::base::GetExecutablePath()),
"integration-tests", "CompileTest", "DirInput", "res"});
- const std::string kOutputFlata =
- BuildPath({android::base::Dirname(android::base::GetExecutablePath()), "integration-tests",
- "CompileTest", "DirInput", "compiled.flata"});
+ const std::string kOutputFlata = BuildPath({testing::TempDir(), "compiled.flata"});
::android::base::utf8::unlink(kOutputFlata.c_str());
std::vector<android::StringPiece> args;
@@ -147,9 +145,7 @@
const std::string kResZip =
BuildPath({android::base::Dirname(android::base::GetExecutablePath()), "integration-tests",
"CompileTest", "ZipInput", "res.zip"});
- const std::string kOutputFlata =
- BuildPath({android::base::Dirname(android::base::GetExecutablePath()), "integration-tests",
- "CompileTest", "ZipInput", "compiled.flata"});
+ const std::string kOutputFlata = BuildPath({testing::TempDir(), "compiled.flata"});
::android::base::utf8::unlink(kOutputFlata.c_str());
@@ -257,9 +253,9 @@
TEST_F(CompilerTest, RelativePathTest) {
StdErrDiagnostics diag;
- const std::string res_path = BuildPath(
- {android::base::Dirname(android::base::GetExecutablePath()),
- "integration-tests", "CompileTest", "res"});
+ const std::string res_path =
+ BuildPath({android::base::Dirname(android::base::GetExecutablePath()), "integration-tests",
+ "CompileTest", "res"});
const std::string path_values_colors = GetTestPath("values/colors.xml");
WriteFile(path_values_colors, "<resources>"
@@ -272,9 +268,8 @@
"<TextBox android:id=\"@+id/text_one\" android:background=\"@color/color_one\"/>"
"</LinearLayout>");
- const std::string compiled_files_dir = BuildPath(
- {android::base::Dirname(android::base::GetExecutablePath()),
- "integration-tests", "CompileTest", "compiled"});
+ const std::string compiled_files_dir =
+ BuildPath({testing::TempDir(), "integration-tests", "CompileTest", "compiled"});
CHECK(file::mkdirs(compiled_files_dir.data()));
const std::string path_values_colors_out =
@@ -283,9 +278,8 @@
BuildPath({compiled_files_dir, "layout_layout_one.flat"});
::android::base::utf8::unlink(path_values_colors_out.c_str());
::android::base::utf8::unlink(path_layout_layout_one_out.c_str());
- const std::string apk_path = BuildPath(
- {android::base::Dirname(android::base::GetExecutablePath()),
- "integration-tests", "CompileTest", "out.apk"});
+ const std::string apk_path =
+ BuildPath({testing::TempDir(), "integration-tests", "CompileTest", "out.apk"});
const std::string source_set_res = BuildPath({"main", "res"});
const std::string relative_path_values_colors =
diff --git a/tools/aapt2/test/Fixture.cpp b/tools/aapt2/test/Fixture.cpp
index e2f71dc..ddc1853 100644
--- a/tools/aapt2/test/Fixture.cpp
+++ b/tools/aapt2/test/Fixture.cpp
@@ -67,8 +67,7 @@
}
void TestDirectoryFixture::SetUp() {
- temp_dir_ = file::BuildPath({android::base::GetExecutableDirectory(),
- "_temp",
+ temp_dir_ = file::BuildPath({testing::TempDir(), "_temp",
testing::UnitTest::GetInstance()->current_test_case()->name(),
testing::UnitTest::GetInstance()->current_test_info()->name()});
ASSERT_TRUE(file::mkdirs(temp_dir_));
@@ -236,4 +235,4 @@
return args_;
}
-} // namespace aapt
\ No newline at end of file
+} // namespace aapt