Merge "idmap2: clang-format"
diff --git a/api/current.txt b/api/current.txt
index 0a301e2..359ce3a 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -16904,6 +16904,10 @@
method public abstract void createReprocessableCaptureSessionByConfigurations(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method @NonNull public abstract String getId();
method public boolean isSessionConfigurationSupported(@NonNull android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
+ method public int setCameraAudioRestriction(int) throws android.hardware.camera2.CameraAccessException;
+ field public static final int AUDIO_RESTRICTION_NONE = 0; // 0x0
+ field public static final int AUDIO_RESTRICTION_VIBRATION = 1; // 0x1
+ field public static final int AUDIO_RESTRICTION_VIBRATION_SOUND = 3; // 0x3
field public static final int TEMPLATE_MANUAL = 6; // 0x6
field public static final int TEMPLATE_PREVIEW = 1; // 0x1
field public static final int TEMPLATE_RECORD = 3; // 0x3
diff --git a/api/system-current.txt b/api/system-current.txt
index e87007f..4ed9633 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -6104,6 +6104,30 @@
field public static final String WAIT_TIME_RETRY = "wait_time";
}
+ public static final class Telephony.CellBroadcasts implements android.provider.BaseColumns {
+ field public static final String CID = "cid";
+ field public static final String CMAS_CATEGORY = "cmas_category";
+ field public static final String CMAS_CERTAINTY = "cmas_certainty";
+ field public static final String CMAS_MESSAGE_CLASS = "cmas_message_class";
+ field public static final String CMAS_RESPONSE_TYPE = "cmas_response_type";
+ field public static final String CMAS_SEVERITY = "cmas_severity";
+ field public static final String CMAS_URGENCY = "cmas_urgency";
+ field @NonNull public static final android.net.Uri CONTENT_URI;
+ field public static final String DEFAULT_SORT_ORDER = "date DESC";
+ field public static final String DELIVERY_TIME = "date";
+ field public static final String ETWS_WARNING_TYPE = "etws_warning_type";
+ field public static final String GEOGRAPHICAL_SCOPE = "geo_scope";
+ field public static final String LAC = "lac";
+ field public static final String LANGUAGE_CODE = "language";
+ field public static final String MESSAGE_BODY = "body";
+ field public static final String MESSAGE_FORMAT = "format";
+ field public static final String MESSAGE_PRIORITY = "priority";
+ field public static final String MESSAGE_READ = "read";
+ field public static final String PLMN = "plmn";
+ field public static final String SERIAL_NUMBER = "serial_number";
+ field public static final String SERVICE_CATEGORY = "service_category";
+ }
+
public final class TimeZoneRulesDataContract {
field public static final String AUTHORITY = "com.android.timezone";
}
@@ -7936,7 +7960,125 @@
field public static final int ROAMING_TYPE_UNKNOWN = 1; // 0x1
}
+ public final class SmsCbCmasInfo implements android.os.Parcelable {
+ ctor public SmsCbCmasInfo(int, int, int, int, int, int);
+ method public int describeContents();
+ method public int getCategory();
+ method public int getCertainty();
+ method public int getMessageClass();
+ method public int getResponseType();
+ method public int getSeverity();
+ method public int getUrgency();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int CMAS_CATEGORY_CBRNE = 10; // 0xa
+ field public static final int CMAS_CATEGORY_ENV = 7; // 0x7
+ field public static final int CMAS_CATEGORY_FIRE = 5; // 0x5
+ field public static final int CMAS_CATEGORY_GEO = 0; // 0x0
+ field public static final int CMAS_CATEGORY_HEALTH = 6; // 0x6
+ field public static final int CMAS_CATEGORY_INFRA = 9; // 0x9
+ field public static final int CMAS_CATEGORY_MET = 1; // 0x1
+ field public static final int CMAS_CATEGORY_OTHER = 11; // 0xb
+ field public static final int CMAS_CATEGORY_RESCUE = 4; // 0x4
+ field public static final int CMAS_CATEGORY_SAFETY = 2; // 0x2
+ field public static final int CMAS_CATEGORY_SECURITY = 3; // 0x3
+ field public static final int CMAS_CATEGORY_TRANSPORT = 8; // 0x8
+ field public static final int CMAS_CATEGORY_UNKNOWN = -1; // 0xffffffff
+ field public static final int CMAS_CERTAINTY_LIKELY = 1; // 0x1
+ field public static final int CMAS_CERTAINTY_OBSERVED = 0; // 0x0
+ field public static final int CMAS_CERTAINTY_UNKNOWN = -1; // 0xffffffff
+ field public static final int CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY = 3; // 0x3
+ field public static final int CMAS_CLASS_CMAS_EXERCISE = 5; // 0x5
+ field public static final int CMAS_CLASS_EXTREME_THREAT = 1; // 0x1
+ field public static final int CMAS_CLASS_OPERATOR_DEFINED_USE = 6; // 0x6
+ field public static final int CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT = 0; // 0x0
+ field public static final int CMAS_CLASS_REQUIRED_MONTHLY_TEST = 4; // 0x4
+ field public static final int CMAS_CLASS_SEVERE_THREAT = 2; // 0x2
+ field public static final int CMAS_CLASS_UNKNOWN = -1; // 0xffffffff
+ field public static final int CMAS_RESPONSE_TYPE_ASSESS = 6; // 0x6
+ field public static final int CMAS_RESPONSE_TYPE_AVOID = 5; // 0x5
+ field public static final int CMAS_RESPONSE_TYPE_EVACUATE = 1; // 0x1
+ field public static final int CMAS_RESPONSE_TYPE_EXECUTE = 3; // 0x3
+ field public static final int CMAS_RESPONSE_TYPE_MONITOR = 4; // 0x4
+ field public static final int CMAS_RESPONSE_TYPE_NONE = 7; // 0x7
+ field public static final int CMAS_RESPONSE_TYPE_PREPARE = 2; // 0x2
+ field public static final int CMAS_RESPONSE_TYPE_SHELTER = 0; // 0x0
+ field public static final int CMAS_RESPONSE_TYPE_UNKNOWN = -1; // 0xffffffff
+ field public static final int CMAS_SEVERITY_EXTREME = 0; // 0x0
+ field public static final int CMAS_SEVERITY_SEVERE = 1; // 0x1
+ field public static final int CMAS_SEVERITY_UNKNOWN = -1; // 0xffffffff
+ field public static final int CMAS_URGENCY_EXPECTED = 1; // 0x1
+ field public static final int CMAS_URGENCY_IMMEDIATE = 0; // 0x0
+ field public static final int CMAS_URGENCY_UNKNOWN = -1; // 0xffffffff
+ field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbCmasInfo> CREATOR;
+ }
+
+ public final class SmsCbEtwsInfo implements android.os.Parcelable {
+ ctor public SmsCbEtwsInfo(int, boolean, boolean, boolean, @Nullable byte[]);
+ method public int describeContents();
+ method @Nullable public byte[] getPrimaryNotificationSignature();
+ method public long getPrimaryNotificationTimestamp();
+ method public int getWarningType();
+ method public boolean isEmergencyUserAlert();
+ method public boolean isPopupAlert();
+ method public boolean isPrimary();
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbEtwsInfo> CREATOR;
+ field public static final int ETWS_WARNING_TYPE_EARTHQUAKE = 0; // 0x0
+ field public static final int ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI = 2; // 0x2
+ field public static final int ETWS_WARNING_TYPE_OTHER_EMERGENCY = 4; // 0x4
+ field public static final int ETWS_WARNING_TYPE_TEST_MESSAGE = 3; // 0x3
+ field public static final int ETWS_WARNING_TYPE_TSUNAMI = 1; // 0x1
+ field public static final int ETWS_WARNING_TYPE_UNKNOWN = -1; // 0xffffffff
+ }
+
+ public final class SmsCbLocation implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getCid();
+ method public int getLac();
+ method @NonNull public String getPlmn();
+ method public boolean isInLocationArea(@NonNull android.telephony.SmsCbLocation);
+ method public boolean isInLocationArea(@Nullable String, int, int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbLocation> CREATOR;
+ }
+
+ public final class SmsCbMessage implements android.os.Parcelable {
+ ctor public SmsCbMessage(int, int, int, @NonNull android.telephony.SmsCbLocation, int, @Nullable String, @Nullable String, int, @Nullable android.telephony.SmsCbEtwsInfo, @Nullable android.telephony.SmsCbCmasInfo);
+ method @NonNull public static android.telephony.SmsCbMessage createFromCursor(@NonNull android.database.Cursor);
+ method public int describeContents();
+ method @Nullable public android.telephony.SmsCbCmasInfo getCmasWarningInfo();
+ method @NonNull public android.content.ContentValues getContentValues();
+ method @Nullable public android.telephony.SmsCbEtwsInfo getEtwsWarningInfo();
+ method public int getGeographicalScope();
+ method @Nullable public String getLanguageCode();
+ method @NonNull public android.telephony.SmsCbLocation getLocation();
+ method @Nullable public String getMessageBody();
+ method public int getMessageFormat();
+ method public int getMessagePriority();
+ method public long getReceivedTime();
+ method public int getSerialNumber();
+ method public int getServiceCategory();
+ method public boolean isCmasMessage();
+ method public boolean isEmergencyMessage();
+ method public boolean isEtwsMessage();
+ method public boolean needGeoFencingCheck();
+ method public void writeToParcel(android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.telephony.SmsCbMessage> CREATOR;
+ field public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE = 3; // 0x3
+ field public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE_IMMEDIATE = 0; // 0x0
+ field public static final int GEOGRAPHICAL_SCOPE_LOCATION_AREA_WIDE = 2; // 0x2
+ field public static final int GEOGRAPHICAL_SCOPE_PLMN_WIDE = 1; // 0x1
+ field public static final int MESSAGE_FORMAT_3GPP = 1; // 0x1
+ field public static final int MESSAGE_FORMAT_3GPP2 = 2; // 0x2
+ field public static final int MESSAGE_PRIORITY_EMERGENCY = 3; // 0x3
+ field public static final int MESSAGE_PRIORITY_INTERACTIVE = 1; // 0x1
+ field public static final int MESSAGE_PRIORITY_NORMAL = 0; // 0x0
+ field public static final int MESSAGE_PRIORITY_URGENT = 2; // 0x2
+ }
+
public final class SmsManager {
+ method public boolean disableCellBroadcastRange(int, int, int);
+ method public boolean enableCellBroadcastRange(int, int, int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>);
field public static final int RESULT_CANCELLED = 23; // 0x17
field public static final int RESULT_ENCODING_ERROR = 18; // 0x12
@@ -7966,6 +8108,7 @@
public class SubscriptionManager {
method public java.util.List<android.telephony.SubscriptionInfo> getAvailableSubscriptionInfoList();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEnabledSubscriptionId(int);
+ method @NonNull public static android.content.res.Resources getResourcesForSubId(@NonNull android.content.Context, int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSubscriptionEnabled(int);
method public void requestEmbeddedSubscriptionInfoListRefresh();
method public void requestEmbeddedSubscriptionInfoListRefresh(int);
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index db384ba..e1cb7ca 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -288,6 +288,48 @@
dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
SurfaceComposerClient::Transaction t;
+
+ // this guest property specifies multi-display IDs to show the boot animation
+ // multiple ids can be set with comma (,) as separator, for example:
+ // setprop boot.animation.displays 19260422155234049,19261083906282754
+ Vector<uint64_t> physicalDisplayIds;
+ char displayValue[PROPERTY_VALUE_MAX] = "";
+ property_get("boot.animation.displays", displayValue, "");
+ bool isValid = displayValue[0] != '\0';
+ if (isValid) {
+ char *p = displayValue;
+ while (*p) {
+ if (!isdigit(*p) && *p != ',') {
+ isValid = false;
+ break;
+ }
+ p ++;
+ }
+ if (!isValid)
+ SLOGE("Invalid syntax for the value of system prop: boot.animation.displays");
+ }
+ if (isValid) {
+ std::istringstream stream(displayValue);
+ for (PhysicalDisplayId id; stream >> id; ) {
+ physicalDisplayIds.add(id);
+ if (stream.peek() == ',')
+ stream.ignore();
+ }
+
+ // In the case of multi-display, boot animation shows on the specified displays
+ // in addition to the primary display
+ auto ids = SurfaceComposerClient::getPhysicalDisplayIds();
+ constexpr uint32_t LAYER_STACK = 0;
+ for (auto id : physicalDisplayIds) {
+ if (std::find(ids.begin(), ids.end(), id) != ids.end()) {
+ sp<IBinder> token = SurfaceComposerClient::getPhysicalDisplayToken(id);
+ if (token != nullptr)
+ t.setDisplayLayerStack(token, LAYER_STACK);
+ }
+ }
+ t.setLayerStack(control, LAYER_STACK);
+ }
+
t.setLayer(control, 0x40000000)
.apply();
diff --git a/config/boot-image-profile.txt b/config/boot-image-profile.txt
index 2ac8409..652669c 100644
--- a/config/boot-image-profile.txt
+++ b/config/boot-image-profile.txt
@@ -43765,3 +43765,1725 @@
HSPLjava/util/Arrays$ArrayList;-><init>([Ljava/lang/Object;)V
HSPLjava/util/regex/Matcher;-><init>(Ljava/util/regex/Pattern;Ljava/lang/CharSequence;)V
HSPLjava/util/Map;->getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+[[F
+[[J
+Landroid/accessibilityservice/IAccessibilityServiceClient$Stub;
+Landroid/accessibilityservice/IAccessibilityServiceClient$Stub$Proxy;
+[Landroid/accounts/Account;
+Landroid/accounts/AccountManager$17;
+Landroid/accounts/AccountManager$3;
+[Landroid/accounts/AuthenticatorDescription;
+Landroid/accounts/IAccountAuthenticator;
+Landroid/accounts/IAccountAuthenticator$Stub;
+Landroid/accounts/IAccountAuthenticator$Stub$Proxy;
+Landroid/accounts/IAccountManagerResponse$Stub$Proxy;
+Landroid/animation/AnimationHandler$2;
+[Landroid/animation/Animator;
+Landroid/animation/BidirectionalTypeConverter;
+[Landroid/animation/Keyframe;
+[Landroid/animation/Keyframe$FloatKeyframe;
+[Landroid/animation/Keyframe$IntKeyframe;
+[Landroid/animation/Keyframe$ObjectKeyframe;
+Landroid/animation/LayoutTransition$3;
+Landroid/animation/PathKeyframes$3;
+Landroid/animation/PathKeyframes$4;
+[Landroid/animation/PropertyValuesHolder;
+Landroid/animation/PropertyValuesHolder$1;
+[Landroid/apex/ApexInfo;
+Landroid/apex/ApexInfo;
+Landroid/app/-$$Lambda$ActivityThread$A4ykhsPb8qV3ffTqpQDklHSMDJ0;
+Landroid/app/-$$Lambda$ActivityThread$Wg40iAoNYFxps_KmrqtgptTB054;
+Landroid/app/-$$Lambda$ActivityTransitionState$yioLR6wQWjZ9DcWK5bibElIbsXc;
+Landroid/app/-$$Lambda$AppOpsManager$HistoricalOp$DkVcBvqB32SMHlxw0sWQPh3GL1A;
+Landroid/app/-$$Lambda$AppOpsManager$HistoricalOp$HUOLFYs8TiaQIOXcrq6JzjxA6gs;
+Landroid/app/-$$Lambda$AppOpsManager$HistoricalOp$Vs6pDL0wjOBTquwNnreWVbPQrn4;
+Landroid/app/-$$Lambda$FragmentTransition$jurn0WXuKw3bRQ_2d5zCWdeZWuI;
+Landroid/app/-$$Lambda$WallpaperManager$Globals$1AcnQUORvPlCjJoNqdxfQT4o4Nw;
+Landroid/app/-$$Lambda$WallpaperManager$Globals$2yG7V1sbMECCnlFTLyjKWKqNoYI;
+Landroid/app/Activity$1;
+Landroid/app/Activity$ManagedCursor;
+Landroid/app/Activity$ManagedDialog;
+Landroid/app/ActivityManager$TaskSnapshot;
+Landroid/app/ActivityTransitionState$1;
+Landroid/app/admin/DevicePolicyCache$EmptyDevicePolicyCache;
+Landroid/app/admin/DevicePolicyEventLogger;
+Landroid/app/admin/IDeviceAdminService;
+Landroid/app/admin/IDeviceAdminService$Stub$Proxy;
+Landroid/app/admin/StartInstallingUpdateCallback$Stub$Proxy;
+Landroid/app/AppCompatCallbacks;
+Landroid/app/ApplicationErrorReport;
+Landroid/app/ApplicationLoaders$CachedClassLoader;
+Landroid/app/ApplicationPackageManager$MoveCallbackDelegate;
+Landroid/app/AppOpsManager$1;
+Landroid/app/AppOpsManager$3;
+[Landroid/app/assist/AssistStructure$ViewNode;
+Landroid/app/AutomaticZenRule;
+[Landroid/app/BackStackState;
+Landroid/app/BackStackState;
+Landroid/app/backup/BlobBackupHelper;
+Landroid/app/backup/IBackupCallback$Stub;
+Landroid/app/backup/IBackupCallback$Stub$Proxy;
+Landroid/app/backup/IBackupManagerMonitor$Stub;
+Landroid/app/backup/IBackupManagerMonitor$Stub$Proxy;
+Landroid/app/backup/IBackupObserver$Stub;
+Landroid/app/backup/IBackupObserver$Stub$Proxy;
+Landroid/app/backup/IFullBackupRestoreObserver$Stub;
+Landroid/app/backup/IFullBackupRestoreObserver$Stub$Proxy;
+Landroid/app/backup/ISelectBackupTransportCallback$Stub;
+Landroid/app/backup/ISelectBackupTransportCallback$Stub$Proxy;
+Landroid/app/DownloadManager$CursorTranslator;
+Landroid/app/EnterTransitionCoordinator;
+Landroid/app/ExitTransitionCoordinator;
+Landroid/app/Fragment$InstantiationException;
+Landroid/app/FragmentManager$FragmentLifecycleCallbacks;
+Landroid/app/FragmentManager$OnBackStackChangedListener;
+Landroid/app/FragmentManagerImpl$2;
+Landroid/app/FragmentManagerImpl$AnimateOnHWLayerIfNeededListener;
+Landroid/app/FragmentManagerImpl$StartEnterTransitionListener;
+Landroid/app/FragmentManagerNonConfig;
+[Landroid/app/FragmentState;
+Landroid/app/FragmentTransition$2;
+Landroid/app/FragmentTransition$5;
+Landroid/app/IActivityController$Stub;
+Landroid/app/IActivityController$Stub$Proxy;
+Landroid/app/IAlarmCompleteListener$Stub$Proxy;
+Landroid/app/IAlarmListener$Stub$Proxy;
+Landroid/app/IAssistDataReceiver;
+Landroid/app/IAssistDataReceiver$Stub;
+Landroid/app/IAssistDataReceiver$Stub$Proxy;
+Landroid/app/IBackupAgent$Stub$Proxy;
+Landroid/app/IInstantAppResolver;
+Landroid/app/IInstantAppResolver$Stub;
+Landroid/app/IInstantAppResolver$Stub$Proxy;
+Landroid/app/IInstrumentationWatcher$Stub$Proxy;
+Landroid/app/Instrumentation$ActivityGoing;
+Landroid/app/Instrumentation$ActivityMonitor;
+Landroid/app/Instrumentation$ActivityWaiter;
+Landroid/app/IProcessObserver$Stub$Proxy;
+Landroid/app/IRequestFinishCallback$Stub;
+Landroid/app/IRequestFinishCallback$Stub$Proxy;
+Landroid/app/IServiceConnection$Stub$Proxy;
+Landroid/app/IStopUserCallback$Stub;
+Landroid/app/IStopUserCallback$Stub$Proxy;
+Landroid/app/ITransientNotification$Stub$Proxy;
+Landroid/app/IUiAutomationConnection$Stub$Proxy;
+Landroid/app/IUriGrantsManager$Stub$Proxy;
+Landroid/app/job/IJobService$Stub$Proxy;
+[Landroid/app/job/JobInfo$TriggerContentUri;
+Landroid/app/LoadedApk$SplitDependencyLoaderImpl;
+[Landroid/app/LoaderManagerImpl;
+[Landroid/app/Notification$Action;
+Landroid/app/Notification$BubbleMetadata;
+[Landroid/app/NotificationChannel;
+[Landroid/app/NotificationChannelGroup;
+Landroid/app/PackageInstallObserver$1;
+Landroid/app/PendingIntent$FinishedDispatcher;
+[Landroid/app/Person;
+Landroid/app/PictureInPictureParams;
+Landroid/app/prediction/AppPredictionContext;
+Landroid/app/prediction/AppPredictionSessionId;
+Landroid/app/prediction/AppPredictor;
+Landroid/app/prediction/AppTarget;
+Landroid/app/prediction/AppTargetEvent;
+Landroid/app/prediction/AppTargetId;
+Landroid/app/prediction/IPredictionCallback$Stub;
+Landroid/app/prediction/IPredictionCallback$Stub$Proxy;
+Landroid/app/prediction/IPredictionManager$Stub$Proxy;
+Landroid/app/RemoteAction;
+[Landroid/app/RemoteInput;
+Landroid/app/RemoteServiceException;
+Landroid/app/role/-$$Lambda$o94o2jK_ei-IVw-3oY_QJ49zpAA;
+Landroid/app/role/-$$Lambda$RoleControllerManager$9hUe0y0G47wIHKhViIp3z2IRAIk;
+Landroid/app/role/-$$Lambda$RoleControllerManager$Jsb4ev7pHUqel8_lglNSRLiUzpg;
+Landroid/app/role/IOnRoleHoldersChangedListener$Stub$Proxy;
+Landroid/app/role/IRoleController$Stub;
+Landroid/app/SearchableInfo;
+Landroid/app/SearchableInfo$ActionKeyInfo;
+Landroid/app/servertransaction/ActivityConfigurationChangeItem;
+[Landroid/app/slice/SliceItem;
+[Landroid/app/slice/SliceSpec;
+Landroid/app/StatsManager$StatsdDeathRecipient;
+Landroid/app/trust/TrustManager$1;
+Landroid/app/trust/TrustManager$TrustListener;
+Landroid/app/usage/ICacheQuotaService$Stub$Proxy;
+Landroid/app/usage/NetworkStatsManager$CallbackHandler;
+Landroid/app/usage/NetworkStatsManager$UsageCallback;
+Landroid/app/VoiceInteractor;
+Landroid/app/Vr2dDisplayProperties;
+Landroid/app/WallpaperInfo;
+Landroid/app/WallpaperManager$OnColorsChangedListener;
+Landroid/appwidget/AppWidgetProviderInfo;
+Landroid/bluetooth/-$$Lambda$BluetoothAdapter$2$INSd_aND-SGWhhPZUtIqya_Uxw4;
+Landroid/bluetooth/BluetoothA2dpSink;
+Landroid/bluetooth/BluetoothAvrcpController;
+[Landroid/bluetooth/BluetoothCodecConfig;
+Landroid/bluetooth/BluetoothCodecStatus;
+[Landroid/bluetooth/BluetoothDevice;
+Landroid/bluetooth/BluetoothGattService;
+Landroid/bluetooth/BluetoothHeadsetClient;
+Landroid/bluetooth/BluetoothHidDevice$1;
+Landroid/bluetooth/BluetoothHidDeviceAppQosSettings;
+Landroid/bluetooth/BluetoothHidDeviceAppSdpSettings;
+Landroid/bluetooth/BluetoothHidHost$1;
+Landroid/bluetooth/BluetoothMap$1;
+Landroid/bluetooth/BluetoothMapClient;
+Landroid/bluetooth/BluetoothPan$1;
+Landroid/bluetooth/BluetoothPbap$1;
+Landroid/bluetooth/BluetoothPbap$2;
+Landroid/bluetooth/BluetoothPbapClient;
+Landroid/bluetooth/BluetoothProfileConnector$1;
+Landroid/bluetooth/BluetoothProfileConnector$2;
+Landroid/bluetooth/BluetoothSap$1;
+Landroid/bluetooth/IBluetoothGattCallback$Stub;
+Landroid/bluetooth/IBluetoothGattCallback$Stub$Proxy;
+Landroid/bluetooth/IBluetoothGattServerCallback$Stub;
+Landroid/bluetooth/IBluetoothGattServerCallback$Stub$Proxy;
+Landroid/bluetooth/IBluetoothHidDevice$Stub$Proxy;
+Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub;
+Landroid/bluetooth/IBluetoothHidDeviceCallback$Stub$Proxy;
+Landroid/bluetooth/IBluetoothHidHost$Stub$Proxy;
+Landroid/bluetooth/IBluetoothMap$Stub$Proxy;
+Landroid/bluetooth/IBluetoothMetadataListener$Stub$Proxy;
+Landroid/bluetooth/IBluetoothPan$Stub$Proxy;
+Landroid/bluetooth/IBluetoothPbap$Stub$Proxy;
+Landroid/bluetooth/IBluetoothProfileServiceConnection$Stub$Proxy;
+Landroid/bluetooth/IBluetoothSap$Stub$Proxy;
+Landroid/bluetooth/IBluetoothStateChangeCallback$Stub$Proxy;
+Landroid/bluetooth/le/AdvertiseData;
+Landroid/bluetooth/le/AdvertisingSetParameters;
+Landroid/bluetooth/le/BluetoothLeScanner;
+Landroid/bluetooth/le/IAdvertisingSetCallback$Stub;
+Landroid/bluetooth/le/IAdvertisingSetCallback$Stub$Proxy;
+Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub;
+Landroid/bluetooth/le/IPeriodicAdvertisingCallback$Stub$Proxy;
+Landroid/bluetooth/le/IScannerCallback$Stub;
+Landroid/bluetooth/le/PeriodicAdvertisingParameters;
+Landroid/bluetooth/OobData;
+[Landroid/bluetooth/UidTraffic;
+Landroid/companion/AssociationRequest;
+Landroid/companion/ICompanionDeviceManager$Stub$Proxy;
+Landroid/companion/IFindDeviceCallback$Stub;
+Landroid/companion/IFindDeviceCallback$Stub$Proxy;
+Landroid/compat/Compatibility;
+Landroid/content/ClipData;
+Landroid/content/ClipData$Item;
+Landroid/content/ClipDescription;
+Landroid/content/ContentProviderClient$NotRespondingRunnable;
+[Landroid/content/ContentValues;
+[Landroid/content/Intent;
+[Landroid/content/IntentFilter;
+Landroid/content/IntentSender$FinishedDispatcher;
+Landroid/content/IOnPrimaryClipChangedListener$Stub$Proxy;
+Landroid/content/IRestrictionsManager$Stub$Proxy;
+Landroid/content/ISyncAdapter$Stub$Proxy;
+Landroid/content/ISyncStatusObserver$Stub$Proxy;
+Landroid/content/LocusId;
+Landroid/content/om/IOverlayManager$Stub$Proxy;
+Landroid/content/pm/-$$Lambda$ciir_QAmv6RwJro4I58t77dPnxU;
+Landroid/content/pm/-$$Lambda$n3uXeb1v-YRmq_BWTfosEqUUr9g;
+Landroid/content/pm/-$$Lambda$PackageParser$0aobsT7Zf7WVZCqMZ5z2clAuQf4;
+Landroid/content/pm/-$$Lambda$PackageParser$0DZRgzfgaIMpCOhJqjw6PUiU5vw;
+Landroid/content/pm/-$$Lambda$PackageParser$M-9fHqS_eEp1oYkuKJhRHOGUxf8;
+Landroid/content/pm/-$$Lambda$T1UQAuePWRRmVQ1KzTyMAktZUPM;
+Landroid/content/pm/-$$Lambda$zO9HBUVgPeroyDQPLJE-MNMvSqc;
+[Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/BaseParceledListSlice$1;
+[Landroid/content/pm/ConfigurationInfo;
+Landroid/content/pm/dex/DexMetadataHelper;
+Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback$Stub;
+Landroid/content/pm/dex/ISnapshotRuntimeProfileCallback$Stub$Proxy;
+[Landroid/content/pm/FeatureGroupInfo;
+[Landroid/content/pm/FeatureInfo;
+Landroid/content/pm/IDexModuleRegisterCallback$Stub;
+Landroid/content/pm/IDexModuleRegisterCallback$Stub$Proxy;
+Landroid/content/pm/InstantAppIntentFilter;
+Landroid/content/pm/InstantAppResolveInfo;
+Landroid/content/pm/InstantAppResolveInfo$InstantAppDigest;
+[Landroid/content/pm/InstrumentationInfo;
+Landroid/content/pm/IOnAppsChangedListener$Stub$Proxy;
+Landroid/content/pm/IPackageDataObserver$Stub$Proxy;
+Landroid/content/pm/IPackageDeleteObserver$Stub;
+Landroid/content/pm/IPackageDeleteObserver$Stub$Proxy;
+Landroid/content/pm/IPackageDeleteObserver2$Stub;
+Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;
+Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;
+Landroid/content/pm/IPackageMoveObserver$Stub$Proxy;
+Landroid/content/pm/IPackageStatsObserver$Stub$Proxy;
+Landroid/content/pm/KeySet;
+Landroid/content/pm/LauncherActivityInfo;
+Landroid/content/pm/LauncherApps$CallbackMessageHandler;
+[Landroid/content/pm/PackageInfo;
+Landroid/content/pm/PackageParser$Instrumentation;
+[Landroid/content/pm/PathPermission;
+[Landroid/content/pm/PermissionInfo;
+[Landroid/content/pm/ProviderInfo;
+[Landroid/content/pm/ServiceInfo;
+[Landroid/content/pm/Signature;
+Landroid/content/pm/SigningInfo;
+Landroid/content/pm/split/SplitAssetDependencyLoader;
+Landroid/content/pm/split/SplitDependencyLoader;
+Landroid/content/pm/SuspendDialogInfo;
+[Landroid/content/pm/VerifierInfo;
+Landroid/content/res/AssetFileDescriptor$AutoCloseInputStream;
+[Landroid/content/res/ColorStateList;
+Landroid/content/res/CompatibilityInfo$Translator;
+Landroid/content/res/FontResourcesParser$FontFamilyFilesResourceEntry;
+[Landroid/content/res/FontResourcesParser$FontFileResourceEntry;
+Landroid/content/res/GradientColor$GradientColorFactory;
+Landroid/content/res/StringBlock$Height;
+[Landroid/content/res/XmlBlock;
+Landroid/content/rollback/IRollbackManager$Stub$Proxy;
+[Landroid/content/SyncAdapterType;
+[Landroid/content/UndoOwner;
+[Landroid/database/CursorWindow;
+Landroid/database/sqlite/SQLiteBindOrColumnIndexOutOfRangeException;
+[Landroid/database/sqlite/SQLiteConnection$Operation;
+Landroid/database/sqlite/SQLiteConnectionPool$1;
+Landroid/database/sqlite/SQLiteDebug$NoPreloadHolder;
+Landroid/database/sqlite/SqliteWrapper;
+Landroid/database/StaleDataException;
+Landroid/graphics/-$$Lambda$ColorSpace$Rgb$iMkODTKa3_8kPZUnZZerD2Lv-yo;
+Landroid/graphics/-$$Lambda$ColorSpace$Rgb$V_0lmM2WEpxGBDV_1G1wvvidn7Y;
+Landroid/graphics/BlendMode$1;
+[Landroid/graphics/ColorSpace;
+Landroid/graphics/ColorSpace$RenderIntent;
+Landroid/graphics/drawable/-$$Lambda$AnimatedVectorDrawable$VectorDrawableAnimatorRT$PzjgSeyQweoFjbEZJP80UteZqm8;
+Landroid/graphics/drawable/-$$Lambda$Drawable$bbJz2VgQAwkXlE27mR8nPMYacEw;
+[Landroid/graphics/drawable/AdaptiveIconDrawable$ChildDrawable;
+Landroid/graphics/drawable/AnimatedImageDrawable$State;
+Landroid/graphics/drawable/AnimatedRotateDrawable$1;
+Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatableTransition;
+Landroid/graphics/drawable/AnimatedStateListDrawable$AnimationDrawableTransition;
+Landroid/graphics/drawable/AnimatedVectorDrawable$2;
+Landroid/graphics/drawable/AnimatedVectorDrawable$VectorDrawableAnimatorUI;
+Landroid/graphics/drawable/ColorStateListDrawable;
+Landroid/graphics/drawable/ColorStateListDrawable$ColorStateListDrawableState;
+[Landroid/graphics/drawable/Drawable;
+Landroid/graphics/drawable/DrawableContainer$1;
+[Landroid/graphics/drawable/LayerDrawable$ChildDrawable;
+Landroid/graphics/drawable/LevelListDrawable;
+Landroid/graphics/drawable/LevelListDrawable$LevelListState;
+[Landroid/graphics/drawable/RippleForeground;
+[Landroid/graphics/fonts/FontFamily;
+Landroid/graphics/fonts/FontFileUtil;
+[Landroid/graphics/fonts/FontVariationAxis;
+Landroid/graphics/LeakyTypefaceStorage;
+Landroid/graphics/Rect$UnflattenHelper;
+Landroid/gsi/IGsiService;
+Landroid/gsi/IGsiService$Stub;
+Landroid/gsi/IGsiService$Stub$Proxy;
+Landroid/hardware/biometrics/IBiometricConfirmDeviceCredentialCallback$Stub;
+Landroid/hardware/biometrics/IBiometricConfirmDeviceCredentialCallback$Stub$Proxy;
+Landroid/hardware/biometrics/IBiometricService$Stub$Proxy;
+Landroid/hardware/biometrics/IBiometricServiceReceiver$Stub;
+Landroid/hardware/biometrics/IBiometricServiceReceiver$Stub$Proxy;
+Landroid/hardware/biometrics/IBiometricServiceReceiverInternal$Stub$Proxy;
+Landroid/hardware/camera2/CameraManager$AvailabilityCallback;
+Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;
+Landroid/hardware/camera2/CameraManager$TorchCallback;
+Landroid/hardware/camera2/impl/CameraDeviceImpl;
+Landroid/hardware/camera2/impl/CameraDeviceImpl$CameraHandlerExecutor;
+Landroid/hardware/camera2/legacy/LegacyMetadataMapper;
+Landroid/hardware/camera2/marshal/impl/MarshalQueryableBoolean$MarshalerBoolean;
+[Landroid/hardware/camera2/marshal/MarshalQueryable;
+Landroid/hardware/camera2/utils/ArrayUtils;
+[Landroid/hardware/CameraStatus;
+Landroid/hardware/CameraStatus;
+Landroid/hardware/contexthub/V1_0/ContextHubMsg;
+Landroid/hardware/contexthub/V1_0/MemRange;
+Landroid/hardware/contexthub/V1_0/PhysicalSensor;
+Landroid/hardware/display/-$$Lambda$NightDisplayListener$sOK1HmSbMnFLzc4SdDD1WpVWJiI;
+Landroid/hardware/display/IVirtualDisplayCallback$Stub;
+Landroid/hardware/display/IVirtualDisplayCallback$Stub$Proxy;
+Landroid/hardware/display/NightDisplayListener;
+Landroid/hardware/display/NightDisplayListener$1;
+Landroid/hardware/display/Time;
+Landroid/hardware/fingerprint/IFingerprintClientActiveCallback$Stub;
+Landroid/hardware/fingerprint/IFingerprintClientActiveCallback$Stub$Proxy;
+Landroid/hardware/fingerprint/IFingerprintServiceReceiver$Stub$Proxy;
+Landroid/hardware/input/IInputDevicesChangedListener$Stub$Proxy;
+Landroid/hardware/input/ITabletModeChangedListener$Stub;
+Landroid/hardware/input/ITabletModeChangedListener$Stub$Proxy;
+Landroid/hardware/ISensorPrivacyManager$Stub$Proxy;
+Landroid/hardware/location/ContextHubClient;
+Landroid/hardware/location/ContextHubManager$2;
+Landroid/hardware/location/ContextHubManager$3;
+Landroid/hardware/location/ContextHubManager$4;
+Landroid/hardware/location/ContextHubMessage;
+Landroid/hardware/location/ContextHubTransaction;
+Landroid/hardware/location/GeofenceHardwareImpl;
+Landroid/hardware/location/GeofenceHardwareImpl$1;
+Landroid/hardware/location/GeofenceHardwareImpl$2;
+Landroid/hardware/location/GeofenceHardwareImpl$3;
+Landroid/hardware/location/GeofenceHardwareImpl$GeofenceTransition;
+Landroid/hardware/location/GeofenceHardwareImpl$Reaper;
+Landroid/hardware/location/GeofenceHardwareMonitorEvent;
+Landroid/hardware/location/GeofenceHardwareRequest;
+[Landroid/hardware/location/GeofenceHardwareRequestParcelable;
+Landroid/hardware/location/GeofenceHardwareRequestParcelable;
+Landroid/hardware/location/GeofenceHardwareService$1;
+Landroid/hardware/location/IActivityRecognitionHardware$Stub$Proxy;
+Landroid/hardware/location/IActivityRecognitionHardwareClient;
+Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub;
+Landroid/hardware/location/IActivityRecognitionHardwareClient$Stub$Proxy;
+Landroid/hardware/location/IContextHubCallback$Stub$Proxy;
+Landroid/hardware/location/IContextHubClient$Stub$Proxy;
+Landroid/hardware/location/IContextHubClientCallback$Stub$Proxy;
+Landroid/hardware/location/IContextHubService$Stub$Proxy;
+Landroid/hardware/location/IContextHubTransactionCallback$Stub$Proxy;
+Landroid/hardware/location/IGeofenceHardware;
+Landroid/hardware/location/IGeofenceHardware$Stub$Proxy;
+Landroid/hardware/location/IGeofenceHardwareCallback;
+Landroid/hardware/location/IGeofenceHardwareCallback$Stub;
+Landroid/hardware/location/IGeofenceHardwareCallback$Stub$Proxy;
+Landroid/hardware/location/IGeofenceHardwareMonitorCallback;
+Landroid/hardware/location/IGeofenceHardwareMonitorCallback$Stub;
+Landroid/hardware/location/IGeofenceHardwareMonitorCallback$Stub$Proxy;
+[Landroid/hardware/location/MemoryRegion;
+Landroid/hardware/location/NanoApp;
+Landroid/hardware/location/NanoAppBinary;
+Landroid/hardware/location/NanoAppFilter;
+Landroid/hardware/radio/config/V1_1/ModemsConfig;
+Landroid/hardware/radio/config/V1_2/SimSlotStatus;
+Landroid/hardware/radio/deprecated/V1_0/IOemHook$Proxy;
+Landroid/hardware/radio/V1_0/Call;
+Landroid/hardware/radio/V1_0/CallForwardInfo;
+Landroid/hardware/radio/V1_0/CarrierRestrictions;
+Landroid/hardware/radio/V1_0/CdmaCallWaiting;
+Landroid/hardware/radio/V1_0/CdmaInformationRecords;
+Landroid/hardware/radio/V1_0/CdmaSignalInfoRecord;
+Landroid/hardware/radio/V1_0/CdmaSmsAddress;
+Landroid/hardware/radio/V1_0/CdmaSmsMessage;
+Landroid/hardware/radio/V1_0/CdmaSmsSubaddress;
+Landroid/hardware/radio/V1_0/CellIdentity;
+Landroid/hardware/radio/V1_0/CellIdentityCdma;
+Landroid/hardware/radio/V1_0/CellIdentityGsm;
+Landroid/hardware/radio/V1_0/CellIdentityTdscdma;
+Landroid/hardware/radio/V1_0/CellIdentityWcdma;
+Landroid/hardware/radio/V1_0/CellInfo;
+Landroid/hardware/radio/V1_0/CellInfoGsm;
+Landroid/hardware/radio/V1_0/CellInfoLte;
+Landroid/hardware/radio/V1_0/CellInfoTdscdma;
+Landroid/hardware/radio/V1_0/CellInfoWcdma;
+Landroid/hardware/radio/V1_0/DataCallFailCause;
+Landroid/hardware/radio/V1_0/GsmSmsMessage;
+Landroid/hardware/radio/V1_0/HardwareConfigModem;
+Landroid/hardware/radio/V1_0/HardwareConfigSim;
+Landroid/hardware/radio/V1_0/ImsSmsMessage;
+Landroid/hardware/radio/V1_0/LastCallFailCauseInfo;
+Landroid/hardware/radio/V1_0/LceDataInfo;
+Landroid/hardware/radio/V1_0/LceStatusInfo;
+Landroid/hardware/radio/V1_0/NeighboringCell;
+Landroid/hardware/radio/V1_0/OperatorInfo;
+Landroid/hardware/radio/V1_0/PcoDataInfo;
+Landroid/hardware/radio/V1_0/SendSmsResult;
+Landroid/hardware/radio/V1_0/SignalStrength;
+Landroid/hardware/radio/V1_0/SimApdu;
+Landroid/hardware/radio/V1_0/SimRefreshResult;
+Landroid/hardware/radio/V1_0/StkCcUnsolSsResult;
+Landroid/hardware/radio/V1_0/SuppSvcNotification;
+Landroid/hardware/radio/V1_0/UusInfo;
+Landroid/hardware/radio/V1_1/IRadio$Proxy;
+Landroid/hardware/radio/V1_1/KeepaliveStatus;
+Landroid/hardware/radio/V1_1/NetworkScanResult;
+Landroid/hardware/radio/V1_2/CellIdentityCdma;
+Landroid/hardware/radio/V1_2/CellIdentityGsm;
+Landroid/hardware/radio/V1_2/CellIdentityLte;
+Landroid/hardware/radio/V1_2/CellIdentityTdscdma;
+Landroid/hardware/radio/V1_2/CellIdentityWcdma;
+Landroid/hardware/radio/V1_2/CellInfoCdma;
+Landroid/hardware/radio/V1_2/CellInfoGsm;
+Landroid/hardware/radio/V1_2/CellInfoLte;
+Landroid/hardware/radio/V1_2/CellInfoTdscdma;
+Landroid/hardware/radio/V1_2/CellInfoWcdma;
+Landroid/hardware/radio/V1_2/LinkCapacityEstimate;
+Landroid/hardware/radio/V1_2/NetworkScanResult;
+Landroid/hardware/radio/V1_2/PhysicalChannelConfig;
+Landroid/hardware/radio/V1_2/TdscdmaSignalStrength;
+Landroid/hardware/radio/V1_4/CardStatus;
+Landroid/hardware/radio/V1_4/CarrierRestrictionsWithPriority;
+Landroid/hardware/radio/V1_4/CellInfo;
+Landroid/hardware/radio/V1_4/DataRegStateResult;
+Landroid/hardware/radio/V1_4/DataRegStateResult$VopsInfo;
+Landroid/hardware/radio/V1_4/EmergencyNumber;
+Landroid/hardware/radio/V1_4/NetworkScanResult;
+Landroid/hardware/radio/V1_4/NrIndicators;
+Landroid/hardware/radio/V1_4/PhysicalChannelConfig;
+Landroid/hardware/radio/V1_4/SetupDataCallResult;
+Landroid/hardware/radio/V1_4/SignalStrength;
+Landroid/hardware/SensorAdditionalInfo;
+Landroid/hardware/SensorPrivacyManager$1;
+Landroid/hardware/soundtrigger/IRecognitionStatusCallback;
+Landroid/hardware/soundtrigger/IRecognitionStatusCallback$Stub;
+Landroid/hardware/soundtrigger/IRecognitionStatusCallback$Stub$Proxy;
+[Landroid/hardware/soundtrigger/SoundTrigger$ConfidenceLevel;
+[Landroid/hardware/soundtrigger/SoundTrigger$KeyphraseRecognitionExtra;
+Landroid/hardware/soundtrigger/SoundTriggerModule$NativeEventHandlerDelegate;
+Landroid/hardware/soundtrigger/SoundTriggerModule$NativeEventHandlerDelegate$1;
+Landroid/hardware/SystemSensorManager$TriggerEventQueue;
+Landroid/hardware/TriggerEvent;
+Landroid/hardware/usb/UsbAccessory;
+Landroid/icu/impl/locale/InternalLocaleBuilder;
+Landroid/icu/impl/locale/LanguageTag;
+Landroid/icu/text/BidiLine;
+Landroid/icu/text/Edits$Iterator;
+Landroid/inputmethodservice/-$$Lambda$InputMethodService$8T9TmAUIN7vW9eU6kTg8309_d4E;
+Landroid/inputmethodservice/-$$Lambda$InputMethodService$wp8DeVGx_WDOPw4F6an7QbwVxf0;
+Landroid/inputmethodservice/AbstractInputMethodService;
+Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl;
+Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl;
+Landroid/inputmethodservice/IInputMethodSessionWrapper;
+Landroid/inputmethodservice/IInputMethodSessionWrapper$ImeInputEventReceiver;
+Landroid/inputmethodservice/IInputMethodWrapper;
+Landroid/inputmethodservice/IInputMethodWrapper$InputMethodSessionCallbackWrapper;
+Landroid/inputmethodservice/InputMethodService;
+Landroid/inputmethodservice/InputMethodService$InputMethodSessionImpl;
+Landroid/inputmethodservice/InputMethodService$Insets;
+Landroid/inputmethodservice/InputMethodService$SettingsObserver;
+Landroid/internal/hidl/base/V1_0/DebugInfo;
+Landroid/location/Country;
+Landroid/location/CountryDetector$ListenerTransport;
+Landroid/location/Criteria;
+Landroid/location/Geofence;
+Landroid/location/GnssClock;
+Landroid/location/GnssMeasurement;
+Landroid/location/GnssMeasurementCorrections;
+Landroid/location/IBatchedLocationCallback$Stub$Proxy;
+Landroid/location/ICountryListener$Stub;
+Landroid/location/ICountryListener$Stub$Proxy;
+Landroid/location/IFusedGeofenceHardware$Stub;
+Landroid/location/IFusedGeofenceHardware$Stub$Proxy;
+Landroid/location/IGeocodeProvider;
+Landroid/location/IGeocodeProvider$Stub;
+Landroid/location/IGeocodeProvider$Stub$Proxy;
+Landroid/location/IGeofenceProvider;
+Landroid/location/IGeofenceProvider$Stub;
+Landroid/location/IGeofenceProvider$Stub$Proxy;
+Landroid/location/IGnssMeasurementsListener$Stub$Proxy;
+Landroid/location/IGnssNavigationMessageListener$Stub$Proxy;
+Landroid/location/IGnssStatusListener$Stub$Proxy;
+Landroid/location/IGpsGeofenceHardware$Stub$Proxy;
+Landroid/location/ILocationListener$Stub$Proxy;
+Landroid/location/LocationManager$GnssStatusListenerTransport$1;
+Landroid/media/-$$Lambda$MediaCodecInfo$VideoCapabilities$DpgwEn-gVFZT9EtP3qcxpiA2G0M;
+[Landroid/media/AudioDeviceInfo;
+Landroid/media/AudioFocusInfo;
+Landroid/media/AudioFocusRequest;
+Landroid/media/AudioManager$BlockingFocusResultReceiver;
+Landroid/media/AudioManager$SafeWaitObject;
+[Landroid/media/AudioPatch;
+Landroid/media/audiopolicy/AudioPolicyConfig;
+Landroid/media/audiopolicy/IAudioPolicyCallback;
+Landroid/media/audiopolicy/IAudioPolicyCallback$Stub;
+Landroid/media/audiopolicy/IAudioPolicyCallback$Stub$Proxy;
+[Landroid/media/AudioPort;
+Landroid/media/AudioRecordingMonitorImpl;
+Landroid/media/AudioRecordingMonitorImpl$1;
+[Landroid/media/ExifInterface$Rational;
+Landroid/media/ExifInterface$Rational;
+Landroid/media/IAudioFocusDispatcher$Stub$Proxy;
+Landroid/media/IAudioServerStateDispatcher$Stub$Proxy;
+Landroid/media/IMediaRouter2Client$Stub;
+Landroid/media/IMediaRouter2Client$Stub$Proxy;
+Landroid/media/IMediaRouter2Manager$Stub;
+Landroid/media/IMediaRouter2Manager$Stub$Proxy;
+Landroid/media/IPlaybackConfigDispatcher$Stub$Proxy;
+Landroid/media/IRecordingConfigDispatcher$Stub$Proxy;
+Landroid/media/IRemoteVolumeController$Stub$Proxy;
+Landroid/media/IVolumeController$Stub$Proxy;
+Landroid/media/MediaCodec$BufferMap$CodecBuffer;
+[Landroid/media/MediaCodecInfo;
+[Landroid/media/MediaCodecInfo$CodecCapabilities;
+[Landroid/media/MediaCodecInfo$CodecProfileLevel;
+Landroid/media/MediaCodecInfo$VideoCapabilities$PerformancePoint;
+Landroid/media/MediaHTTPService;
+Landroid/media/MediaPlayer$6;
+Landroid/media/MediaPlayer$DrmInfo;
+Landroid/media/MediaPlayer$EventHandler$1;
+Landroid/media/MediaPlayer$EventHandler$2;
+[Landroid/media/MediaPlayer$TrackInfo;
+Landroid/media/MediaPlayer$TrackInfo;
+Landroid/media/MediaRoute2Info;
+Landroid/media/MediaRouter$RouteGroup;
+Landroid/media/MediaRouterClientState;
+Landroid/media/MediaRouterClientState$RouteInfo;
+[Landroid/media/MediaTimeProvider$OnMediaTimeListener;
+Landroid/media/NativeRoutingEventHandlerDelegate;
+Landroid/media/projection/IMediaProjection$Stub;
+Landroid/media/projection/IMediaProjection$Stub$Proxy;
+Landroid/media/projection/IMediaProjectionManager$Stub$Proxy;
+Landroid/media/projection/IMediaProjectionWatcherCallback$Stub$Proxy;
+Landroid/media/projection/MediaProjectionManager$CallbackDelegate;
+Landroid/media/Rating;
+Landroid/media/Ringtone;
+Landroid/media/Session2Token;
+Landroid/media/session/IActiveSessionsListener$Stub$Proxy;
+Landroid/media/session/ICallback$Stub$Proxy;
+Landroid/media/session/IOnMediaKeyListener$Stub$Proxy;
+Landroid/media/session/IOnVolumeKeyLongPressListener$Stub$Proxy;
+Landroid/media/session/ISessionCallback$Stub$Proxy;
+Landroid/media/session/ISessionControllerCallback$Stub$Proxy;
+Landroid/media/session/MediaController$PlaybackInfo;
+Landroid/media/session/MediaSessionManager$CallbackStub;
+Landroid/media/SubtitleController;
+Landroid/media/SubtitleController$2;
+Landroid/media/SubtitleData;
+Landroid/media/SubtitleTrack;
+Landroid/media/TimedMetaData;
+Landroid/media/TimedText;
+Landroid/net/-$$Lambda$Network$KD6DxaMRJIcajhj36TU1K7lJnHQ;
+Landroid/net/-$$Lambda$NetworkFactory$HfslgqyaKc_n0wXX5_qRYVZoGfI;
+Landroid/net/-$$Lambda$NetworkStats$xvFSsVoR0k5s7Fhw1yPDPVIpx8A;
+Landroid/net/ConnectionInfo;
+Landroid/net/DataUsageRequest;
+Landroid/net/EventLogTags;
+Landroid/net/IIpConnectivityMetrics$Stub$Proxy;
+Landroid/net/INetdEventCallback$Stub$Proxy;
+Landroid/net/INetworkManagementEventObserver$Stub$Proxy;
+Landroid/net/INetworkPolicyListener$Stub$Proxy;
+Landroid/net/INetworkRecommendationProvider;
+Landroid/net/INetworkRecommendationProvider$Stub;
+Landroid/net/INetworkRecommendationProvider$Stub$Proxy;
+Landroid/net/INetworkScoreCache$Stub$Proxy;
+Landroid/net/ISocketKeepaliveCallback$Stub;
+Landroid/net/ISocketKeepaliveCallback$Stub$Proxy;
+Landroid/net/ITetheringEventCallback$Stub;
+Landroid/net/ITetheringEventCallback$Stub$Proxy;
+Landroid/net/ITetheringStatsProvider$Stub$Proxy;
+Landroid/net/LinkProperties$CompareResult;
+Landroid/net/metrics/ApfStats;
+Landroid/net/metrics/ConnectStats;
+Landroid/net/metrics/DhcpClientEvent;
+Landroid/net/metrics/DnsEvent;
+Landroid/net/metrics/IpManagerEvent;
+Landroid/net/metrics/IpReachabilityEvent;
+Landroid/net/metrics/NetworkEvent;
+Landroid/net/metrics/NetworkMetrics$Metrics;
+Landroid/net/metrics/NetworkMetrics$Summary;
+Landroid/net/metrics/RaEvent;
+Landroid/net/metrics/ValidationProbeEvent;
+Landroid/net/metrics/WakeupStats;
+[Landroid/net/Network;
+[Landroid/net/NetworkCapabilities;
+[Landroid/net/NetworkKey;
+[Landroid/net/NetworkPolicy;
+Landroid/net/NetworkPolicyManager$1;
+[Landroid/net/NetworkState;
+Landroid/net/NetworkStatsHistory$Entry;
+Landroid/net/NetworkStatsHistory$ParcelUtils;
+Landroid/net/nsd/INsdManager$Stub$Proxy;
+Landroid/net/nsd/NsdManager$ServiceHandler;
+Landroid/net/PacProxySelector;
+Landroid/net/RssiCurve;
+[Landroid/net/ScoredNetwork;
+Landroid/net/shared/Inet4AddressUtils;
+Landroid/net/shared/InetAddressUtils;
+Landroid/net/sip/ISipService$Stub$Proxy;
+Landroid/net/SntpClient;
+Landroid/net/SntpClient$InvalidServerReplyException;
+Landroid/net/StaticIpConfiguration$Builder;
+[Landroid/net/UidRange;
+[Landroid/net/Uri;
+[Landroid/net/wifi/AnqpInformationElement;
+Landroid/net/wifi/AnqpInformationElement;
+Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub;
+Landroid/net/wifi/hotspot2/IProvisioningCallback$Stub$Proxy;
+Landroid/net/wifi/IDppCallback$Stub;
+Landroid/net/wifi/IDppCallback$Stub$Proxy;
+Landroid/net/wifi/INetworkRequestMatchCallback$Stub;
+Landroid/net/wifi/INetworkRequestMatchCallback$Stub$Proxy;
+Landroid/net/wifi/IOnWifiUsabilityStatsListener$Stub;
+Landroid/net/wifi/IOnWifiUsabilityStatsListener$Stub$Proxy;
+Landroid/net/wifi/ISoftApCallback$Stub$Proxy;
+Landroid/net/wifi/ITrafficStateCallback$Stub$Proxy;
+Landroid/net/wifi/IWifiScanner$Stub$Proxy;
+Landroid/net/wifi/p2p/IWifiP2pManager$Stub$Proxy;
+Landroid/net/wifi/rtt/IRttCallback$Stub;
+Landroid/net/wifi/rtt/IRttCallback$Stub$Proxy;
+Landroid/net/wifi/rtt/RangingRequest;
+[Landroid/net/wifi/ScanResult$InformationElement;
+[Landroid/net/wifi/ScanResult$RadioChainInfo;
+Landroid/net/wifi/SupplicantState$2;
+Landroid/net/wifi/WifiConfiguration$KeyMgmt;
+Landroid/net/wifi/WifiManager$MulticastLock;
+Landroid/net/wifi/WifiManager$SoftApCallbackProxy;
+Landroid/net/wifi/WifiManager$TrafficStateCallbackProxy;
+Landroid/net/wifi/WifiNetworkScoreCache$CacheListener$1;
+Landroid/net/wifi/WifiNetworkSpecifier;
+Landroid/net/wifi/WifiNetworkSuggestion;
+[Landroid/net/wifi/WifiScanner$ChannelSpec;
+Landroid/net/wifi/WifiScanner$OperationResult;
+Landroid/net/wifi/WifiScanner$ParcelableScanData;
+Landroid/net/wifi/WifiScanner$ParcelableScanResults;
+[Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;
+Landroid/net/wifi/WifiScanner$ScanSettings$HiddenNetwork;
+Landroid/nfc/BeamShareData;
+Landroid/nfc/IAppCallback$Stub$Proxy;
+Landroid/nfc/INfcUnlockHandler$Stub;
+Landroid/nfc/INfcUnlockHandler$Stub$Proxy;
+Landroid/nfc/ITagRemovedCallback$Stub;
+Landroid/nfc/ITagRemovedCallback$Stub$Proxy;
+Landroid/nfc/Tag;
+Landroid/nfc/TechListParcel;
+Landroid/os/-$$Lambda$HidlSupport$GHxmwrIWiKN83tl6aMQt_nV5hiw;
+Landroid/os/-$$Lambda$PowerManager$WakeLock$VvFzmRZ4ZGlXx7u3lSAJ_T-YUjw;
+Landroid/os/-$$Lambda$StrictMode$AndroidBlockGuardPolicy$FxZGA9KtfTewqdcxlUwvIe5Nx9I;
+Landroid/os/-$$Lambda$StrictMode$UFC_nI1x6u8ZwMQmA7bmj9NHZz4;
+Landroid/os/AsyncTask$5;
+Landroid/os/BatteryProperty;
+Landroid/os/BatterySaverPolicyConfig;
+Landroid/os/BatteryStats$2;
+Landroid/os/BatteryStats$HistoryPrinter;
+[Landroid/os/Bundle;
+Landroid/os/connectivity/CellularBatteryStats;
+Landroid/os/connectivity/GpsBatteryStats;
+Landroid/os/connectivity/WifiBatteryStats;
+[Landroid/os/Debug$MemoryInfo;
+Landroid/os/FileUtils$1;
+Landroid/os/GraphicsEnvironment$1;
+Landroid/os/health/HealthKeys$Constant;
+[Landroid/os/health/HealthKeys$SortedIntArray;
+Landroid/os/health/HealthKeys$SortedIntArray;
+Landroid/os/health/HealthStatsWriter;
+Landroid/os/IDeviceIdentifiersPolicyService$Stub$Proxy;
+Landroid/os/IMaintenanceActivityListener$Stub;
+Landroid/os/IMaintenanceActivityListener$Stub$Proxy;
+Landroid/os/INetworkActivityListener;
+Landroid/os/INetworkActivityListener$Stub;
+Landroid/os/INetworkActivityListener$Stub$Proxy;
+Landroid/os/IProgressListener$Stub$Proxy;
+Landroid/os/IRemoteCallback$Stub$Proxy;
+Landroid/os/IServiceManager$Stub;
+Landroid/os/IServiceManager$Stub$Proxy;
+Landroid/os/IThermalEventListener$Stub$Proxy;
+Landroid/os/IThermalService$Stub$Proxy;
+Landroid/os/IThermalStatusListener$Stub$Proxy;
+Landroid/os/IVoldTaskListener$Stub;
+Landroid/os/IVoldTaskListener$Stub$Proxy;
+Landroid/os/MessageQueue$FileDescriptorRecord;
+[Landroid/os/MessageQueue$IdleHandler;
+Landroid/os/NetworkOnMainThreadException;
+[Landroid/os/Parcelable;
+[Landroid/os/ParcelFileDescriptor;
+[Landroid/os/ParcelUuid;
+[Landroid/os/PatternMatcher;
+[Landroid/os/PersistableBundle;
+[Landroid/os/RegistrantList;
+Landroid/os/RemoteCallback$1;
+Landroid/os/RemoteCallback$2;
+Landroid/os/SharedMemory$Closer;
+Landroid/os/SharedMemory$MemoryRegistration;
+Landroid/os/SharedMemory$Unmapper;
+Landroid/os/StatsDimensionsValue;
+[Landroid/os/storage/DiskInfo;
+Landroid/os/storage/IObbActionListener$Stub$Proxy;
+Landroid/os/storage/IStorageEventListener$Stub$Proxy;
+Landroid/os/storage/IStorageShutdownObserver$Stub;
+Landroid/os/storage/IStorageShutdownObserver$Stub$Proxy;
+[Landroid/os/storage/StorageVolume;
+[Landroid/os/storage/VolumeInfo;
+[Landroid/os/storage/VolumeRecord;
+Landroid/os/strictmode/ContentUriWithoutPermissionViolation;
+Landroid/os/strictmode/CredentialProtectedWhileLockedViolation;
+Landroid/os/strictmode/CustomViolation;
+Landroid/os/strictmode/DiskWriteViolation;
+Landroid/os/strictmode/ExplicitGcViolation;
+Landroid/os/strictmode/ImplicitDirectBootViolation;
+Landroid/os/strictmode/IntentReceiverLeakedViolation;
+Landroid/os/strictmode/LeakedClosableViolation;
+Landroid/os/strictmode/NetworkViolation;
+Landroid/os/strictmode/ResourceMismatchViolation;
+Landroid/os/strictmode/ServiceConnectionLeakedViolation;
+Landroid/os/strictmode/SqliteObjectLeakedViolation;
+Landroid/os/strictmode/UnbufferedIoViolation;
+Landroid/os/strictmode/UntaggedSocketViolation;
+Landroid/os/SystemService;
+Landroid/os/SystemService$State;
+[Landroid/os/WorkSource;
+Landroid/permission/-$$Lambda$PermissionControllerManager$Iy-7wiKMCV-MFSPGyIJxP_DSf8E;
+Landroid/permission/-$$Lambda$PermissionControllerManager$yYvntg8BoN_6kTWlcdYA7GFZJjs;
+Landroid/permission/IPermissionController$Stub;
+Landroid/permission/IPermissionManager$Stub;
+Landroid/permission/IPermissionManager$Stub$Proxy;
+Landroid/preference/PreferenceInflater;
+Landroid/preference/PreferenceScreen;
+Landroid/print/IPrintSpooler;
+Landroid/print/IPrintSpooler$Stub;
+Landroid/print/IPrintSpooler$Stub$Proxy;
+Landroid/print/PrintJobInfo;
+Landroid/printservice/PrintServiceInfo;
+Landroid/privacy/internal/longitudinalreporting/LongitudinalReportingEncoder;
+Landroid/privacy/internal/rappor/RapporConfig;
+Landroid/privacy/internal/rappor/RapporEncoder;
+Landroid/provider/BlockedNumberContract;
+Landroid/provider/BlockedNumberContract$SystemContract;
+Landroid/provider/ContactsContract$PhoneLookup;
+Landroid/provider/DeviceConfig$2;
+Landroid/provider/Downloads;
+[Landroid/provider/FontsContract$FontInfo;
+Landroid/provider/Telephony$Mms;
+Landroid/security/IKeyChainService$Stub;
+Landroid/security/IKeyChainService$Stub$Proxy;
+Landroid/security/keymaster/KeymasterBooleanArgument;
+Landroid/security/keymaster/KeymasterDateArgument;
+Landroid/security/keymaster/KeymasterDefs;
+Landroid/security/keymaster/KeymasterLongArgument;
+Landroid/security/KeyStore$KeyCharacteristicsCallbackResult;
+Landroid/security/KeyStore$KeyCharacteristicsPromise;
+Landroid/security/KeyStore$KeystoreResultPromise;
+Landroid/security/KeyStore$OperationPromise;
+Landroid/security/KeyStore$State;
+Landroid/security/keystore/AndroidKeyStoreLoadStoreParameter;
+Landroid/security/keystore/AndroidKeyStorePrivateKey;
+Landroid/security/keystore/AndroidKeyStoreSecretKey;
+Landroid/security/keystore/ArrayUtils;
+Landroid/security/keystore/KeyProperties$Digest;
+Landroid/security/keystore/KeyStoreConnectException;
+Landroid/security/keystore/KeystoreResponse;
+Landroid/security/keystore/recovery/KeyChainProtectionParams;
+Landroid/security/keystore/recovery/KeyChainSnapshot;
+Landroid/security/keystore/recovery/KeyDerivationParams;
+Landroid/security/keystore/recovery/RecoveryCertPath;
+Landroid/security/keystore/recovery/WrappedApplicationKey;
+Landroid/security/keystore/recovery/X509CertificateParsingUtils;
+Landroid/security/keystore/UserNotAuthenticatedException;
+Landroid/security/keystore/Utils;
+Landroid/security/net/config/Domain;
+Landroid/security/net/config/ResourceCertificateSource;
+Landroid/security/net/config/TrustedCertificateStoreAdapter;
+Landroid/security/net/config/UserCertificateSource$NoPreloadHolder;
+Landroid/security/net/config/WfaCertificateSource;
+Landroid/security/net/config/WfaCertificateSource$NoPreloadHolder;
+Landroid/service/appprediction/IPredictionService;
+Landroid/service/appprediction/IPredictionService$Stub;
+Landroid/service/appprediction/IPredictionService$Stub$Proxy;
+Landroid/service/autofill/augmented/IAugmentedAutofillService;
+Landroid/service/autofill/augmented/IAugmentedAutofillService$Stub;
+Landroid/service/autofill/augmented/IAugmentedAutofillService$Stub$Proxy;
+Landroid/service/autofill/AutofillServiceInfo;
+Landroid/service/autofill/FillResponse;
+Landroid/service/autofill/IAutoFillService;
+Landroid/service/autofill/IAutoFillService$Stub;
+Landroid/service/autofill/IAutoFillService$Stub$Proxy;
+Landroid/service/autofill/UserData;
+Landroid/service/contentcapture/ContentCaptureServiceInfo;
+Landroid/service/contentcapture/FlushMetrics;
+Landroid/service/contentcapture/IContentCaptureService;
+Landroid/service/contentcapture/IContentCaptureService$Stub;
+Landroid/service/contentcapture/IContentCaptureService$Stub$Proxy;
+Landroid/service/dreams/IDreamService;
+Landroid/service/dreams/IDreamService$Stub;
+Landroid/service/dreams/IDreamService$Stub$Proxy;
+[Landroid/service/euicc/EuiccProfileInfo;
+Landroid/service/gatekeeper/GateKeeperResponse;
+[Landroid/service/notification/Condition;
+Landroid/service/notification/IConditionProvider$Stub$Proxy;
+Landroid/service/notification/INotificationListener$Stub$Proxy;
+Landroid/service/notification/ScheduleCalendar;
+Landroid/service/notification/SnoozeCriterion;
+[Landroid/service/notification/StatusBarNotification;
+[Landroid/service/notification/ZenModeConfig$ZenRule;
+Landroid/service/persistentdata/IPersistentDataBlockService$Stub$Proxy;
+Landroid/service/textclassifier/ITextClassifierCallback$Stub;
+Landroid/service/textclassifier/ITextClassifierCallback$Stub$Proxy;
+Landroid/service/trust/ITrustAgentService;
+Landroid/service/trust/ITrustAgentService$Stub;
+Landroid/service/trust/ITrustAgentService$Stub$Proxy;
+Landroid/service/voice/IVoiceInteractionService$Stub$Proxy;
+Landroid/service/voice/IVoiceInteractionSession$Stub;
+Landroid/service/voice/IVoiceInteractionSession$Stub$Proxy;
+Landroid/service/voice/IVoiceInteractionSessionService$Stub$Proxy;
+Landroid/service/voice/VoiceInteractionServiceInfo;
+Landroid/service/vr/IPersistentVrStateCallbacks$Stub$Proxy;
+Landroid/service/vr/IVrManager$Stub$Proxy;
+Landroid/service/vr/IVrStateCallbacks$Stub$Proxy;
+Landroid/service/wallpaper/IWallpaperEngine$Stub$Proxy;
+Landroid/service/wallpaper/IWallpaperService$Stub$Proxy;
+Landroid/stats/devicepolicy/nano/StringList;
+Landroid/sysprop/ProductProperties;
+[Landroid/system/StructPollfd;
+Landroid/system/suspend/WakeLockInfo;
+Landroid/telecom/-$$Lambda$cyYWqCYT05eM23eLVm4oQ5DrYjw;
+Landroid/telecom/-$$Lambda$qa4s1Fm2YuohEunaJUJcmJXDXG0;
+Landroid/telecom/AudioState;
+Landroid/telecom/Conference;
+Landroid/telecom/Conferenceable;
+Landroid/telecom/Connection;
+Landroid/telecom/Connection$FailureSignalingConnection;
+Landroid/telecom/ConnectionRequest;
+Landroid/telecom/ConnectionService$1;
+Landroid/telecom/ConnectionService$2;
+Landroid/telecom/ConnectionService$3;
+Landroid/telecom/ConnectionService$4;
+Landroid/telecom/ConnectionService$5;
+Landroid/telecom/ConnectionServiceAdapter;
+Landroid/telecom/DisconnectCause;
+Landroid/telecom/Logging/-$$Lambda$L5F_SL2jOCUETYvgdB36aGwY50E;
+Landroid/telecom/Logging/-$$Lambda$SessionManager$hhtZwTEbvO-fLNlAvB6Do9_2gW4;
+Landroid/telecom/Logging/-$$Lambda$SessionManager$VyH2gT1EjIvzDy_C9JfTT60CISM;
+Landroid/telecom/Logging/EventManager;
+Landroid/telecom/Logging/EventManager$Event;
+Landroid/telecom/Logging/EventManager$EventListener;
+Landroid/telecom/Logging/EventManager$EventRecord;
+Landroid/telecom/Logging/Runnable;
+Landroid/telecom/Logging/Runnable$1;
+Landroid/telecom/Logging/Session;
+Landroid/telecom/Logging/Session$Info;
+Landroid/telecom/Logging/SessionManager;
+Landroid/telecom/Logging/SessionManager$ISessionListener;
+Landroid/telecom/ParcelableConference;
+Landroid/telecom/ParcelableConnection;
+Landroid/telecom/RemoteConnectionManager;
+Landroid/telecom/StatusHints;
+Landroid/telecom/VideoProfile;
+Landroid/telephony/-$$Lambda$DataFailCause$djkZSxdG-s-w2L5rQKiGu6OudyY;
+Landroid/telephony/-$$Lambda$MLKtmRGKP3e0WU7x_KyS5-Vg8q4;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$0s34qsuHFsa43jUHrTkD62ni6Ds;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$2cMrwdqnKBpixpApeIX38rmRLak;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$2VMO21pFQN-JN3kpn6vQN1zPFEU;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$4NHt5Shg_DHV-T1IxfcQLHP5-j0;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$aysbwPqxcLV_5w6LP0TzZu2D-ew;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$bELzxgwsPigyVKYkAXBO2BjcSm8;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$dUc3j82sK9P9Zpaq-91n9bk_Rpc;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Hbn6-eZxY2p3rjOfStodI04A8E8;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$ipH9N0fJiGE9EBJHahQeXcCZXzo;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$JalixlMNdjktPsNntP_JT9pymhs;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$jlNX9JiqGSNg9W49vDcKucKdeCI;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$nnG75RvQ1_1KZGJk1ySeCH1JJRg;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$Q2A8FgYlU8_D6PD78tThGut_rTc;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$XyayAGWQZC2dNjwr697SfSGBBOc;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$yvQnAlFGg5EWDG2vcA9X-4xnalA;
+Landroid/telephony/-$$Lambda$PhoneStateListener$IPhoneStateListenerStub$YY3srkIkMm8vTSFJZHoiKzUUrGs;
+Landroid/telephony/AccessNetworkConstants$AccessNetworkType;
+Landroid/telephony/cdma/CdmaCellLocation;
+Landroid/telephony/CellConfigLte;
+Landroid/telephony/CellIdentityCdma;
+Landroid/telephony/CellIdentityGsm;
+Landroid/telephony/CellIdentityNr;
+Landroid/telephony/CellIdentityTdscdma;
+Landroid/telephony/CellInfoCdma;
+Landroid/telephony/CellInfoGsm;
+Landroid/telephony/CellInfoNr;
+Landroid/telephony/CellInfoTdscdma;
+Landroid/telephony/CellInfoWcdma;
+Landroid/telephony/DataConnectionRealTimeInfo;
+[Landroid/telephony/data/DataProfile;
+Landroid/telephony/data/DataService$DataCallListChangedIndication;
+Landroid/telephony/data/DataService$DeactivateDataCallRequest;
+Landroid/telephony/DataFailCause$1;
+Landroid/telephony/data/IDataService$Stub$Proxy;
+Landroid/telephony/ICellInfoCallback$Stub;
+Landroid/telephony/ICellInfoCallback$Stub$Proxy;
+Landroid/telephony/IFinancialSmsCallback$Stub;
+Landroid/telephony/IFinancialSmsCallback$Stub$Proxy;
+Landroid/telephony/ims/-$$Lambda$ImsMmTelManager$RegistrationCallback$RegistrationBinder$8xq93ap6i0L56Aegaj-ZEUt9ISc;
+Landroid/telephony/ims/-$$Lambda$ImsMmTelManager$RegistrationCallback$RegistrationBinder$AhnK6VJjwgpDNC1GXRrwfgtYvkM;
+Landroid/telephony/ims/-$$Lambda$ImsMmTelManager$RegistrationCallback$RegistrationBinder$iuI3HyNU5eUABA_QRyzQ8Jw2-8g;
+Landroid/telephony/ims/-$$Lambda$ImsMmTelManager$RegistrationCallback$RegistrationBinder$J4VhgcUtd6SivHcdkzpurbTuyLc;
+Landroid/telephony/ims/-$$Lambda$ImsMmTelManager$RegistrationCallback$RegistrationBinder$jAP4lCkBQEdyrlgt5jaNPTlFXlY;
+Landroid/telephony/ims/-$$Lambda$ImsMmTelManager$RegistrationCallback$RegistrationBinder$oDp7ilyKfflFThUCP4Du9EYoDoQ;
+Landroid/telephony/ims/aidl/IImsCapabilityCallback$Stub$Proxy;
+Landroid/telephony/ims/aidl/IImsConfig$Stub$Proxy;
+Landroid/telephony/ims/aidl/IImsConfigCallback$Stub$Proxy;
+Landroid/telephony/ims/aidl/IImsMmTelFeature$Stub$Proxy;
+Landroid/telephony/ims/aidl/IImsMmTelListener$Stub$Proxy;
+Landroid/telephony/ims/aidl/IImsRegistrationCallback$Stub$Proxy;
+Landroid/telephony/ims/aidl/IImsServiceController$Stub$Proxy;
+Landroid/telephony/ims/aidl/IImsSmsListener$Stub$Proxy;
+[Landroid/telephony/ims/ImsCallForwardInfo;
+Landroid/telephony/ims/ImsExternalCallState;
+[Landroid/telephony/ims/ImsSsInfo;
+Landroid/telephony/ims/stub/-$$Lambda$ImsRegistrationImplBase$cWwTXSDsk-bWPbsDJYI--DUBMnE;
+Landroid/telephony/ims/stub/-$$Lambda$ImsRegistrationImplBase$sbjuTvW-brOSWMR74UInSZEIQB0;
+Landroid/telephony/ims/stub/-$$Lambda$ImsRegistrationImplBase$wwtkoeOtGwMjG5I0-ZTfjNpGU-s;
+Landroid/telephony/INetworkService$Stub$Proxy;
+Landroid/telephony/JapanesePhoneNumberFormatter;
+Landroid/telephony/NeighboringCellInfo;
+Landroid/telephony/PhysicalChannelConfig$Builder;
+[Landroid/telephony/RadioAccessFamily;
+Landroid/telephony/SmsMessage;
+Landroid/telephony/SubscriptionManager$OnOpportunisticSubscriptionsChangedListener;
+Landroid/telephony/SubscriptionManager$OnOpportunisticSubscriptionsChangedListener$1;
+[Landroid/telephony/SubscriptionPlan;
+Landroid/telephony/SubscriptionPlan;
+[Landroid/telephony/UiccAccessRule;
+Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;
+Landroid/text/CharSequenceCharacterIterator;
+[Landroid/text/DynamicLayout$ChangeWatcher;
+[Landroid/text/FontConfig$Alias;
+[Landroid/text/FontConfig$Family;
+[Landroid/text/FontConfig$Font;
+Landroid/text/format/Formatter$BytesResult;
+Landroid/text/HtmlToSpannedConverter$Big;
+Landroid/text/HtmlToSpannedConverter$Blockquote;
+Landroid/text/HtmlToSpannedConverter$Bold;
+Landroid/text/HtmlToSpannedConverter$Bullet;
+Landroid/text/HtmlToSpannedConverter$Heading;
+Landroid/text/HtmlToSpannedConverter$Italic;
+Landroid/text/HtmlToSpannedConverter$Monospace;
+Landroid/text/HtmlToSpannedConverter$Small;
+Landroid/text/HtmlToSpannedConverter$Strikethrough;
+Landroid/text/HtmlToSpannedConverter$Sub;
+Landroid/text/HtmlToSpannedConverter$Super;
+Landroid/text/HtmlToSpannedConverter$Underline;
+[Landroid/text/Layout$Directions;
+Landroid/text/Layout$HorizontalMeasurementProvider;
+Landroid/text/Layout$TabStops;
+Landroid/text/method/DateKeyListener;
+Landroid/text/method/DateTimeKeyListener;
+Landroid/text/method/DialerKeyListener;
+Landroid/text/method/DigitsKeyListener;
+Landroid/text/method/TimeKeyListener;
+[Landroid/text/PrecomputedText$ParagraphInfo;
+Landroid/text/PrecomputedText$Params$Builder;
+[Landroid/text/Selection$MemoryTextWatcher;
+[Landroid/text/SpanWatcher;
+Landroid/text/style/AccessibilityClickableSpan;
+Landroid/text/style/AccessibilityURLSpan;
+[Landroid/text/style/AlignmentSpan;
+Landroid/text/style/AlignmentSpan$Standard;
+Landroid/text/style/BulletSpan;
+[Landroid/text/style/CharacterStyle;
+[Landroid/text/style/ClickableSpan;
+[Landroid/text/style/LeadingMarginSpan;
+Landroid/text/style/LeadingMarginSpan$LeadingMarginSpan2;
+Landroid/text/style/LeadingMarginSpan$Standard;
+[Landroid/text/style/LineBackgroundSpan;
+Landroid/text/style/LineBackgroundSpan$Standard;
+[Landroid/text/style/LineHeightSpan;
+Landroid/text/style/LineHeightSpan$Standard;
+Landroid/text/style/LineHeightSpan$WithDensity;
+Landroid/text/style/LocaleSpan;
+[Landroid/text/style/MetricAffectingSpan;
+Landroid/text/style/QuoteSpan;
+[Landroid/text/style/ReplacementSpan;
+Landroid/text/style/ScaleXSpan;
+[Landroid/text/style/SpellCheckSpan;
+Landroid/text/style/StrikethroughSpan;
+Landroid/text/style/SubscriptSpan;
+Landroid/text/style/SuggestionRangeSpan;
+[Landroid/text/style/SuggestionSpan;
+Landroid/text/style/SuperscriptSpan;
+[Landroid/text/style/TabStopSpan;
+Landroid/text/style/TtsSpan;
+Landroid/text/style/TtsSpan$TelephoneBuilder;
+Landroid/text/style/TypefaceSpan;
+[Landroid/text/TextWatcher;
+Landroid/text/util/Linkify;
+Landroid/transition/ArcMotion;
+Landroid/transition/ChangeScroll;
+Landroid/transition/CircularPropagation;
+Landroid/transition/Explode;
+Landroid/transition/PatternPathMotion;
+Landroid/transition/Recolor;
+Landroid/transition/Slide;
+Landroid/util/apk/ApkSigningBlockUtils$1;
+[Landroid/util/apk/DataSource;
+Landroid/util/apk/VerityBuilder$BufferedDigester;
+Landroid/util/apk/VerityBuilder$VerityResult;
+[Landroid/util/ArrayMap;
+Landroid/util/BackupUtils;
+Landroid/util/Half;
+Landroid/util/JsonWriter$1;
+Landroid/util/KeyValueSettingObserver;
+Landroid/util/KeyValueSettingObserver$SettingObserver;
+Landroid/util/LauncherIcons;
+Landroid/util/LogWriter;
+Landroid/util/LongArrayQueue;
+Landroid/util/proto/EncodedBuffer;
+Landroid/util/RecurrenceRule;
+Landroid/util/RecurrenceRule$NonrecurringIterator;
+Landroid/util/RecurrenceRule$RecurringIterator;
+Landroid/util/Spline$LinearSpline;
+Landroid/util/UtilConfig;
+Landroid/view/-$$Lambda$1kvF4JuyM42-wmyDVPAIYdPz1jE;
+Landroid/view/-$$Lambda$cZhmLzK8aetUdx4VlP9w5jR7En0;
+Landroid/view/-$$Lambda$dj1hfDQd0iEp_uBDBPEUMMYJJwk;
+Landroid/view/-$$Lambda$PYGleuqIeCxjTD1pJqqx1opFv1g;
+Landroid/view/-$$Lambda$SurfaceView$w68OV7dB_zKVNsA-r0IrAUtyWas;
+Landroid/view/-$$Lambda$ThreadedRenderer$ydBD-R1iP5u-97XYakm-jKvC1b4;
+Landroid/view/-$$Lambda$ViewRootImpl$dznxCZGM2R1fsBljsJKomLjBRoM;
+Landroid/view/-$$Lambda$ViewRootImpl$IReiNMSbDakZSGbIZuL_ifaFWn8;
+Landroid/view/-$$Lambda$ViewRootImpl$YBiqAhbCbXVPSKdbE3K4rH2gpxI;
+Landroid/view/-$$Lambda$ViewRootImpl$zlBUjCwDtoAWMNaHI62DIq-eKFY;
+Landroid/view/-$$Lambda$WindowManagerGlobal$2bR3FsEm4EdRwuXfttH0wA2xOW4;
+Landroid/view/-$$Lambda$WlJa6OPA72p3gYtA3nVKC7Z1tGY;
+Landroid/view/accessibility/-$$Lambda$AccessibilityManager$1$o7fCplskH9NlBwJvkl6NoZ0L_BA;
+Landroid/view/accessibility/-$$Lambda$AccessibilityManager$yzw5NYY7_MfAQ9gLy3mVllchaXo;
+Landroid/view/accessibility/IAccessibilityInteractionConnection$Stub$Proxy;
+Landroid/view/accessibility/IAccessibilityManagerClient$Stub$Proxy;
+Landroid/view/accessibility/WeakSparseArray;
+Landroid/view/accessibility/WeakSparseArray$WeakReferenceWithId;
+Landroid/view/animation/AnticipateInterpolator;
+Landroid/view/animation/AnticipateOvershootInterpolator;
+Landroid/view/animation/BounceInterpolator;
+Landroid/view/animation/ClipRectAnimation;
+Landroid/view/animation/CycleInterpolator;
+Landroid/view/animation/GridLayoutAnimationController;
+Landroid/view/animation/RotateAnimation;
+[Landroid/view/AppTransitionAnimationSpec;
+Landroid/view/AppTransitionAnimationSpec;
+Landroid/view/autofill/IAutoFillManagerClient$Stub$Proxy;
+[Landroid/view/Choreographer$CallbackQueue;
+Landroid/view/contentcapture/ContentCaptureCondition;
+Landroid/view/contentcapture/ContentCaptureContext;
+Landroid/view/contentcapture/DataRemovalRequest;
+[Landroid/view/Display;
+Landroid/view/DragEvent;
+Landroid/view/GestureExclusionTracker$GestureExclusionViewInfo;
+[Landroid/view/HandlerActionQueue$HandlerAction;
+Landroid/view/IAppTransitionAnimationSpecsFuture$Stub;
+Landroid/view/IAppTransitionAnimationSpecsFuture$Stub$Proxy;
+Landroid/view/IDisplayFoldListener$Stub;
+Landroid/view/IDisplayFoldListener$Stub$Proxy;
+Landroid/view/IDockedStackListener$Stub$Proxy;
+Landroid/view/IGraphicsStatsCallback$Stub$Proxy;
+Landroid/view/inputmethod/-$$Lambda$InputMethodManager$dfnCauFoZCf-HfXs1QavrkwWDf0;
+Landroid/view/inputmethod/-$$Lambda$InputMethodManager$iDWn3IGSUFqIcs8Py42UhfrshxI;
+[Landroid/view/inputmethod/CompletionInfo;
+Landroid/view/inputmethod/CompletionInfo;
+Landroid/view/inputmethod/CorrectionInfo;
+Landroid/view/inputmethod/CursorAnchorInfo;
+Landroid/view/inputmethod/ExtractedTextRequest;
+Landroid/view/inputmethod/InputContentInfo;
+Landroid/view/inputmethod/InputMethod;
+Landroid/view/inputmethod/InputMethodSession;
+[Landroid/view/inputmethod/InputMethodSubtype;
+[Landroid/view/InsetsSourceControl;
+Landroid/view/InsetsSourceControl;
+Landroid/view/IOnKeyguardExitResult$Stub;
+Landroid/view/IOnKeyguardExitResult$Stub$Proxy;
+Landroid/view/IPinnedStackController$Stub$Proxy;
+Landroid/view/IPinnedStackListener$Stub$Proxy;
+Landroid/view/IRecentsAnimationRunner;
+Landroid/view/IRecentsAnimationRunner$Stub;
+Landroid/view/IRecentsAnimationRunner$Stub$Proxy;
+Landroid/view/IRemoteAnimationRunner$Stub;
+Landroid/view/IRemoteAnimationRunner$Stub$Proxy;
+Landroid/view/IRotationWatcher$Stub$Proxy;
+Landroid/view/ISystemGestureExclusionListener$Stub;
+Landroid/view/ISystemGestureExclusionListener$Stub$Proxy;
+Landroid/view/IWindow$Stub$Proxy;
+Landroid/view/IWindowSessionCallback$Stub$Proxy;
+Landroid/view/KeyCharacterMap$UnavailableException;
+Landroid/view/LayoutInflater$BlinkLayout;
+Landroid/view/LayoutInflater$BlinkLayout$1;
+Landroid/view/MenuInflater$InflatedOnMenuItemClickListener;
+[Landroid/view/MotionEvent$PointerCoords;
+[Landroid/view/MotionEvent$PointerProperties;
+Landroid/view/PointerIcon$2;
+Landroid/view/RemotableViewMethod;
+Landroid/view/RemoteAnimationDefinition;
+Landroid/view/RemoteAnimationDefinition$RemoteAnimationAdapterEntry;
+Landroid/view/RenderNodeAnimator$DelayedAnimationHelper;
+Landroid/view/RoundScrollbarRenderer;
+Landroid/view/SoundEffectConstants;
+Landroid/view/textclassifier/-$$Lambda$ActionsSuggestionsHelper$6oTtcn9bDE-u-8FbiyGdntqoQG0;
+Landroid/view/textclassifier/-$$Lambda$ActionsSuggestionsHelper$sY0w9od2zcl4YFel0lG4VB3vf7I;
+Landroid/view/textclassifier/-$$Lambda$ActionsSuggestionsHelper$YTQv8oPvlmJL4tITUFD4z4JWKRk;
+Landroid/view/textclassifier/-$$Lambda$OGSS2qx6njxlnp0dnKb4lA3jnw8;
+Landroid/view/textclassifier/-$$Lambda$TextClassificationManager$oweIEhDWxy3_0kZSXp3oRbSuNW4;
+Landroid/view/textclassifier/-$$Lambda$TextClassificationManager$SIydN2POphTO3AmPTLEMmXPLSKY;
+Landroid/view/textclassifier/-$$Lambda$TextClassifierImpl$ftq-sQqJYwUdrdbbr9jz3p4AWos;
+Landroid/view/textclassifier/-$$Lambda$TextClassifierImpl$iSt_Guet-O6Vtdk0MA4z-Z4lzaM;
+Landroid/view/textclassifier/ActionsModelParamsSupplier;
+Landroid/view/textclassifier/ActionsModelParamsSupplier$ActionsModelParams;
+Landroid/view/textclassifier/ActionsSuggestionsHelper;
+Landroid/view/textclassifier/ActionsSuggestionsHelper$PersonEncoder;
+Landroid/view/textclassifier/ConversationAction;
+Landroid/view/textclassifier/ConversationAction$Builder;
+Landroid/view/textclassifier/ConversationActions$Message;
+Landroid/view/textclassifier/ConversationActions$Request;
+Landroid/view/textclassifier/ExtrasUtils;
+Landroid/view/textclassifier/intent/LabeledIntent;
+Landroid/view/textclassifier/intent/LabeledIntent$Result;
+Landroid/view/textclassifier/Log;
+Landroid/view/textclassifier/ModelFileManager$ModelFile;
+Landroid/view/textclassifier/SelectionEvent;
+Landroid/view/textclassifier/SelectionSessionLogger$SignatureParser;
+Landroid/view/textclassifier/SystemTextClassifier$BlockingCallback;
+Landroid/view/textclassifier/SystemTextClassifier$ResponseReceiver;
+Landroid/view/textclassifier/TextClassification$Request;
+Landroid/view/textclassifier/TextClassificationContext;
+Landroid/view/textclassifier/TextClassificationContext$Builder;
+Landroid/view/textclassifier/TextClassificationSessionId;
+Landroid/view/textclassifier/TextClassifier$EntityConfig;
+Landroid/view/textclassifier/TextClassifier$EntityConfig$Builder;
+Landroid/view/textclassifier/TextClassifier$Utils;
+Landroid/view/textclassifier/TextClassifierEvent;
+Landroid/view/textclassifier/TextClassifierEvent$ConversationActionsEvent;
+Landroid/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent;
+Landroid/view/textclassifier/TextClassifierEvent$TextLinkifyEvent;
+Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent;
+Landroid/view/textclassifier/TextLanguage;
+Landroid/view/textclassifier/TextLanguage$Builder;
+Landroid/view/textclassifier/TextLanguage$Request;
+Landroid/view/textclassifier/TextLanguage$Request$Builder;
+Landroid/view/textclassifier/TextLinks$Request;
+Landroid/view/textclassifier/TextSelection$Request;
+[Landroid/view/View;
+[Landroid/view/View$AttachInfo$InvalidateInfo;
+Landroid/view/View$AttachInfo$InvalidateInfo;
+Landroid/view/View$CheckForLongPress;
+Landroid/view/View$DeclaredOnClickListener;
+Landroid/view/ViewGroup$ChildListForAccessibility;
+Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;
+Landroid/view/ViewPropertyAnimator$2;
+Landroid/view/ViewPropertyAnimator$3;
+Landroid/view/ViewRootImpl$2;
+Landroid/view/ViewRootImpl$3;
+Landroid/view/ViewRootImpl$CalledFromWrongThreadException;
+Landroid/view/ViewRootImpl$TakenSurfaceHolder;
+Landroid/view/ViewStructure$HtmlInfo;
+Landroid/view/ViewStub$ViewReplaceRunnable;
+Landroid/view/ViewTreeObserver$OnEnterAnimationCompleteListener;
+Landroid/view/ViewTreeObserver$OnWindowAttachListener;
+Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;
+Landroid/view/ViewTreeObserver$OnWindowShownListener;
+Landroid/view/WindowInsets$Builder;
+Landroid/view/WindowManager$InvalidDisplayException;
+Landroid/widget/-$$Lambda$RemoteViews$SetOnClickResponse$9rKnU2QqCzJhBC39ZrKYXob0-MA;
+Landroid/widget/AbsListView$1;
+Landroid/widget/AbsListView$2;
+Landroid/widget/AbsListView$4;
+Landroid/widget/AbsListView$CheckForTap;
+Landroid/widget/AbsListView$ListItemAccessibilityDelegate;
+Landroid/widget/AbsListView$SelectionBoundsAdjuster;
+Landroid/widget/ActionMenuPresenter$ActionMenuPopupCallback;
+Landroid/widget/ActionMenuView$ActionMenuPresenterCallback;
+Landroid/widget/Chronometer;
+Landroid/widget/Chronometer$1;
+Landroid/widget/Editor$EasyEditPopupWindow;
+Landroid/widget/Editor$SpanController$1;
+Landroid/widget/Editor$SpanController$2;
+[Landroid/widget/Editor$TextRenderNode;
+[Landroid/widget/Editor$TextViewPositionListener;
+Landroid/widget/GridLayout;
+Landroid/widget/GridLayout$7$1;
+[[Landroid/widget/GridLayout$Arc;
+[Landroid/widget/GridLayout$Arc;
+Landroid/widget/GridLayout$Axis;
+Landroid/widget/GridLayout$Axis$1;
+[Landroid/widget/GridLayout$Bounds;
+[Landroid/widget/GridLayout$Interval;
+Landroid/widget/GridLayout$LayoutParams;
+[Landroid/widget/GridLayout$MutableInt;
+[Landroid/widget/GridLayout$Spec;
+Landroid/widget/GridLayout$Spec;
+Landroid/widget/ImageView$ImageDrawableCallback;
+Landroid/widget/ListView$FocusSelector;
+Landroid/widget/PopupMenu$1;
+Landroid/widget/PopupMenu$2;
+Landroid/widget/PopupWindow$3;
+Landroid/widget/ProgressBar$ProgressTintInfo;
+Landroid/widget/ProgressBar$RefreshData;
+Landroid/widget/ProgressBar$RefreshProgressRunnable;
+Landroid/widget/RemoteViews$ActionException;
+Landroid/widget/RemoteViews$AsyncApplyTask;
+Landroid/widget/RemoteViews$MethodArgs;
+Landroid/widget/RemoteViews$OverrideTextColorsAction;
+Landroid/widget/RemoteViews$RemoteViewsContextWrapper;
+Landroid/widget/RemoteViews$RunnableAction;
+Landroid/widget/RemoteViews$SetEmptyView;
+Landroid/widget/RemoteViews$SetIntTagAction;
+Landroid/widget/RemoteViews$SetPendingIntentTemplate;
+Landroid/widget/RemoteViews$SetRemoteInputsAction;
+Landroid/widget/RemoteViews$SetRemoteViewsAdapterIntent;
+Landroid/widget/RemoteViews$SetRemoteViewsAdapterList;
+Landroid/widget/RemoteViews$SetRippleDrawableColor;
+Landroid/widget/RemoteViews$TextViewDrawableAction;
+Landroid/widget/RemoteViews$TextViewSizeAction;
+Landroid/widget/RemoteViews$ViewContentNavigation;
+Landroid/widget/RemoteViews$ViewGroupActionAdd;
+Landroid/widget/RemoteViews$ViewGroupActionRemove;
+[Landroid/widget/SpellChecker$SpellParser;
+Landroid/widget/Switch;
+Landroid/widget/TextView$1;
+[Landroid/widget/TextView$ChangeWatcher;
+Landroid/widget/TextView$Marquee;
+Landroid/widget/Toast$TN;
+Landroid/widget/Toast$TN$1;
+Landroid/widget/Toolbar$SavedState;
+Lcom/android/framework/protobuf/nano/CodedInputByteBufferNano;
+Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano;
+Lcom/android/framework/protobuf/nano/CodedOutputByteBufferNano$OutOfSpaceException;
+Lcom/android/framework/protobuf/nano/WireFormatNano;
+Lcom/android/i18n/phonenumbers/geocoding/PhoneNumberOfflineGeocoder;
+Lcom/android/i18n/phonenumbers/NumberParseException$ErrorType;
+Lcom/android/i18n/phonenumbers/Phonemetadata$NumberFormat$Builder;
+Lcom/android/i18n/phonenumbers/ShortNumberInfo;
+Lcom/android/ims/-$$Lambda$ImsManager$_6YCQyhjHBSdrm4ZBEMUQ2AAqOY;
+Lcom/android/ims/ImsCall;
+Lcom/android/ims/ImsManager$2;
+Lcom/android/ims/internal/uce/common/UceLong;
+Lcom/android/ims/internal/uce/options/IOptionsListener$Stub;
+Lcom/android/ims/internal/uce/options/IOptionsListener$Stub$Proxy;
+Lcom/android/ims/internal/uce/presence/IPresenceListener$Stub;
+Lcom/android/ims/internal/uce/presence/IPresenceListener$Stub$Proxy;
+Lcom/android/ims/internal/uce/UceServiceBase$UceServiceBinder;
+Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub;
+Lcom/android/ims/internal/uce/uceservice/IUceListener$Stub$Proxy;
+Lcom/android/internal/accessibility/AccessibilityShortcutController$ToggleableFrameworkFeatureInfo;
+Lcom/android/internal/app/AlertController$1;
+Lcom/android/internal/app/AlertController$ButtonHandler;
+Lcom/android/internal/app/AlertController$RecycleListView;
+Lcom/android/internal/app/IAppOpsActiveCallback$Stub$Proxy;
+Lcom/android/internal/app/IAppOpsNotedCallback$Stub$Proxy;
+Lcom/android/internal/app/IVoiceActionCheckCallback$Stub;
+Lcom/android/internal/app/IVoiceActionCheckCallback$Stub$Proxy;
+Lcom/android/internal/app/IVoiceInteractionSessionListener$Stub$Proxy;
+Lcom/android/internal/app/IVoiceInteractionSessionShowCallback$Stub;
+Lcom/android/internal/app/IVoiceInteractor$Stub$Proxy;
+Lcom/android/internal/app/MicroAlertController;
+Lcom/android/internal/app/procstats/DumpUtils;
+Lcom/android/internal/app/procstats/IProcessStats$Stub$Proxy;
+Lcom/android/internal/app/procstats/ProcessState$PssAggr;
+Lcom/android/internal/app/procstats/ProcessStats$TotalMemoryUseCollection;
+Lcom/android/internal/app/ResolverActivity$ActionTitle;
+Lcom/android/internal/app/ToolbarActionBar;
+Lcom/android/internal/appwidget/IAppWidgetHost$Stub;
+Lcom/android/internal/appwidget/IAppWidgetHost$Stub$Proxy;
+Lcom/android/internal/app/WindowDecorActionBar;
+Lcom/android/internal/backup/IBackupTransport$Stub$Proxy;
+Lcom/android/internal/content/PackageHelper$1;
+Lcom/android/internal/graphics/ColorUtils;
+Lcom/android/internal/infra/-$$Lambda$7-CJJfrUZBVuXZyYFEWBNh8Mky8;
+Lcom/android/internal/infra/-$$Lambda$AbstractRemoteService$6FcEKfZ-7TXLg6dcCU8EMuMNAy4;
+Lcom/android/internal/infra/-$$Lambda$AbstractRemoteService$9IBVTCLLZgndvH7fu1P14PW1_1o;
+Lcom/android/internal/infra/-$$Lambda$AbstractRemoteService$ocrHd68Md9x6FfAzVQ6w8MAjFqY;
+Lcom/android/internal/infra/-$$Lambda$AbstractRemoteService$PendingRequest$IBoaBGXZQEXJr69u3aJF-LCJ42Y;
+Lcom/android/internal/infra/-$$Lambda$AbstractRemoteService$YSUzqqi1Pbrg2dlwMGMtKWbGXck;
+Lcom/android/internal/infra/-$$Lambda$EbzSql2RHkXox5Myj8A-7kLC4_A;
+Lcom/android/internal/infra/AbstractRemoteService$MyAsyncPendingRequest;
+Lcom/android/internal/inputmethod/IInputMethodPrivilegedOperations$Stub$Proxy;
+Lcom/android/internal/inputmethod/InputMethodDebug;
+Lcom/android/internal/inputmethod/InputMethodPrivilegedOperations;
+Lcom/android/internal/inputmethod/InputMethodPrivilegedOperations$OpsHolder;
+Lcom/android/internal/inputmethod/InputMethodPrivilegedOperationsRegistry;
+Lcom/android/internal/inputmethod/SubtypeLocaleUtils;
+Lcom/android/internal/location/ILocationProvider;
+Lcom/android/internal/location/ILocationProvider$Stub;
+Lcom/android/internal/location/ILocationProvider$Stub$Proxy;
+Lcom/android/internal/location/ILocationProviderManager$Stub$Proxy;
+Lcom/android/internal/location/nano/GnssLogsProto$GnssLog;
+Lcom/android/internal/location/nano/GnssLogsProto$PowerMetrics;
+Lcom/android/internal/net/INetworkWatchlistManager$Stub$Proxy;
+Lcom/android/internal/net/VpnConfig;
+[Lcom/android/internal/net/VpnInfo;
+Lcom/android/internal/net/VpnProfile;
+Lcom/android/internal/os/-$$Lambda$BinderCallsStats$sqXweH5BoxhmZvI188ctqYiACRk;
+Lcom/android/internal/os/-$$Lambda$sHtqZgGVjxOf9IJdAdZO6gwD_Do;
+Lcom/android/internal/os/BatteryStatsHelper$1;
+Lcom/android/internal/os/BatteryStatsImpl$3;
+Lcom/android/internal/os/BatteryStatsImpl$4;
+[Lcom/android/internal/os/BatteryStatsImpl$Counter;
+[[Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
+[Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
+[Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;
+[Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;
+Lcom/android/internal/os/BatteryStatsImpl$UidToRemove;
+Lcom/android/internal/os/BinderCallsStats$CallStatKey;
+Lcom/android/internal/os/BinderCallsStats$ExportedCallStat;
+Lcom/android/internal/os/BinderDeathDispatcher$RecipientsInfo;
+Lcom/android/internal/os/BinderInternal$CallSession;
+Lcom/android/internal/os/IShellCallback$Stub;
+Lcom/android/internal/os/IShellCallback$Stub$Proxy;
+[Lcom/android/internal/os/KernelCpuSpeedReader;
+Lcom/android/internal/os/KernelCpuThreadReader$ProcessCpuUsage;
+Lcom/android/internal/os/KernelCpuThreadReader$ThreadCpuUsage;
+Lcom/android/internal/os/LooperStats$ExportedEntry;
+[Lcom/android/internal/os/PowerProfile$CpuClusterKey;
+Lcom/android/internal/os/StatsdHiddenApiUsageLogger;
+Lcom/android/internal/os/TransferPipe;
+Lcom/android/internal/os/WifiPowerEstimator;
+Lcom/android/internal/os/WrapperInit;
+Lcom/android/internal/os/ZygoteSecurityException;
+Lcom/android/internal/os/ZygoteServer$UsapPoolRefillAction;
+Lcom/android/internal/policy/DecorView$2;
+Lcom/android/internal/policy/DecorView$3;
+Lcom/android/internal/policy/IKeyguardDismissCallback$Stub;
+Lcom/android/internal/policy/IKeyguardDismissCallback$Stub$Proxy;
+Lcom/android/internal/policy/IKeyguardDrawnCallback$Stub$Proxy;
+Lcom/android/internal/policy/IKeyguardExitCallback$Stub;
+Lcom/android/internal/policy/IKeyguardExitCallback$Stub$Proxy;
+Lcom/android/internal/policy/IKeyguardService$Stub$Proxy;
+Lcom/android/internal/policy/IKeyguardStateCallback$Stub$Proxy;
+Lcom/android/internal/policy/IShortcutService$Stub$Proxy;
+[Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;
+Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState;
+Lcom/android/internal/statusbar/IStatusBar$Stub$Proxy;
+Lcom/android/internal/statusbar/IStatusBarService$Stub$Proxy;
+[Lcom/android/internal/statusbar/NotificationVisibility;
+Lcom/android/internal/statusbar/NotificationVisibility;
+[Lcom/android/internal/statusbar/NotificationVisibility$NotificationLocation;
+Lcom/android/internal/statusbar/NotificationVisibility$NotificationLocation;
+Lcom/android/internal/telecom/IConnectionService;
+Lcom/android/internal/telecom/IConnectionService$Stub;
+Lcom/android/internal/telecom/IConnectionService$Stub$Proxy;
+Lcom/android/internal/telecom/IInCallService;
+Lcom/android/internal/telecom/IInCallService$Stub;
+Lcom/android/internal/telecom/IInCallService$Stub$Proxy;
+Lcom/android/internal/telecom/IVideoProvider$Stub$Proxy;
+Lcom/android/internal/telecom/RemoteServiceCallback$Stub;
+Lcom/android/internal/telecom/RemoteServiceCallback$Stub$Proxy;
+Lcom/android/internal/telephony/-$$Lambda$MultiSimSettingController$55347QtGjuukX-px3jYZkJd_z3U;
+Lcom/android/internal/telephony/-$$Lambda$PhoneSubInfoController$1TnOMFYcM13ZTJNoLjxguPwVcxw;
+Lcom/android/internal/telephony/-$$Lambda$PhoneSubInfoController$2xgrYNleR8FFzFT8hEQx3mDtZ8g;
+Lcom/android/internal/telephony/-$$Lambda$PhoneSubInfoController$EYZUPU0CYhRoptGCGJ9y78u-jQM;
+Lcom/android/internal/telephony/-$$Lambda$PhoneSubInfoController$Ja9yTBcEYPqTRBIP-hL0otixVeE;
+Lcom/android/internal/telephony/-$$Lambda$PhoneSubInfoController$PONge0j2mBi_ILbtJD_7euF0uoM;
+Lcom/android/internal/telephony/-$$Lambda$PhoneSubInfoController$rpyQeO7zACcc5v4krwU9_qRMHL8;
+Lcom/android/internal/telephony/-$$Lambda$PhoneSubInfoController$ZOtVAnuhxrXl2L906I6eTOentP0;
+Lcom/android/internal/telephony/-$$Lambda$RadioIndication$GND6XxOOm1d_Ro76zEUFjA9OrEA;
+Lcom/android/internal/telephony/-$$Lambda$RIL$803u4JiCud_JSoDndvAhT13ZZqU;
+Lcom/android/internal/telephony/-$$Lambda$RIL$Ir4pOMTf7R0Jtw4O3F7JgMVtXO4;
+Lcom/android/internal/telephony/-$$Lambda$RIL$ZGWeCQ9boMO1_J1_yQ82l_jK-Nc;
+Lcom/android/internal/telephony/-$$Lambda$RIL$zYsQZAc3z9bM5fCaq_J0dn5kjjo;
+Lcom/android/internal/telephony/-$$Lambda$SubscriptionController$0y_j8vef67bMEiPQdeWyjuFpPQ8;
+Lcom/android/internal/telephony/-$$Lambda$SubscriptionInfoUpdater$DY4i_CG7hrAeejGLeh3hMUZySnw;
+Lcom/android/internal/telephony/-$$Lambda$SubscriptionInfoUpdater$ecTEeMEIjOEa2z5W3wjqiicibbY;
+Lcom/android/internal/telephony/-$$Lambda$SubscriptionInfoUpdater$qyDxq2AWyReUxdc6HttVGQeDD3Y;
+Lcom/android/internal/telephony/-$$Lambda$SubscriptionInfoUpdater$tLUuQ7lYu8EjRd038qzQlDm-CtA;
+Lcom/android/internal/telephony/-$$Lambda$SubscriptionInfoUpdater$UFyB0ValfLD0rdGDibCjTnGFkeo;
+Lcom/android/internal/telephony/-$$Lambda$SubscriptionInfoUpdater$Y5woGfEDKrozRViLH7WF93qPEno;
+Lcom/android/internal/telephony/-$$Lambda$SubscriptionInfoUpdater$ZTY4uxKw17CHcHQzbBUF7m-dN-E;
+Lcom/android/internal/telephony/-$$Lambda$TelephonyComponentFactory$InjectedComponents$09rMKC8001jAR0zFrzzlPx26Xjs;
+Lcom/android/internal/telephony/-$$Lambda$TelephonyComponentFactory$InjectedComponents$UYUq9z2WZwxqOLXquU0tTNN9wAs;
+Lcom/android/internal/telephony/-$$Lambda$UV1wDVoVlbcxpr8zevj_aMFtUGw;
+Lcom/android/internal/telephony/-$$Lambda$WWHOcG5P4-jgjzPPgLwm-wN15OM;
+Lcom/android/internal/telephony/BlockChecker;
+Lcom/android/internal/telephony/CallerInfoAsyncQuery;
+Lcom/android/internal/telephony/CallerInfoAsyncQuery$CallerInfoAsyncQueryHandler;
+Lcom/android/internal/telephony/CallerInfoAsyncQuery$CallerInfoAsyncQueryHandler$1;
+Lcom/android/internal/telephony/CallerInfoAsyncQuery$CallerInfoAsyncQueryHandler$CallerInfoWorkerHandler;
+Lcom/android/internal/telephony/CallerInfoAsyncQuery$CookieWrapper;
+Lcom/android/internal/telephony/CallerInfoAsyncQuery$QueryPoolException;
+[Lcom/android/internal/telephony/CallForwardInfo;
+[Lcom/android/internal/telephony/CarrierServiceBindHelper$AppBinding;
+Lcom/android/internal/telephony/CarrierServiceBindHelper$CarrierServiceConnection;
+Lcom/android/internal/telephony/CarrierServicesSmsFilter;
+Lcom/android/internal/telephony/CarrierServicesSmsFilter$CallbackTimeoutHandler;
+Lcom/android/internal/telephony/CarrierSmsUtils;
+Lcom/android/internal/telephony/cat/AppInterface$CommandType;
+Lcom/android/internal/telephony/cat/BerTlv;
+Lcom/android/internal/telephony/cat/BIPClientParams;
+Lcom/android/internal/telephony/cat/CallSetupParams;
+Lcom/android/internal/telephony/cat/CatCmdMessage;
+Lcom/android/internal/telephony/cat/CatResponseMessage;
+[Lcom/android/internal/telephony/cat/CatService;
+Lcom/android/internal/telephony/cat/CatService$1;
+Lcom/android/internal/telephony/cat/CommandParams;
+Lcom/android/internal/telephony/cat/CommandParamsFactory$1;
+Lcom/android/internal/telephony/cat/ComprehensionTlv;
+Lcom/android/internal/telephony/cat/ComprehensionTlvTag;
+Lcom/android/internal/telephony/cat/DisplayTextParams;
+Lcom/android/internal/telephony/cat/DTTZResponseData;
+Lcom/android/internal/telephony/cat/LanguageParams;
+Lcom/android/internal/telephony/cat/LanguageResponseData;
+Lcom/android/internal/telephony/cat/LaunchBrowserParams;
+Lcom/android/internal/telephony/cat/ResultCode;
+Lcom/android/internal/telephony/cat/RilMessage;
+[Lcom/android/internal/telephony/cat/RilMessageDecoder;
+Lcom/android/internal/telephony/cat/ValueParser;
+Lcom/android/internal/telephony/cdma/CdmaCallWaitingNotification;
+[Lcom/android/internal/telephony/cdma/CdmaSmsBroadcastConfigInfo;
+Lcom/android/internal/telephony/cdma/SmsMessage;
+Lcom/android/internal/telephony/cdnr/CarrierDisplayNameData;
+Lcom/android/internal/telephony/cdnr/CarrierDisplayNameData$Builder;
+Lcom/android/internal/telephony/cdnr/CarrierDisplayNameResolver;
+Lcom/android/internal/telephony/Connection$Listener;
+Lcom/android/internal/telephony/Connection$PostDialState;
+Lcom/android/internal/telephony/dataconnection/-$$Lambda$DataConnection$-tFSpFGzTv_UdpzJlTMOvg8VO98;
+Lcom/android/internal/telephony/dataconnection/-$$Lambda$XZAGhHrbkIDyusER4MAM6luKcT0;
+Lcom/android/internal/telephony/dataconnection/DataConnection$DisconnectParams;
+Lcom/android/internal/telephony/dataconnection/DataConnection$UpdateLinkPropertyResult;
+Lcom/android/internal/telephony/dataconnection/DataEnabledOverride;
+Lcom/android/internal/telephony/dataconnection/DataEnabledSettings$1;
+Lcom/android/internal/telephony/dataconnection/DataEnabledSettings$2;
+Lcom/android/internal/telephony/dataconnection/DcNetworkAgent;
+Lcom/android/internal/telephony/dataconnection/DcTracker$4;
+Lcom/android/internal/telephony/dataconnection/DcTracker$ProvisionNotificationBroadcastReceiver;
+Lcom/android/internal/telephony/dataconnection/KeepaliveStatus;
+[Lcom/android/internal/telephony/dataconnection/TelephonyNetworkFactory;
+Lcom/android/internal/telephony/dataconnection/TransportManager$HandoverParams;
+Lcom/android/internal/telephony/DriverCall;
+Lcom/android/internal/telephony/DriverCall$State;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$1;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$10;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$11;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$12;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$13;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$2;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$3;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$5;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$6;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$7;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$8;
+Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$9;
+Lcom/android/internal/telephony/euicc/EuiccConnector$DeleteRequest;
+Lcom/android/internal/telephony/euicc/EuiccConnector$DownloadRequest;
+Lcom/android/internal/telephony/euicc/EuiccConnector$GetDefaultListRequest;
+Lcom/android/internal/telephony/euicc/EuiccConnector$GetMetadataRequest;
+Lcom/android/internal/telephony/euicc/EuiccConnector$SwitchRequest;
+Lcom/android/internal/telephony/euicc/EuiccConnector$UpdateNicknameRequest;
+Lcom/android/internal/telephony/euicc/IEuiccController$Stub$Proxy;
+Lcom/android/internal/telephony/GsmCdmaCallTracker$2;
+Lcom/android/internal/telephony/GsmCdmaCallTracker$3;
+[Lcom/android/internal/telephony/GsmCdmaConnection;
+Lcom/android/internal/telephony/GsmCdmaPhone$Cfu;
+Lcom/android/internal/telephony/gsm/GsmMmiCode;
+[Lcom/android/internal/telephony/gsm/SmsBroadcastConfigInfo;
+Lcom/android/internal/telephony/gsm/SmsMessage;
+Lcom/android/internal/telephony/gsm/SuppServiceNotification;
+Lcom/android/internal/telephony/gsm/UsimPhoneBookManager$File;
+Lcom/android/internal/telephony/gsm/UsimPhoneBookManager$PbrRecord;
+Lcom/android/internal/telephony/HbpcdUtils;
+Lcom/android/internal/telephony/IccPhoneBookInterfaceManager$Request;
+Lcom/android/internal/telephony/IIccPhoneBook$Stub$Proxy;
+Lcom/android/internal/telephony/IIntegerConsumer$Stub;
+Lcom/android/internal/telephony/IIntegerConsumer$Stub$Proxy;
+Lcom/android/internal/telephony/IMms$Stub$Proxy;
+Lcom/android/internal/telephony/ims/-$$Lambda$ImsResolver$-jFhgP_NotuFSwzjQBXWuvls4x4;
+Lcom/android/internal/telephony/ims/-$$Lambda$ImsResolver$kF808g2NWzNL8H1SwzDc1FxiQdQ;
+Lcom/android/internal/telephony/ims/-$$Lambda$ImsResolver$rPjfocpARQ2sab24iic4o3kTTgw;
+Lcom/android/internal/telephony/ims/ImsResolver$8;
+Lcom/android/internal/telephony/ims/ImsServiceFeatureQueryManager$ImsServiceFeatureQuery;
+Lcom/android/internal/telephony/imsphone/ImsExternalConnection;
+Lcom/android/internal/telephony/imsphone/ImsPhone$Cf;
+Lcom/android/internal/telephony/imsphone/ImsPhoneConnection;
+Lcom/android/internal/telephony/imsphone/ImsPhoneMmiCode;
+Lcom/android/internal/telephony/ims/RcsMessageController;
+Lcom/android/internal/telephony/InboundSmsHandler$CarrierServicesSmsFilterCallback;
+Lcom/android/internal/telephony/InboundSmsHandler$SmsBroadcastReceiver;
+Lcom/android/internal/telephony/InboundSmsTracker;
+Lcom/android/internal/telephony/INumberVerificationCallback$Stub;
+Lcom/android/internal/telephony/INumberVerificationCallback$Stub$Proxy;
+Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;
+Lcom/android/internal/telephony/ISetOpportunisticDataCallback$Stub$Proxy;
+Lcom/android/internal/telephony/ISms$Stub$Proxy;
+Lcom/android/internal/telephony/IWapPushManager;
+Lcom/android/internal/telephony/LastCallFailCause;
+Lcom/android/internal/telephony/LinkCapacityEstimate;
+Lcom/android/internal/telephony/metrics/-$$Lambda$TelephonyMetrics$fLmZDbNadlr6LF7zSJ6jCR1AAsk;
+Lcom/android/internal/telephony/metrics/-$$Lambda$TelephonyMetrics$x2dJi76S2YQdpSTfY8RZ8qC_K6g;
+Lcom/android/internal/telephony/metrics/ModemPowerMetrics;
+Lcom/android/internal/telephony/metrics/TelephonyMetrics$1;
+Lcom/android/internal/telephony/MultiSimSettingController$1;
+[Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierAttribute;
+[Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierId;
+[Lcom/android/internal/telephony/nano/TelephonyProto$ActiveSubscriptionInfo;
+Lcom/android/internal/telephony/nano/TelephonyProto$EmergencyNumberInfo;
+Lcom/android/internal/telephony/nano/TelephonyProto$ModemPowerStats;
+[Lcom/android/internal/telephony/nano/TelephonyProto$RilDataCall;
+[Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession;
+Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession;
+[Lcom/android/internal/telephony/nano/TelephonyProto$SmsSession$Event;
+[Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession;
+Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession;
+[Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event;
+[Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilCall;
+[Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent;
+Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$OnDemandDataSwitch;
+Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyEvent$RilDeactivateDataCall;
+[Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyHistogram;
+Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyHistogram;
+Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyLog;
+Lcom/android/internal/telephony/nano/TelephonyProto$Time;
+Lcom/android/internal/telephony/NitzStateMachineImpl;
+Lcom/android/internal/telephony/OperatorInfo$State;
+[Lcom/android/internal/telephony/Phone;
+Lcom/android/internal/telephony/PhoneInternalInterface$DialArgs;
+Lcom/android/internal/telephony/PhoneInternalInterface$DialArgs$Builder;
+Lcom/android/internal/telephony/PhoneInternalInterface$SuppService;
+Lcom/android/internal/telephony/PhoneSwitcher$2;
+Lcom/android/internal/telephony/PhoneSwitcher$DefaultNetworkCallback;
+Lcom/android/internal/telephony/PhoneSwitcher$EmergencyOverrideRequest;
+[Lcom/android/internal/telephony/PhoneSwitcher$PhoneState;
+Lcom/android/internal/telephony/protobuf/nano/CodedOutputByteBufferNano$OutOfSpaceException;
+Lcom/android/internal/telephony/protobuf/nano/MessageNanoPrinter;
+Lcom/android/internal/telephony/RadioBugDetector;
+[Lcom/android/internal/telephony/RIL;
+Lcom/android/internal/telephony/sip/SipPhone;
+Lcom/android/internal/telephony/SmsBroadcastUndelivered$SmsReferenceKey;
+Lcom/android/internal/telephony/SmsConstants$MessageClass;
+Lcom/android/internal/telephony/SmsController;
+Lcom/android/internal/telephony/SMSDispatcher$DataSmsSender;
+Lcom/android/internal/telephony/SMSDispatcher$SmsSenderCallback;
+[Lcom/android/internal/telephony/SMSDispatcher$SmsTracker;
+Lcom/android/internal/telephony/SMSDispatcher$SmsTracker;
+Lcom/android/internal/telephony/SMSDispatcher$TextSmsSender;
+Lcom/android/internal/telephony/SmsNumberUtils;
+Lcom/android/internal/telephony/SmsPermissions;
+Lcom/android/internal/telephony/SmsResponse;
+Lcom/android/internal/telephony/TimeServiceHelper;
+Lcom/android/internal/telephony/uicc/CsimFileHandler;
+[Lcom/android/internal/telephony/uicc/IccCardApplicationStatus;
+Lcom/android/internal/telephony/uicc/IccException;
+Lcom/android/internal/telephony/uicc/IccFileNotFound;
+Lcom/android/internal/telephony/uicc/IccFileTypeMismatch;
+Lcom/android/internal/telephony/uicc/IccRefreshResponse;
+Lcom/android/internal/telephony/uicc/IccVmNotSupportedException;
+Lcom/android/internal/telephony/uicc/InstallCarrierAppTrampolineActivity;
+Lcom/android/internal/telephony/uicc/IsimFileHandler;
+Lcom/android/internal/telephony/uicc/IsimUiccRecords;
+Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimDomainLoaded;
+Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimImpiLoaded;
+Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimImpuLoaded;
+Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimIstLoaded;
+Lcom/android/internal/telephony/uicc/IsimUiccRecords$EfIsimPcscfLoaded;
+[Lcom/android/internal/telephony/uicc/PlmnActRecord;
+Lcom/android/internal/telephony/uicc/RuimFileHandler;
+Lcom/android/internal/telephony/uicc/RuimRecords;
+Lcom/android/internal/telephony/uicc/SIMFileHandler;
+[Lcom/android/internal/telephony/uicc/UiccCardApplication;
+Lcom/android/internal/telephony/uicc/UiccCarrierPrivilegeRules$TLV;
+Lcom/android/internal/telephony/uicc/UiccPkcs15$FileHandler;
+Lcom/android/internal/telephony/uicc/UiccProfile$5;
+[Lcom/android/internal/telephony/uicc/UiccSlot;
+Lcom/android/internal/telephony/util/SMSDispatcherUtil;
+Lcom/android/internal/telephony/UUSInfo;
+Lcom/android/internal/telephony/VisualVoicemailSmsFilter;
+Lcom/android/internal/textservice/ISpellCheckerService;
+Lcom/android/internal/textservice/ISpellCheckerService$Stub;
+Lcom/android/internal/textservice/ISpellCheckerService$Stub$Proxy;
+Lcom/android/internal/textservice/ISpellCheckerSession$Stub;
+Lcom/android/internal/textservice/ISpellCheckerSessionListener$Stub$Proxy;
+Lcom/android/internal/textservice/ITextServicesSessionListener$Stub$Proxy;
+Lcom/android/internal/util/-$$Lambda$DumpUtils$D1OlZP6xIpu72ypnJd0fzx0wd6I;
+Lcom/android/internal/util/-$$Lambda$DumpUtils$vCLO_0ezRxkpSERUWCFrJ0ph5jg;
+Lcom/android/internal/util/-$$Lambda$DumpUtils$X8irOs5hfloCKy89_l1HRA1QeG0;
+Lcom/android/internal/util/-$$Lambda$eRa1rlfDk6Og2yFeXGHqUGPzRF0;
+Lcom/android/internal/util/-$$Lambda$FunctionalUtils$koCSI8D7Nu5vOJTVTEj0m3leo_U;
+Lcom/android/internal/util/-$$Lambda$grRTg3idX3yJe9Zyx-tmLBiD1DM;
+Lcom/android/internal/util/-$$Lambda$JwOUSWW2-Jzu15y4Kn4JuPh8tWM;
+Lcom/android/internal/util/-$$Lambda$kVylv1rl9MOSbHFZoVyK5dl1kfY;
+Lcom/android/internal/util/-$$Lambda$TCbPpgWlKJUHZgFKCczglAvxLfw;
+Lcom/android/internal/util/ContrastColorUtil;
+Lcom/android/internal/util/ContrastColorUtil$ColorUtilsFromCompat;
+Lcom/android/internal/util/function/HeptPredicate;
+Lcom/android/internal/util/function/HexPredicate;
+Lcom/android/internal/util/function/NonaPredicate;
+Lcom/android/internal/util/function/OctPredicate;
+Lcom/android/internal/util/function/QuadPredicate;
+Lcom/android/internal/util/function/QuintPredicate;
+Lcom/android/internal/util/MessageUtils$DuplicateConstantError;
+Lcom/android/internal/util/ProcFileReader;
+[Lcom/android/internal/util/StateMachine$SmHandler$StateInfo;
+Lcom/android/internal/util/SyncResultReceiver$TimeoutException;
+Lcom/android/internal/util/UserIcons;
+Lcom/android/internal/view/IInputMethod$Stub$Proxy;
+Lcom/android/internal/view/IInputMethodClient$Stub$Proxy;
+Lcom/android/internal/view/IInputSessionCallback$Stub$Proxy;
+Lcom/android/internal/view/InputConnectionWrapper;
+Lcom/android/internal/view/InputConnectionWrapper$InputContextCallback;
+Lcom/android/internal/view/menu/ActionMenuItemView;
+Lcom/android/internal/view/menu/ActionMenuItemView$ActionMenuItemForwardingListener;
+Lcom/android/internal/view/menu/MenuPopupHelper$1;
+Lcom/android/internal/view/menu/MenuView$ItemView;
+Lcom/android/internal/view/OneShotPreDrawListener;
+Lcom/android/internal/view/RotationPolicy$1;
+Lcom/android/internal/widget/ActionBarOverlayLayout;
+Lcom/android/internal/widget/DecorCaptionView;
+Lcom/android/internal/widget/ICheckCredentialProgressCallback$Stub;
+Lcom/android/internal/widget/ICheckCredentialProgressCallback$Stub$Proxy;
+Lcom/android/internal/widget/SwipeDismissLayout;
+Lcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory;
+Lcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter;
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;
+Lcom/android/org/conscrypt/TrustedCertificateStore;
+Lcom/android/org/conscrypt/TrustedCertificateStore$PreloadHolder;
+Lcom/android/org/conscrypt/TrustManagerImpl;
+[Lcom/android/ph
+[Lcom/android/phone/ecc/nano/ProtobufEccData$CountryInfo;
+[Lcom/android/phone/ecc/nano/ProtobufEccData$EccInfo;
+Lcom/android/server/backup/AccountManagerBackupHelper;
+Lcom/android/server/backup/AccountSyncSettingsBackupHelper;
+Lcom/android/server/backup/NotificationBackupHelper;
+Lcom/android/server/backup/PermissionBackupHelper;
+Lcom/android/server/backup/PreferredActivityBackupHelper;
+Lcom/android/server/backup/ShortcutBackupHelper;
+Lcom/android/server/backup/SliceBackupHelper;
+Lcom/android/server/backup/UsageStatsBackupHelper;
+Lcom/android/server/BootReceiver;
+Lcom/android/server/BootReceiver$1;
+Lcom/android/server/BootReceiver$2;
+[Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$IpConnectivityEvent;
+[Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$Pair;
+Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$Pair;
+Lcom/android/server/sip/SipService$ConnectivityReceiver;
+Lcom/android/server/sip/SipService$MyExecutor;
+Lcom/android/server/sip/SipWakeLock;
+Lcom/android/server/sip/SipWakeupTimer$MyEventComparator;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$AlertReasonCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$ConnectionEvent;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$ConnectToNetworkNotificationAndActionCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$DeviceMobilityStatePnoScanStats;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$GroupEvent;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$HistogramBucketInt32;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$Int32Count;
+Lcom/android/server/wifi/nano/WifiMetricsProto$Int32Count;
+Lcom/android/server/wifi/nano/WifiMetricsProto$LinkProbeStats$ExperimentProbeCounts;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$LinkProbeStats$LinkProbeFailureReasonCount;
+Lcom/android/server/wifi/nano/WifiMetricsProto$LinkProbeStats$LinkProbeFailureReasonCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$LinkSpeedCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$NetworkSelectionExperimentDecisions;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$NumConnectableNetworksBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$P2pConnectionEvent;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$PasspointProfileTypeCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$RssiPollCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$SoftApConnectedClientsEvent;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$SoftApDurationBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$SoftApReturnCodeCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$StaEvent;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiAwareLog$HistogramBucket;
+Lcom/android/server/wifi/nano/WifiMetricsProto$WifiAwareLog$HistogramBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiAwareLog$NanStatusHistogramBucket;
+Lcom/android/server/wifi/nano/WifiMetricsProto$WifiAwareLog$NanStatusHistogramBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiConfigStoreIO$DurationBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiDppLog$DppConfiguratorSuccessStatusHistogramBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiDppLog$DppFailureStatusHistogramBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiIsUnusableEvent;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiLog$ScanReturnEntry;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiLog$WifiSystemStateEntry;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiRttLog$HistogramBucket;
+Lcom/android/server/wifi/nano/WifiMetricsProto$WifiRttLog$HistogramBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiRttLog$RttIndividualStatusHistogramBucket;
+Lcom/android/server/wifi/nano/WifiMetricsProto$WifiRttLog$RttIndividualStatusHistogramBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiRttLog$RttOverallStatusHistogramBucket;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiScoreCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiUsabilityScoreCount;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiUsabilityStats;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiUsabilityStatsEntry;
+Lcom/android/server/wifi/nano/WifiMetricsProto$WifiUsabilityStatsEntry;
+[Lcom/android/server/wifi/nano/WifiMetricsProto$WifiWakeStats$Session;
+Lcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto;
+Lcom/google/android/rappor/Encoder;
+Lcom/google/android/rappor/HmacDrbg;
+Lcom/google/android/textclassifier/ActionsSuggestionsModel;
+Lcom/google/android/textclassifier/ActionsSuggestionsModel$Conversation;
+[Lcom/google/android/textclassifier/ActionsSuggestionsModel$ConversationMessage;
+Lcom/google/android/textclassifier/ActionsSuggestionsModel$ConversationMessage;
+Lcom/google/android/textclassifier/AnnotatorModel;
+Lcom/google/android/textclassifier/LangIdModel;
+[Ljava/lang/Double;
+[Ljava/lang/Runnable;
+[Ljava/lang/Void;
+[Ljava/net/InetAddress;
+Ljava/nio/file/Files$AcceptAllFilter;
+[Ljava/nio/file/OpenOption;
+[[Ljava/security/cert/Certificate;
+[Ljava/security/cert/Certificate;
+[[Ljava/security/cert/X509Certificate;
+[Ljava/security/cert/X509Certificate;
+[Ljava/security/MessageDigest;
+Ljava/security/spec/PSSParameterSpec;
+Ljava/time/-$$Lambda$up1HpCqucM_DXyY-rpDOyCcdmIA;
+[Ljava/util/concurrent/RunnableScheduledFuture;
+[Ljava/util/HashMap;
+Ljava/util/logging/Logger$SystemLoggerHelper;
+Ljava/util/PropertyPermission;
+Ljava/util/stream/-$$Lambda$MatchOps$emK14UX33I4-nqH2o5l7hLEVAy8;
+[Ljavax/net/ssl/TrustManager;
+Llibcore/icu/RelativeDateTimeFormatter;
+Lsun/security/util/SecurityConstants;
+Lsun/util/locale/LocaleMatcher;
diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt
index 9f48f8a..917ee6d 100644
--- a/config/hiddenapi-greylist.txt
+++ b/config/hiddenapi-greylist.txt
@@ -591,30 +591,6 @@
Landroid/telephony/mbms/IMbmsStreamingSessionCallback$Stub;-><init>()V
Landroid/telephony/mbms/IStreamingServiceCallback$Stub;-><init>()V
Landroid/telephony/mbms/vendor/IMbmsStreamingService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/telephony/mbms/vendor/IMbmsStreamingService;
-Landroid/telephony/SmsCbCmasInfo;->getCategory()I
-Landroid/telephony/SmsCbCmasInfo;->getCertainty()I
-Landroid/telephony/SmsCbCmasInfo;->getMessageClass()I
-Landroid/telephony/SmsCbCmasInfo;->getResponseType()I
-Landroid/telephony/SmsCbCmasInfo;->getSeverity()I
-Landroid/telephony/SmsCbCmasInfo;->getUrgency()I
-Landroid/telephony/SmsCbEtwsInfo;->getWarningType()I
-Landroid/telephony/SmsCbLocation;-><init>(Ljava/lang/String;)V
-Landroid/telephony/SmsCbLocation;-><init>(Ljava/lang/String;II)V
-Landroid/telephony/SmsCbLocation;->getCid()I
-Landroid/telephony/SmsCbLocation;->getLac()I
-Landroid/telephony/SmsCbLocation;->getPlmn()Ljava/lang/String;
-Landroid/telephony/SmsCbMessage;-><init>(Landroid/os/Parcel;)V
-Landroid/telephony/SmsCbMessage;->getCmasWarningInfo()Landroid/telephony/SmsCbCmasInfo;
-Landroid/telephony/SmsCbMessage;->getEtwsWarningInfo()Landroid/telephony/SmsCbEtwsInfo;
-Landroid/telephony/SmsCbMessage;->getGeographicalScope()I
-Landroid/telephony/SmsCbMessage;->getLanguageCode()Ljava/lang/String;
-Landroid/telephony/SmsCbMessage;->getLocation()Landroid/telephony/SmsCbLocation;
-Landroid/telephony/SmsCbMessage;->getMessageBody()Ljava/lang/String;
-Landroid/telephony/SmsCbMessage;->getMessageFormat()I
-Landroid/telephony/SmsCbMessage;->getSerialNumber()I
-Landroid/telephony/SmsCbMessage;->getServiceCategory()I
-Landroid/telephony/SmsCbMessage;->isCmasMessage()Z
-Landroid/telephony/SmsCbMessage;->isEmergencyMessage()Z
Landroid/telephony/TelephonyManager$MultiSimVariants;->values()[Landroid/telephony/TelephonyManager$MultiSimVariants;
Landroid/util/Singleton;-><init>()V
Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index 84c6855..5dbca12 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -276,10 +276,24 @@
public static final int DEVICE_STARTUP = 27;
/**
+ * An event type denoting that a user has been unlocked for the first time. This event
+ * mainly indicates when the user's credential encrypted storage was first accessible.
+ * @hide
+ */
+ public static final int USER_UNLOCKED = 28;
+
+ /**
+ * An event type denoting that a user has been stopped. This typically happens when the
+ * system is being turned off or when users are being switched.
+ * @hide
+ */
+ public static final int USER_STOPPED = 29;
+
+ /**
* Keep in sync with the greatest event type value.
* @hide
*/
- public static final int MAX_EVENT_TYPE = 27;
+ public static final int MAX_EVENT_TYPE = 29;
/** @hide */
public static final int FLAG_IS_PACKAGE_INSTANT_APP = 1 << 0;
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 749a011..656f474 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -31,6 +31,7 @@
import android.os.Build;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.os.UserManager;
import android.util.ArrayMap;
import java.lang.annotation.Retention;
@@ -290,6 +291,9 @@
* </p>
*
* <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} </p>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then {@code null} will be returned.</em>
*
* @param intervalType The time interval by which the stats are aggregated.
* @param beginTime The inclusive beginning of the range of stats to include in the results.
@@ -324,6 +328,9 @@
* the specified interval. The results are ordered as in
* {@link #queryUsageStats(int, long, long)}.
* <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} </p>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then {@code null} will be returned.</em>
*
* @param intervalType The time interval by which the stats are aggregated.
* @param beginTime The inclusive beginning of the range of stats to include in the results.
@@ -362,6 +369,9 @@
* </ul>
*
* <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} </p>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then {@code null} will be returned.</em>
*
* @param intervalType The time interval by which the stats are aggregated.
* @param beginTime The inclusive beginning of the range of stats to include in the results.
@@ -395,6 +405,9 @@
* Query for events in the given time range. Events are only kept by the system for a few
* days.
* <p> The caller must have {@link android.Manifest.permission#PACKAGE_USAGE_STATS} </p>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then {@code null} will be returned.</em>
*
* @param beginTime The inclusive beginning of the range of events to include in the results.
* Defined in terms of "Unix time", see
@@ -418,6 +431,9 @@
/**
* Like {@link #queryEvents(long, long)}, but only returns events for the calling package.
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then {@code null} will be returned.</em>
*
* @param beginTime The inclusive beginning of the range of events to include in the results.
* Defined in terms of "Unix time", see
diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java
index bbec6b3..b3260c4 100644
--- a/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -21,6 +21,7 @@
import android.content.ComponentName;
import android.content.res.Configuration;
import android.os.UserHandle;
+import android.os.UserManager;
import java.util.List;
import java.util.Set;
@@ -33,7 +34,10 @@
public abstract class UsageStatsManagerInternal {
/**
- * Reports an event to the UsageStatsManager.
+ * Reports an event to the UsageStatsManager. <br/>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then this event will be added to a queue and processed once the device is unlocked.</em>
*
* @param component The component for which this event occurred.
* @param userId The user id to which the component belongs to.
@@ -48,7 +52,10 @@
int instanceId, ComponentName taskRoot);
/**
- * Reports an event to the UsageStatsManager.
+ * Reports an event to the UsageStatsManager. <br/>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then this event will be added to a queue and processed once the device is unlocked.</em>
*
* @param packageName The package for which this event occurred.
* @param userId The user id to which the component belongs to.
@@ -58,14 +65,20 @@
public abstract void reportEvent(String packageName, @UserIdInt int userId, int eventType);
/**
- * Reports a configuration change to the UsageStatsManager.
+ * Reports a configuration change to the UsageStatsManager. <br/>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then this event will be added to a queue and processed once the device is unlocked.</em>
*
* @param config The new device configuration.
*/
public abstract void reportConfigurationChange(Configuration config, @UserIdInt int userId);
/**
- * Reports that an application has posted an interruptive notification.
+ * Reports that an application has posted an interruptive notification. <br/>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then this event will be added to a queue and processed once the device is unlocked.</em>
*
* @param packageName The package name of the app that posted the notification
* @param channelId The ID of the NotificationChannel to which the notification was posted
@@ -75,7 +88,10 @@
@UserIdInt int userId);
/**
- * Reports that an action equivalent to a ShortcutInfo is taken by the user.
+ * Reports that an action equivalent to a ShortcutInfo is taken by the user. <br/>
+ * <em>Note: Starting from {@link android.os.Build.VERSION_CODES#R Android R}, if the user's
+ * device is not in an unlocked state (as defined by {@link UserManager#isUserUnlocked()}),
+ * then this event will be added to a queue and processed once the device is unlocked.</em>
*
* @param packageName The package name of the shortcut publisher
* @param shortcutId The ID of the shortcut in question
diff --git a/core/java/android/bluetooth/BluetoothOutputStream.java b/core/java/android/bluetooth/BluetoothOutputStream.java
index dfec4e1..a0aa2de 100644
--- a/core/java/android/bluetooth/BluetoothOutputStream.java
+++ b/core/java/android/bluetooth/BluetoothOutputStream.java
@@ -75,16 +75,4 @@
}
mSocket.write(b, offset, count);
}
-
- /**
- * Wait until the data in sending queue is emptied. A polling version
- * for flush implementation. Use it to ensure the writing data afterwards will
- * be packed in the new RFCOMM frame.
- *
- * @throws IOException if an i/o error occurs.
- * @since Android 4.2.3
- */
- public void flush() throws IOException {
- mSocket.flush();
- }
}
diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java
index a6e3153..760166b 100644
--- a/core/java/android/bluetooth/BluetoothSocket.java
+++ b/core/java/android/bluetooth/BluetoothSocket.java
@@ -515,20 +515,6 @@
return mSocketIS.available();
}
- /**
- * Wait until the data in sending queue is emptied. A polling version
- * for flush implementation. Used to ensure the writing data afterwards will
- * be packed in new RFCOMM frame.
- *
- * @throws IOException if an i/o error occurs.
- */
- @UnsupportedAppUsage
- /*package*/ void flush() throws IOException {
- if (mSocketOS == null) throw new IOException("flush is called on null OutputStream");
- if (VDBG) Log.d(TAG, "flush: " + mSocketOS);
- mSocketOS.flush();
- }
-
/*package*/ int read(byte[] b, int offset, int length) throws IOException {
int ret = 0;
if (VDBG) Log.d(TAG, "read in: " + mSocketIS + " len: " + length);
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 33e51c9..b8ab114 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -2169,6 +2169,13 @@
}
/**
+ * Setting camera audio restriction mode.
+ *
+ * @hide
+ */
+ public native final int setAudioRestriction(int mode);
+
+ /**
* Image size (width and height dimensions).
* @deprecated We recommend using the new {@link android.hardware.camera2} API for new
* applications.
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index bac6522..ed2d0c9 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -164,6 +164,37 @@
TEMPLATE_MANUAL})
public @interface RequestTemplate {};
+ /**
+ * No vibration or sound muting for this camera device. This is the default
+ * mode for all camera devices.
+ *
+ * @see #setCameraAudioRestriction
+ */
+ public static final int AUDIO_RESTRICTION_NONE = 0;
+
+ /**
+ * Mute vibration from ringtones, alarms or notifications while this camera device is in use.
+ *
+ * @see #setCameraAudioRestriction
+ */
+ public static final int AUDIO_RESTRICTION_VIBRATION = 1;
+
+ /**
+ * Mute vibration and sound from ringtones, alarms or notifications while this camera device is
+ * in use.
+ *
+ * @see #setCameraAudioRestriction
+ */
+ public static final int AUDIO_RESTRICTION_VIBRATION_SOUND = 3;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"AUDIO_RESTRICTION_"}, value =
+ {AUDIO_RESTRICTION_NONE,
+ AUDIO_RESTRICTION_VIBRATION,
+ AUDIO_RESTRICTION_VIBRATION_SOUND})
+ public @interface CAMERA_AUDIO_RESTRICTION {};
+
/**
* Get the ID of this camera device.
*
@@ -1208,6 +1239,37 @@
}
/**
+ * Set audio restriction mode when this CameraDevice is being used.
+ *
+ * <p>Some camera hardware (e.g. devices with optical image stabilization support)
+ * are sensitive to device vibration and video recordings can be ruined by unexpected sounds.
+ * Applications can use this method to suppress vibration or sounds coming from
+ * ringtones, alarms or notifications.
+ * Other vibration or sounds (e.g. media playback or accessibility) will not be muted.</p>
+ *
+ * <p>The mute mode is a system-wide setting. When multiple CameraDevice objects
+ * are setting different modes, the system will pick a the mode that's union of
+ * all modes set by CameraDevice.</p>
+ *
+ * <p>The mute settings will be automatically removed when the CameraDevice is closed or
+ * the application is disconnected from the camera.</p>
+ *
+ * @param mode An enumeration selecting the audio restriction mode for this camera device.
+ *
+ * @return The system-wide mute mode setting resulting from this call
+ *
+ * @throws IllegalArgumentException if the mode is not supported
+ *
+ * @throws CameraAccessException if the camera device is no longer connected or has
+ * encountered a fatal error
+ * @throws IllegalStateException if the camera device has been closed
+ */
+ public @CAMERA_AUDIO_RESTRICTION int setCameraAudioRestriction(
+ @CAMERA_AUDIO_RESTRICTION int mode) throws CameraAccessException {
+ throw new UnsupportedOperationException("Subclasses must override this method");
+ }
+
+ /**
* To be inherited by android.hardware.camera2.* code only.
* @hide
*/
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 6a2fc8a..3f56dfa 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -2790,6 +2790,12 @@
* output capture result.</p>
* <p>This control is only effective if {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} or {@link CaptureRequest#CONTROL_MODE android.control.mode} is set to
* OFF; otherwise the auto-exposure algorithm will override this value.</p>
+ * <p>Note that for devices supporting postRawSensitivityBoost, the total sensitivity applied
+ * to the final processed image is the combination of {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity} and
+ * {@link CaptureRequest#CONTROL_POST_RAW_SENSITIVITY_BOOST android.control.postRawSensitivityBoost}. In case the application uses the sensor
+ * sensitivity from last capture result of an auto request for a manual request, in order
+ * to achieve the same brightness in the output image, the application should also
+ * set postRawSensitivityBoost.</p>
* <p><b>Units</b>: ISO arithmetic units</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange}</p>
@@ -2800,9 +2806,11 @@
*
* @see CaptureRequest#CONTROL_AE_MODE
* @see CaptureRequest#CONTROL_MODE
+ * @see CaptureRequest#CONTROL_POST_RAW_SENSITIVITY_BOOST
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
* @see CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE
* @see CameraCharacteristics#SENSOR_MAX_ANALOG_SENSITIVITY
+ * @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
@NonNull
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index ba451e5..1007fd9 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -3428,6 +3428,12 @@
* output capture result.</p>
* <p>This control is only effective if {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} or {@link CaptureRequest#CONTROL_MODE android.control.mode} is set to
* OFF; otherwise the auto-exposure algorithm will override this value.</p>
+ * <p>Note that for devices supporting postRawSensitivityBoost, the total sensitivity applied
+ * to the final processed image is the combination of {@link CaptureRequest#SENSOR_SENSITIVITY android.sensor.sensitivity} and
+ * {@link CaptureRequest#CONTROL_POST_RAW_SENSITIVITY_BOOST android.control.postRawSensitivityBoost}. In case the application uses the sensor
+ * sensitivity from last capture result of an auto request for a manual request, in order
+ * to achieve the same brightness in the output image, the application should also
+ * set postRawSensitivityBoost.</p>
* <p><b>Units</b>: ISO arithmetic units</p>
* <p><b>Range of valid values:</b><br>
* {@link CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE android.sensor.info.sensitivityRange}</p>
@@ -3438,9 +3444,11 @@
*
* @see CaptureRequest#CONTROL_AE_MODE
* @see CaptureRequest#CONTROL_MODE
+ * @see CaptureRequest#CONTROL_POST_RAW_SENSITIVITY_BOOST
* @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL
* @see CameraCharacteristics#SENSOR_INFO_SENSITIVITY_RANGE
* @see CameraCharacteristics#SENSOR_MAX_ANALOG_SENSITIVITY
+ * @see CaptureRequest#SENSOR_SENSITIVITY
*/
@PublicKey
@NonNull
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 68857da9..1f385dd 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -2568,4 +2568,13 @@
Binder.restoreCallingIdentity(ident);
}
}
+
+ @Override
+ public @CAMERA_AUDIO_RESTRICTION int setCameraAudioRestriction(
+ @CAMERA_AUDIO_RESTRICTION int mode) throws CameraAccessException {
+ synchronized(mInterfaceLock) {
+ checkIfCameraClosedOrInError();
+ return mRemoteDevice.setCameraAudioRestriction(mode);
+ }
+ }
}
diff --git a/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java b/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java
index c8ded8d..ff2819b 100644
--- a/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java
+++ b/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java
@@ -258,4 +258,13 @@
}
}
+ public int setCameraAudioRestriction(int mode) throws CameraAccessException {
+ try {
+ return mRemoteDevice.setCameraAudioRestriction(mode);
+ } catch (Throwable t) {
+ CameraManager.throwAsPublicException(t);
+ throw new UnsupportedOperationException("Unexpected exception", t);
+ }
+ }
+
}
diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
index c28cf8f..0fa17c1 100644
--- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
+++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
@@ -767,6 +767,17 @@
}
@Override
+ public int setCameraAudioRestriction(int mode) {
+ if (mLegacyDevice.isClosed()) {
+ String err = "Cannot set camera audio restriction, device has been closed.";
+ Log.e(TAG, err);
+ throw new ServiceSpecificException(ICameraService.ERROR_DISCONNECTED, err);
+ }
+
+ return mLegacyDevice.setAudioRestriction(mode);
+ }
+
+ @Override
public IBinder asBinder() {
// This is solely intended to be used for in-process binding.
return null;
diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
index 908ed09..c0d8baa 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
@@ -550,6 +550,10 @@
return lastFrame;
}
+ public int setAudioRestriction(int mode) {
+ return mRequestThreadManager.setAudioRestriction(mode);
+ }
+
/**
* Return {@code true} if the device has been closed.
*/
diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
index 690df1a..a514ee1 100644
--- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
+++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
@@ -1104,4 +1104,11 @@
handler.sendMessage(handler.obtainMessage(MSG_CONFIGURE_OUTPUTS, 0, 0, holder));
condition.block();
}
+
+ public int setAudioRestriction(int mode) {
+ if (mCamera != null) {
+ return mCamera.setAudioRestriction(mode);
+ }
+ throw new IllegalStateException("Camera has been released!");
+ }
}
diff --git a/core/java/android/net/LocalSocketImpl.java b/core/java/android/net/LocalSocketImpl.java
index fe7632c..b066a15 100644
--- a/core/java/android/net/LocalSocketImpl.java
+++ b/core/java/android/net/LocalSocketImpl.java
@@ -157,40 +157,6 @@
write_native(b, myFd);
}
}
-
- /**
- * Wait until the data in sending queue is emptied. A polling version
- * for flush implementation.
- * @throws IOException
- * if an i/o error occurs.
- */
- @Override
- public void flush() throws IOException {
- FileDescriptor myFd = fd;
- if (myFd == null) throw new IOException("socket closed");
-
- // Loop until the output buffer is empty.
- Int32Ref pending = new Int32Ref(0);
- while (true) {
- try {
- // See linux/net/unix/af_unix.c
- Os.ioctlInt(myFd, OsConstants.TIOCOUTQ, pending);
- } catch (ErrnoException e) {
- throw e.rethrowAsIOException();
- }
-
- if (pending.value <= 0) {
- // The output buffer is empty.
- break;
- }
-
- try {
- Thread.sleep(10);
- } catch (InterruptedException ie) {
- break;
- }
- }
- }
}
private native int read_native(FileDescriptor fd) throws IOException;
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index d0ecae9..c798d85 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -602,4 +602,22 @@
mAnimCallbackScheduled = true;
}
}
+
+ @Override
+ public void setSystemBarsAppearance(@Appearance int appearance) {
+ if (mViewRoot.mWindowAttributes.insetsFlags.appearance != appearance) {
+ mViewRoot.mWindowAttributes.insetsFlags.appearance = appearance;
+ mViewRoot.mWindowAttributesChanged = true;
+ mViewRoot.scheduleTraversals();
+ }
+ }
+
+ @Override
+ public void setSystemBarsBehavior(@Behavior int behavior) {
+ if (mViewRoot.mWindowAttributes.insetsFlags.behavior != behavior) {
+ mViewRoot.mWindowAttributes.insetsFlags.behavior = behavior;
+ mViewRoot.mWindowAttributesChanged = true;
+ mViewRoot.scheduleTraversals();
+ }
+ }
}
diff --git a/core/java/android/view/InsetsFlags.java b/core/java/android/view/InsetsFlags.java
new file mode 100644
index 0000000..276e80a
--- /dev/null
+++ b/core/java/android/view/InsetsFlags.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2019 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.view;
+
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_SIDE_BARS;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_TOP_BAR;
+import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
+import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_BARS;
+import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE;
+import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
+
+import android.view.WindowInsetsController.Appearance;
+import android.view.WindowInsetsController.Behavior;
+
+/**
+ * Contains the information about {@link Appearance} and {@link Behavior} of system windows which
+ * can produce insets. This is for carrying the request from a client to the system server.
+ * @hide
+ */
+public class InsetsFlags {
+
+ @ViewDebug.ExportedProperty(flagMapping = {
+ @ViewDebug.FlagToString(
+ mask = APPEARANCE_OPAQUE_BARS,
+ equals = APPEARANCE_OPAQUE_BARS,
+ name = "OPAQUE_BARS"),
+ @ViewDebug.FlagToString(
+ mask = APPEARANCE_LOW_PROFILE_BARS,
+ equals = APPEARANCE_LOW_PROFILE_BARS,
+ name = "LOW_PROFILE_BARS"),
+ @ViewDebug.FlagToString(
+ mask = APPEARANCE_LIGHT_TOP_BAR,
+ equals = APPEARANCE_LIGHT_TOP_BAR,
+ name = "LIGHT_TOP_BAR"),
+ @ViewDebug.FlagToString(
+ mask = APPEARANCE_LIGHT_SIDE_BARS,
+ equals = APPEARANCE_LIGHT_SIDE_BARS,
+ name = "LIGHT_SIDE_BARS")
+ })
+ public @Appearance int appearance;
+
+ @ViewDebug.ExportedProperty(flagMapping = {
+ @ViewDebug.FlagToString(
+ mask = BEHAVIOR_SHOW_BARS_BY_SWIPE,
+ equals = BEHAVIOR_SHOW_BARS_BY_SWIPE,
+ name = "SHOW_BARS_BY_SWIPE"),
+ @ViewDebug.FlagToString(
+ mask = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE,
+ equals = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE,
+ name = "SHOW_TRANSIENT_BARS_BY_SWIPE")
+ })
+ public @Behavior int behavior;
+}
diff --git a/core/java/android/view/WindowInsetsController.java b/core/java/android/view/WindowInsetsController.java
index b708323..396422e 100644
--- a/core/java/android/view/WindowInsetsController.java
+++ b/core/java/android/view/WindowInsetsController.java
@@ -18,9 +18,14 @@
import static android.view.WindowInsets.Type.ime;
+import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.graphics.Insets;
import android.view.WindowInsets.Type.InsetType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* Interface to control windows that generate insets.
*
@@ -30,6 +35,73 @@
public interface WindowInsetsController {
/**
+ * Makes system bars become opaque with solid dark background and light foreground.
+ * @hide
+ */
+ int APPEARANCE_OPAQUE_BARS = 1;
+
+ /**
+ * Makes items on system bars become less noticeable without changing the layout of the bars.
+ * @hide
+ */
+ int APPEARANCE_LOW_PROFILE_BARS = 1 << 1;
+
+ /**
+ * Changes the foreground color for the light top bar so that the items on the bar can be read
+ * clearly.
+ */
+ int APPEARANCE_LIGHT_TOP_BAR = 1 << 2;
+
+ /**
+ * Changes the foreground color for the light side bars so that the items on the bar can be read
+ * clearly.
+ */
+ int APPEARANCE_LIGHT_SIDE_BARS = 1 << 3;
+
+ /** Determines the appearance of system bars. */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true, value = {APPEARANCE_OPAQUE_BARS, APPEARANCE_LOW_PROFILE_BARS,
+ APPEARANCE_LIGHT_TOP_BAR, APPEARANCE_LIGHT_SIDE_BARS})
+ @interface Appearance {
+ }
+
+ /**
+ * The default option for {@link #setSystemBarsBehavior(int)}. The side bars will be forcibly
+ * shown by the system on any user interaction on the corresponding display if the side bars are
+ * hidden by {@link #hide(int)} or {@link WindowInsetsAnimationController#changeInsets(Insets)}.
+ */
+ int BEHAVIOR_SHOW_SIDE_BARS_BY_TOUCH = 0;
+
+ /**
+ * Option for {@link #setSystemBarsBehavior(int)}: Window would like to remain interactive when
+ * hiding the side bars by calling {@link #hide(int)} or
+ * {@link WindowInsetsAnimationController#changeInsets(Insets)}.
+ *
+ * <p>When system bars are hidden in this mode, they can be revealed with system gestures, such
+ * as swiping from the edge of the screen where the bar is hidden from.</p>
+ */
+ int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1;
+
+ /**
+ * Option for {@link #setSystemBarsBehavior(int)}: Window would like to remain interactive when
+ * hiding the side bars by calling {@link #hide(int)} or
+ * {@link WindowInsetsAnimationController#changeInsets(Insets)}.
+ *
+ * <p>When system bars are hidden in this mode, they can be revealed temporarily with system
+ * gestures, such as swiping from the edge of the screen where the bar is hidden from. These
+ * transient system bars will overlay app’s content, may have some degree of transparency, and
+ * will automatically hide after a short timeout.</p>
+ */
+ int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2;
+
+ /** Determines the behavior of system bars when hiding them by calling {@link #hide}. */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = {BEHAVIOR_SHOW_SIDE_BARS_BY_TOUCH, BEHAVIOR_SHOW_BARS_BY_SWIPE,
+ BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE})
+ @interface Behavior {
+ }
+
+ /**
* Makes a set of windows that cause insets appear on screen.
* <p>
* Note that if the window currently doesn't have control over a certain type, it will apply the
@@ -108,4 +180,20 @@
default void hideInputMethod() {
hide(ime());
}
+
+ /**
+ * Controls the appearance of system bars.
+ *
+ * @param appearance Bitmask of {@link Appearance} flags.
+ * @see Appearance
+ */
+ void setSystemBarsAppearance(@Appearance int appearance);
+
+ /**
+ * Controls the behavior of system bars.
+ *
+ * @param behavior Determines how the bars behave when being hidden by the application.
+ * @see Behavior
+ */
+ void setSystemBarsBehavior(@Behavior int behavior);
}
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 2e5a750..9cd356f 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -18,6 +18,8 @@
import static android.content.pm.ActivityInfo.COLOR_MODE_DEFAULT;
import static android.view.WindowLayoutParamsProto.ALPHA;
+import static android.view.WindowLayoutParamsProto.APPEARANCE;
+import static android.view.WindowLayoutParamsProto.BEHAVIOR;
import static android.view.WindowLayoutParamsProto.BUTTON_BRIGHTNESS;
import static android.view.WindowLayoutParamsProto.COLOR_MODE;
import static android.view.WindowLayoutParamsProto.FLAGS;
@@ -2612,6 +2614,14 @@
@ActivityInfo.ColorMode
private int mColorMode = COLOR_MODE_DEFAULT;
+ /**
+ * Carries the requests about {@link WindowInsetsController.Appearance} and
+ * {@link WindowInsetsController.Behavior} to the system windows which can produce insets.
+ *
+ * @hide
+ */
+ public final InsetsFlags insetsFlags = new InsetsFlags();
+
public LayoutParams() {
super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
type = TYPE_APPLICATION;
@@ -2774,6 +2784,8 @@
TextUtils.writeToParcel(accessibilityTitle, out, parcelableFlags);
out.writeInt(mColorMode);
out.writeLong(hideTimeoutMilliseconds);
+ out.writeInt(insetsFlags.appearance);
+ out.writeInt(insetsFlags.behavior);
}
public static final @android.annotation.NonNull Parcelable.Creator<LayoutParams> CREATOR
@@ -2830,6 +2842,8 @@
accessibilityTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mColorMode = in.readInt();
hideTimeoutMilliseconds = in.readLong();
+ insetsFlags.appearance = in.readInt();
+ insetsFlags.behavior = in.readInt();
}
@SuppressWarnings({"PointlessBitwiseExpression"})
@@ -2876,6 +2890,8 @@
/** {@hide} */
public static final int COLOR_MODE_CHANGED = 1 << 26;
/** {@hide} */
+ public static final int INSET_FLAGS_CHANGED = 1 << 27;
+ /** {@hide} */
public static final int EVERYTHING_CHANGED = 0xffffffff;
// internal buffer to backup/restore parameters under compatibility mode.
@@ -3065,6 +3081,16 @@
// This can't change, it's only set at window creation time.
hideTimeoutMilliseconds = o.hideTimeoutMilliseconds;
+ if (insetsFlags.appearance != o.insetsFlags.appearance) {
+ insetsFlags.appearance = o.insetsFlags.appearance;
+ changes |= INSET_FLAGS_CHANGED;
+ }
+
+ if (insetsFlags.behavior != o.insetsFlags.behavior) {
+ insetsFlags.behavior = o.insetsFlags.behavior;
+ changes |= INSET_FLAGS_CHANGED;
+ }
+
return changes;
}
@@ -3212,6 +3238,17 @@
sb.append(prefix).append(" vsysui=").append(ViewDebug.flagsToString(
View.class, "mSystemUiVisibility", subtreeSystemUiVisibility));
}
+ if (insetsFlags.appearance != 0) {
+ sb.append(System.lineSeparator());
+ sb.append(prefix).append(" apr=").append(ViewDebug.flagsToString(
+ InsetsFlags.class, "appearance", insetsFlags.appearance));
+ }
+ if (insetsFlags.behavior != 0) {
+ sb.append(System.lineSeparator());
+ sb.append(prefix).append(" bhv=").append(ViewDebug.flagsToString(
+ InsetsFlags.class, "behavior", insetsFlags.behavior));
+ }
+
sb.append('}');
return sb.toString();
}
@@ -3247,6 +3284,8 @@
proto.write(PRIVATE_FLAGS, privateFlags);
proto.write(SYSTEM_UI_VISIBILITY_FLAGS, systemUiVisibility);
proto.write(SUBTREE_SYSTEM_UI_VISIBILITY_FLAGS, subtreeSystemUiVisibility);
+ proto.write(APPEARANCE, insetsFlags.appearance);
+ proto.write(BEHAVIOR, insetsFlags.behavior);
proto.end(token);
}
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index fcf09a9..8f6c950 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -44,6 +44,7 @@
void noteAsyncOp(String callingPackageName, int uid, String packageName, int opCode,
String message);
boolean shouldCollectNotes(int opCode);
+ void setCameraAudioRestriction(int mode);
// End of methods also called by native code.
// Any new method exposed to native must be added after the last one, do not reorder
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index b499981..f87163b 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -1023,6 +1023,25 @@
}
}
+static int32_t android_hardware_Camera_setAudioRestriction(
+ JNIEnv *env, jobject thiz, jint mode)
+{
+ ALOGV("setAudioRestriction");
+ sp<Camera> camera = get_native_camera(env, thiz, NULL);
+ if (camera == 0) {
+ jniThrowRuntimeException(env, "camera has been disconnected");
+ return -1;
+ }
+
+ int32_t ret = camera->setAudioRestriction(mode);
+ if (ret < 0) {
+ jniThrowRuntimeException(env, "Illegal argument or low-level eror");
+ return -1;
+ }
+
+ return ret;
+}
+
//-------------------------------------------------
static const JNINativeMethod camMethods[] = {
@@ -1107,6 +1126,9 @@
{ "enableFocusMoveCallback",
"(I)V",
(void *)android_hardware_Camera_enableFocusMoveCallback},
+ { "setAudioRestriction",
+ "(I)I",
+ (void *)android_hardware_Camera_setAudioRestriction},
};
struct field {
diff --git a/core/proto/android/server/usagestatsservice.proto b/core/proto/android/server/usagestatsservice.proto
index f26eefa..75f265e 100644
--- a/core/proto/android/server/usagestatsservice.proto
+++ b/core/proto/android/server/usagestatsservice.proto
@@ -114,4 +114,6 @@
repeated UsageStats packages = 20;
repeated Configuration configurations = 21;
repeated Event event_log = 22;
+
+ repeated Event pending_events = 23; // TODO: move to usagestatsservice_v2.proto
}
diff --git a/core/proto/android/view/windowlayoutparams.proto b/core/proto/android/view/windowlayoutparams.proto
index 075ebcf..93a9fe2 100644
--- a/core/proto/android/view/windowlayoutparams.proto
+++ b/core/proto/android/view/windowlayoutparams.proto
@@ -68,4 +68,6 @@
optional uint32 private_flags = 26;
optional uint32 system_ui_visibility_flags = 27;
optional uint32 subtree_system_ui_visibility_flags = 28;
+ optional uint32 appearance = 29;
+ optional uint32 behavior = 30;
}
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index c9500a6..9ba0481 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerke te sien"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Koppel"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netwerke"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Laat voorgestelde Wi‑Fi-netwerke toe?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Netwerke wat deur <xliff:g id="NAME">%s</xliff:g> voorgestel is. Toestel sal dalk outomaties koppel."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Laat toe"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nee, dankie"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi sal outomaties aanskakel"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Wanneer jy naby \'n gestoorde hoëgehaltenetwerk is"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Moenie weer aanskakel nie"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 4761db2..013537c 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ሁሉንም አውታረ መረቦችን ለማየት መታ ያድርጉ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"አገናኝ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ሁሉም አውታረ መረቦች"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"የተጠቆሙ የWi‑Fi አውታረ መረቦች ይፈቀዱ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"በ<xliff:g id="NAME">%s</xliff:g> የተጠቆሙ አውታረ መረቦች። መሣሪያ በራስ-ሰር ሊገናኝ ይችላል።"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"ፍቀድ"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"አይ፣ አመሰግናለሁ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi በራስ-ሰር ይበራል"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ከፍተኛ ጥራት ያለው የተቀመጠ አውታረ መረብ አቅራቢያ ሲሆኑ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"መልሰህ አታብራ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index c97d2fa..2bef980 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1345,14 +1345,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"انقر للاطلاع على جميع الشبكات"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"اتصال"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"جميع الشبكات"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"هل تريد السماح لشبكات Wi‑Fi المقترحة؟"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> الشبكات المقترحة. قد يتم توصيل الجهاز تلقائيًا."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"سماح"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"لا، شكرًا"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"سيتم تشغيل شبكة Wi-Fi تلقائيًا."</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"عندما تكون بالقرب من شبكة محفوظة عالية الجودة"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"عدم إعادة التشغيل"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 2dc3fec..446575b 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সকলো নেটৱৰ্ক চাবলৈ টিপক"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযোগ কৰক"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"সকলো নেটৱৰ্ক"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"পৰামর্শ হিচাপে পোৱা নেটৱর্কবোৰক অনুমতি দিবনে?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g>এ পৰামর্শ হিচাপে দিয়া নেটৱর্কবোৰ। ডিভাইচটো স্বয়ংক্ৰিয়ভাৱে সংযোগ হ\'ব পাৰে।"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"অনুমতি দিয়ক"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"নালাগে, ধন্যবাদ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ৱাই-ফাই স্বয়ংক্ৰিয়ভাৱে অন হ\'ব"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"যেতিয়া আপুনি ছেভ কৰি থোৱা উচ্চ মানৰ নেটৱৰ্কৰ কাষত থাকে"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"পুনৰাই অন নকৰিব"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index af1ca69..6e93a97 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Bütün şəbəkələri görmək üçün klikləyin"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Qoşulun"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Bütün şəbəkələr"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Təklif edilən Wi‑Fi şəbəkələrinə icazə verilsin?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> təklif edilən şəbəkə. Cihaz avtomatik qoşula bilər."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"İcazə verin"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Xeyr, təşəkkürlər"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi avtomatik olaraq aktiv ediləcək"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Yadda saxlanmış yüksək keyfiyyətli şəbəkələr yaxınlıqda olduqda"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Yenidən aktiv etməyin"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 79717fc..e14139c 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -1279,14 +1279,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da biste videli sve mreže"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Želite da dozvolite predložene Wi‑Fi mreže?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Mreže koje predlaže <xliff:g id="NAME">%s</xliff:g>. Uređaj će se možda povezati automatski."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Dozvoli"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ne, hvala"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi će se automatski uključiti"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kada ste u blizini sačuvane mreže visokog kvaliteta"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne uključuj ponovo"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 7647619..a71eef0 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -992,7 +992,7 @@
</plurals>
<string name="last_month" msgid="3959346739979055432">"Апошні месяц"</string>
<string name="older" msgid="5211975022815554840">"Раней"</string>
- <string name="preposition_for_date" msgid="9093949757757445117">"дата: <xliff:g id="DATE">%s</xliff:g>"</string>
+ <string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>"</string>
<string name="preposition_for_time" msgid="5506831244263083793">"у <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="preposition_for_year" msgid="5040395640711867177">"у <xliff:g id="YEAR">%s</xliff:g>"</string>
<string name="day" msgid="8144195776058119424">"дзень"</string>
@@ -1301,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Дакраніцеся, каб убачыць усе сеткі"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Падключыцца"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Усе сеткі"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Дазволіць падключэнне да прапанаваных сетак Wi‑Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Праграма \"<xliff:g id="NAME">%s</xliff:g>\" прапанавала сеткі. Прылада можа падключыцца аўтаматычна."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Дазволіць"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Не, дзякуй"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi уключыцца аўтаматычна"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Побач з захаванай сеткай з высакаякасным сігналам"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не ўключаць зноў"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index c2d501c..7f5a3cc 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -434,10 +434,8 @@
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"এই অ্যাপ আপনার শারীরিক অ্যাক্টিভিটি শনাক্ত করতে পারবে।"</string>
<string name="permlab_camera" msgid="3616391919559751192">"ছবি এবং ভিডিও তোলে"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"এই অ্যাপটি যে কোনো সময় ক্যামেরা ব্যবহার করে ছবি তুলতে বা ভিডিও রেকর্ড করতে পারে৷"</string>
- <!-- no translation found for permlab_systemCamera (4074081285026193898) -->
- <skip />
- <!-- no translation found for permdesc_systemCamera (6488131672529669229) -->
- <skip />
+ <string name="permlab_systemCamera" msgid="4074081285026193898">"সিস্টেম ক্যামেরা ব্যবহার করে ফটো এবং ভিডিও নেওয়ার জন্য অ্যাপ্লিকেশন বা পরিষেবা অ্যাক্সেসের অনুমতি দিন"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"এই প্রিভিলিজ | সিস্টেম অ্যাপটি যেকোনও সময়ে সিস্টেম ক্যামেরা ব্যবহার করে ছবি তুলতে এবং ভিডিও রেকর্ড করতে পারবে। এর জন্য অ্যাপের Android.permission.CAMERA -এর অনুমতি প্রয়োজন"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"ভাইব্রেশন নিয়ন্ত্রণ করুন"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"অ্যাপ্লিকেশানকে কম্পক নিয়ন্ত্রণ করতে দেয়৷"</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"সরাসরি ফোন নম্বরগুলিতে কল করে"</string>
@@ -1259,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সমস্ত নেটওয়ার্ক দেখতে ট্যাপ করুন"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযুক্ত করুন"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"সব নেটওয়ার্ক"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"সাজেস্ট করা ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করার অনুমতি দিতে চান?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g>-এর সাজেস্ট করা নেটওয়ার্ক। ডিভাইস নিজে থেকে কানেক্ট হতে পারে।"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"অনুমতি দিন"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"না থাক"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ওয়াই-ফাই অটোমেটিক চালু হবে"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"যখন আপনি একটি উচ্চ মানের সংরক্ষিত নেটওয়ার্ক কাছাকাছি থাকেন"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"আবার চালু করবেন না"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index b28774b..bc84e93 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -1281,14 +1281,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da vidite sve mreže"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Povežite se"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Dozvoliti predložene WiFi mreže?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Mreže koje predlaže <xliff:g id="NAME">%s</xliff:g>. Uređaj će se možda povezati automatski."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Dozvoli"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ne, hvala"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WiFi će se uključiti automatski"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kada ste u blizini sačuvane mreže visokog kvaliteta"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Nemoj ponovo uključiti"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 6d83936..8334eca 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca per veure totes les xarxes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connecta"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Totes les xarxes"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Vols permetre les xarxes Wi‑Fi suggerides?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Xarxes suggerides de l\'aplicació <xliff:g id="NAME">%s</xliff:g>. El dispositiu pot connectar-se automàticament."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Permet"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"No, gràcies"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"La Wi-Fi s\'activarà automàticament"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quan siguis a prop d\'una xarxa de qualitat desada"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"No tornis a activar"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 0069804..0d05709 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1301,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všechny sítě"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Připojit"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Všechny sítě"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Povolit navrhované sítě Wi-Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Sítě navrhované aplikací <xliff:g id="NAME">%s</xliff:g>. Zařízení se může připojovat automaticky."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Povolit"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ne, díky"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi se zapne automaticky"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Když budete v dosahu kvalitní uložené sítě"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Znovu nezapínat"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index d12a794..70a4646 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tryk for at se alle netværk"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Opret forbindelse"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netværk"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Vil du tillade foreslåede Wi‑Fi-netværk?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Netværk foreslået af <xliff:g id="NAME">%s</xliff:g>. Enheden opretter muligvis forbindelse automatisk."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Tillad"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nej tak"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi aktiveres automatisk"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Når du er i nærheden af et gemt netværk af høj kvalitet"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Aktivér ikke igen"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index f7b66a1..c7e381c 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -434,8 +434,8 @@
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"Diese App kann deine körperliche Aktivität erkennen."</string>
<string name="permlab_camera" msgid="3616391919559751192">"Bilder und Videos aufnehmen"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"Diese App kann mit der Kamera jederzeit Bilder und Videos aufnehmen."</string>
- <string name="permlab_systemCamera" msgid="4074081285026193898">"Einer App oder einem Dienst Zugriff auf Systemkameras erlauben, um Fotos und Videos aufzunehmen"</string>
- <string name="permdesc_systemCamera" msgid="6488131672529669229">"Diese privilegierte System-App kann jederzeit mit einer System-Kamera Bilder und Videos aufnehmen. Sie benötigt auch die Berechtigung \"android.permission.CAMERA\"."</string>
+ <string name="permlab_systemCamera" msgid="4074081285026193898">"Einer App oder einem Dienst Zugriff auf Systemkameras erlauben, um Fotos und Videos aufnehmen zu können"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"Diese privilegierte App | System-App kann jederzeit mit einer Systemkamera Bilder und Videos aufnehmen. Die App benötigt auch die Berechtigung \"android.permission.CAMERA\"."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"Vibrationsalarm steuern"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"Ermöglicht der App, den Vibrationsalarm zu steuern"</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"Telefonnummern direkt anrufen"</string>
@@ -999,7 +999,7 @@
<string name="weeks" msgid="6509623834583944518">"Wochen"</string>
<string name="year" msgid="4001118221013892076">"Jahr"</string>
<string name="years" msgid="6881577717993213522">"Jahre"</string>
- <string name="now_string_shortest" msgid="8912796667087856402">"jetzt"</string>
+ <string name="now_string_shortest" msgid="8912796667087856402">"Jetzt"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tippen, um alle Netzwerke zu sehen"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinden"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle Netzwerke"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Vorgeschlagene WLANs zulassen?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Von <xliff:g id="NAME">%s</xliff:g> vorgeschlagene Netzwerke. Gerät verbindet sich möglicherweise automatisch."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Zulassen"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nein danke"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WLAN wird automatisch aktiviert"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Wenn du in der Nähe eines sicheren gespeicherten Netzwerks bist"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Nicht wieder aktivieren"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 30824c8..18af40d6 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Πατήστε για να δείτε όλα τα δίκτυα"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Σύνδεση"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Όλα τα δίκτυα"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Να επιτρέπονται προτεινόμενα δίκτυα Wi‑Fi;"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Προτεινόμενα δίκτυα <xliff:g id="NAME">%s</xliff:g>. Η συσκευή μπορεί να συνδεθεί αυτόματα."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Αποδοχή"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Όχι, ευχαριστώ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Το Wi‑Fi θα ενεργοποιηθεί αυτόματα"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Όταν βρίσκεστε κοντά σε αποθηκευμένο δίκτυο υψηλής ποιότητας"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Να μην ενεργοποιηθεί ξανά"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index ac6a6ce..1346b86 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Presiona para ver todas las redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas las redes"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"¿Quieres permitir las redes Wi‑Fi sugeridas?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> sugirió redes. Es posible que el dispositivo se conecte automáticamente."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Permitir"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"No, gracias"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Se activará la conexión Wi-Fi automáticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Cuando estés cerca de una red guardada de alta calidad"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"No volver a activar"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 059b0a20..d9864fb 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas las redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas las redes"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"¿Permitir sugerencias de redes Wi‑Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> te ha sugerido alguna red. El dispositivo puede que se conecte automáticamente."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Permitir"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"No, gracias"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"La conexión Wi‑Fi se activará automáticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Cuando estés cerca de una red de alta calidad guardada"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"No volver a activar"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index f7601fd..afa8453 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Puudutage kõikide võrkude nägemiseks"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Ühenda"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Kõik võrgud"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Kas lubada soovitatud WiFi-võrgud?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Rakenduse <xliff:g id="NAME">%s</xliff:g> soovitatud võrgud. Seade võib automaatselt ühenduse luua."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Luba"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Tänan, ei"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WiFi lülitub sisse automaatselt"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kui olete kvaliteetse salvestatud võrgu läheduses"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ära lülita tagasi sisse"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 2cfda07..9932fdf 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Sakatu hau sare guztiak ikusteko"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Konektatu"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sare guztiak"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Iradokitako wifi-sareak baimendu nahi dituzu?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> aplikazioak sare batzuk iradoki ditu. Baliteke gailua automatikoki konektatzea."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Baimendu"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ez. Eskerrik asko."</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi konexioa automatikoki aktibatuko da"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Gordeta daukazun kalitate handiko sare batetik gertu zaudenean"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ez aktibatu berriro"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index c620ab2..cf7f37c 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"برای دیدن همه شبکهها ضربه بزنید"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"اتصال"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"همه شبکهها"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"شبکههای Wi‑Fi پیشنهادی مجاز شود؟"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"شبکههای پیشنهادی <xliff:g id="NAME">%s</xliff:g>. ممکن است دستگاه بهطور خودکار متصل شود."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"مجاز"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"نه متشکرم"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi بهطور خودکار روشن خواهد شد"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"وقتی نزدیک شبکه ذخیرهشده با کیفیت بالا هستید"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"دوباره روشن نشود"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 5b934ea3..d39bdc7 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Napauta, niin näet kaikki verkot."</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Yhdistä"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Kaikki verkot"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Sallitaanko ehdotetut Wi-Fi-verkot?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> ehdotti verkkoja. Laite voi muodostaa yhteyden automaattisesti."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Salli"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ei kiitos"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi käynnistyy automaattisesti"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kun olet lähellä laadukasta tallennettua verkkoa"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Älä käynnistä uudelleen"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index b4dfde6..4eae9ba 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Touchez pour afficher tous les réseaux"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connexion"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tous les réseaux"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Autoriser les suggestions de réseaux Wi‑Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Réseaux suggérés par <xliff:g id="NAME">%s</xliff:g>. L\'appareil peut s\'y connecter automatiquement."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Autoriser"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Non merci"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Le Wi-Fi s\'activera automatiquement"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Lorsque vous êtes près d\'un réseau enregistré de haute qualité"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne pas réactiver"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 33d13dc..1fd552e 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Appuyer pour afficher tous les réseaux"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Se connecter"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tous les réseaux"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Autoriser les suggestions de réseaux Wi‑Fi ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Réseaux suggérés par <xliff:g id="NAME">%s</xliff:g>. L\'appareil pourra se connecter automatiquement."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Autoriser"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Non, merci"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Le Wi-Fi sera activé automatiquement"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Lorsque vous êtes à proximité d\'un réseau enregistré de haute qualité"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne pas réactiver"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index f977c45..919a13d 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Queres permitir as redes wifi suxeridas?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Redes suxeridas de <xliff:g id="NAME">%s</xliff:g>. O dispositivo pode conectarse automaticamente."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Permitir"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Non, grazas"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"A wifi activarase automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Cando esteas preto dunha rede gardada de alta calidade"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Non volver activar"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 83e94a1..ecf717a 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -434,10 +434,8 @@
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"આ ઍપ તમારી શારીરિક પ્રવૃત્તિને ઓળખી શકે છે."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ચિત્રો અને વિડિઓઝ લો"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"આ ઍપ્લિકેશન, કૅમેરાનો ઉપયોગ કરીને કોઈપણ સમયે ચિત્રો લઈ અને વિડિઓઝ રેકોર્ડ કરી શકે છે."</string>
- <!-- no translation found for permlab_systemCamera (4074081285026193898) -->
- <skip />
- <!-- no translation found for permdesc_systemCamera (6488131672529669229) -->
- <skip />
+ <string name="permlab_systemCamera" msgid="4074081285026193898">"ઍપ્લિકેશન અથવા સેવા ઍક્સેસને સિસ્ટમ કૅમેરાનો ઉપયોગ કરીને ફોટા અને વીડિયો લેવાની મંજૂરી આપો"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"આ વિશેષાધિકૃત | સિસ્ટમ ઍપ કોઈપણ સમયે સિસ્ટમ કૅમેરાનો ઉપયોગ કરીને ફોટા લઈ અને વીડિયો રેકોર્ડ કરી શકે છે. ઍપ દ્વારા આયોજિત કરવા માટે android.permission.CAMERAની પરવાનગી પણ જરૂરી છે"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"વાઇબ્રેશન નિયંત્રિત કરો"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"એપ્લિકેશનને વાઇબ્રેટરને નિયંત્રિત કરવાની મંજૂરી આપે છે."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"સીધા જ ફોન નંબર્સ પર કૉલ કરો"</string>
@@ -1259,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"બધા નેટવર્ક જોવા ટૅપ કરો"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"કનેક્ટ કરો"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"બધા નેટવર્કો"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"સૂચવેલા વાઇ-ફાઇ નેટવર્કને મંજૂરી આપીએ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> સૂચવેલા નેટવર્ક. ડિવાઇસ ઑટોમૅટિક રીતે કનેક્ટ થાય તેમ બની શકે છે."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"મંજૂરી આપો"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"ના, આભાર"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"વાઇ-ફાઇ આપમેળે ચાલુ થઈ જશે"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"જ્યારે તમે એક ઉચ્ચ ક્વૉલિટીવાળા સાચવેલ નેટવર્કની નજીક હોવ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"પાછું ચાલુ કરશો નહીં"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 32bcd4c..53e9217 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सभी नेटवर्क देखने के लिए यहां पर टैप करें"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करें"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सभी नेटवर्क"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"सुझाए गए वाई-फ़ाई नेटवर्क को अनुमति देना चाहते हैं?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> के सुझाए गए नेटवर्क. डिवाइस अपने आप कनेक्ट हो सकता है."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"अनुमति दें"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"रहने दें"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"वाई-फ़ाई अपने आप चालू हो जाएगा"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"जब आप किसी अच्छी क्वालिटी वाले सेव किए गए नेटवर्क के पास हों"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"वापस चालू न करें"</string>
@@ -1351,7 +1347,7 @@
<string name="dlg_ok" msgid="7376953167039865701">"ठीक है"</string>
<string name="usb_charging_notification_title" msgid="1595122345358177163">"यह डिवाइस यूएसबी से चार्ज हो रहा है"</string>
<string name="usb_supplying_notification_title" msgid="4631045789893086181">"जोड़ा गया डिवाइस यूएसबी के ज़रिए चार्ज हो रहा है"</string>
- <string name="usb_mtp_notification_title" msgid="4238227258391151029">"यूएसबी फ़ाइल ट्रांसफ़र की सुविधा चालू की गई"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"यूएसबी फ़ाइल ट्रांसफ़र करने की सुविधा चालू की गई"</string>
<string name="usb_ptp_notification_title" msgid="5425857879922006878">"यूएसबी के ज़रिए पीटीपी की सुविधा चालू की गई"</string>
<string name="usb_tether_notification_title" msgid="3716143122035802501">"यूएसबी टेदरिंग की सुविधा चालू की गई"</string>
<string name="usb_midi_notification_title" msgid="5356040379749154805">"यूएसबी के ज़रिए एमआईडीआई (मिडी) की सुविधा चालू की गई"</string>
@@ -1360,7 +1356,7 @@
<string name="usb_power_notification_message" msgid="4647527153291917218">"जोड़ा गया डिवाइस चार्ज हो रहा है. ज़्यादा विकल्पों के लिए टैप करें."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"एनालॉग ऑडियो एक्सेसरी का पता चला"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"अटैच किया गया डिवाइस इस फ़ोन से संगत नहीं है. ज़्यादा जानने के लिए टैप करें."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"डीबग करने के लिए एडीबी कनेक्ट किया गया"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"यूएसबी डीबग करने के लिए एडीबी कनेक्ट किया गया"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"यूएसबी को डीबग करने की सुविधा बंद करने के लिए टैप करें"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB डीबग करना अक्षम करने के लिए चुनें."</string>
<string name="test_harness_mode_notification_title" msgid="2216359742631914387">"टेस्ट हार्नेस मोड चालू किया गया"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 13d8433..4908780 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1279,14 +1279,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite za prikaz svih mreža"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Sve mreže"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Želite li dopustiti predložene Wi‑Fi mreže?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Mreže koje predlaže aplikacija <xliff:g id="NAME">%s</xliff:g>. Uređaji se mogu povezati automatski."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Dopusti"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ne, hvala"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi će se uključiti automatski"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kada ste u blizini spremljene mreže visoke kvalitete"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Više ne uključuj"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index a08a180..e32457a 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Koppintással megjelenítheti az összes hálózatot"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Kapcsolódás"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Összes hálózat"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Engedélyezi a javasolt Wi-Fi-hálózatokat?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"A(z) <xliff:g id="NAME">%s</xliff:g> hálózatokat javasolt. Az eszköz automatikusan csatlakozhat hozzájuk."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Engedélyezés"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nem, köszönöm"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"A Wi-Fi automatikusan bekapcsol"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Amikor jó minőségű mentett hálózat közelében tartózkodik"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne kapcsolódjon vissza"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 6b02ea1..5af2235 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Հպեք՝ բոլոր ցանցերը տեսնելու համար"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Միանալ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Բոլոր ցանցերը"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Թույլատրե՞լ առաջարկվող Wi‑Fi ցանցերի օգտագործումը"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> հավելվածի առաջարկվող ցանցեր: Սարքը կարող է ավտոմատ միանալ:"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Թույլատրել"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ոչ, շնորհակալություն"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi-ն ավտոմատ կմիանա"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Լավ ազդանշանով պահված ցանցի տարածքում գտնվելիս"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Նորից չմիացնել"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index beda1c2..0ebabaf 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ketuk untuk melihat semua jaringan"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Hubungkan"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua jaringan"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Izinkan jaringan Wi-Fi yang disarankan?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> jaringan yang disarankan. Perangkat dapat terhubung secara otomatis."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Izinkan"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Lain kali"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi akan aktif otomatis"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Saat berada di dekat jaringan berkualitas tinggi yang tersimpan"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Jangan aktifkan kembali"</string>
@@ -1983,7 +1979,7 @@
<string name="popup_window_default_title" msgid="4874318849712115433">"Jendela Pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
<string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versi aplikasi di-downgrade, atau tidak kompatibel dengan pintasan ini"</string>
- <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Tidak dapat memulihkan pintasan karena aplikasi tidak mendukung backup dan pulihkan"</string>
+ <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Tidak dapat memulihkan pintasan karena aplikasi tidak mendukung pencadangan dan pemulihan"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Tidak dapat memulihkan pintasan karena tanda tangan aplikasi tidak cocok"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Tidak dapat memulihkan pintasan."</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Pintasan dinonaktifkan"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index f4be925..296e4414 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ýttu til að sjá öll netkerfi"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Tengjast"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Öll netkerfi"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Leyfa ráðlögð Wi‑Fi net?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> kom með tillögur að netkerfum. Tækið gæti tengst sjálfkrafa."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Leyfa"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nei, takk"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Kveikt verður sjálfkrafa á Wi‑Fi"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Þegar þú ert nálægt vistuðu hágæðaneti"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ekki kveikja aftur"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 1c3d684..501ef1a 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tocca per vedere tutte le reti"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Connetti"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tutte le reti"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Vuoi consentire le reti Wi-Fi suggerite?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> ha suggerito delle reti. Il dispositivo potrebbe collegarsi automaticamente."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Consenti"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"No, grazie"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Il Wi‑Fi verrà attivato automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quando ti trovi nell\'area di una rete salvata di alta qualità"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Non riattivare"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 8ca1d23..a2031f8 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -440,10 +440,8 @@
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"האפליקציה מזהה את הפעילות הגופנית שלך."</string>
<string name="permlab_camera" msgid="3616391919559751192">"צלם תמונות וסרטונים"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"אפליקציה זו יכולה להשתמש במצלמה כדי לצלם תמונות ולהקליט סרטונים בכל עת."</string>
- <!-- no translation found for permlab_systemCamera (4074081285026193898) -->
- <skip />
- <!-- no translation found for permdesc_systemCamera (6488131672529669229) -->
- <skip />
+ <string name="permlab_systemCamera" msgid="4074081285026193898">"הרשאת גישה לאפליקציה או לשירות למצלמות המערכת כדי לצלם תמונות וסרטונים"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"לאפליקציית המערכת | הזו יש הרשאות מיוחדות והיא יכולה לצלם תמונות ולהקליט סרטונים באמצעות מצלמת מערכת בכל זמן. בנוסף, לאפליקציה נדרשת ההרשאה android.permission.CAMERA"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"שליטה ברטט"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"מאפשר לאפליקציה לשלוט ברטט."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"התקשר ישירות למספרי טלפון"</string>
@@ -1303,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"יש להקיש כדי לראות את כל הרשתות"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"התחבר"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"כל הרשתות"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"לאפשר הצעות לרשתות Wi-Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"הצעות לרשתות <xliff:g id="NAME">%s</xliff:g>. ייתכן שחיבור המכשיר ייעשה באופן אוטומטי."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"אישור"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"לא תודה"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ה-Wi-Fi יופעל אוטומטית"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"כשתימצאו בקרבת רשת באיכות גבוהה ששמרתם"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"אל תפעיל שוב"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 861518c..a54d0ec 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"すべてのネットワークを表示するにはタップします"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"接続"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"すべてのネットワーク"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Wi‑Fi ネットワーク候補を許可しますか?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> からのネットワーク候補にデバイスが自動的に接続される可能性があります。"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"許可"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"許可しない"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi は自動的にオンになります"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"高品質の保存済みネットワークの検出時"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"再度オンにしない"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 1dba3ca..0376336 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"შეეხეთ ყველა ქსელის სანახავად"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"დაკავშირება"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ყველა ქსელი"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"გსურთ, დაუშვათ შემოთავაზებული Wi‑Fi ქსელები?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> შემოთავაზებული ქსელები. მოწყობილობა შეიძლება ავტომატურად დაუკავშირდეს."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"დაშვება"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"არა, გმადლობთ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi ავტომატურად ჩაირთვება"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"როცა შენახულ მაღალხარისხიან ქსელებთან ახლოს იმყოფებით"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ხელახლა ნუ ჩართავ"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 504ce74..68d63c7 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Барлық желілерді көру үшін түртіңіз"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Қосылу"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Барлық желілер"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Ұсынылған Wi‑Fi желілеріне рұқсат беру керек пе?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> ұсынған желілер. Құрылғы автоматты түрде қосылуы мүмкін."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Рұқсат беру"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Жоқ, рақмет"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматты түрде қосылады"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Сақталған жоғары сапалы желіге жақын болғанда"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Қайта қоспау"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 33aa8b2..00dc422 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -1259,14 +1259,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ចុចដើម្បីមើលបណ្តាញទាំងអស់"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ភ្ជាប់"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"បណ្ដាញទាំងអស់"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"អនុញ្ញាតឱ្យភ្ជាប់បណ្ដាញ Wi‑Fi ដែលបានណែនាំ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"បណ្ដាញដែលបានណែនាំរបស់ <xliff:g id="NAME">%s</xliff:g> ។ ឧបករណ៍អាចភ្ជាប់ដោយស្វ័យប្រវត្តិ។"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"អនុញ្ញាត"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"ទេ អរគុណ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi នឹងបើកដោយស្វ័យប្រវត្តិ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"នៅពេលដែលអ្នកនៅជិតបណ្តាញគុណភាពខ្ពស់ដែលបានរក្សាទុក"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"កុំបើកឡើងវិញ"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 654dd6b..0902271 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ಎಲ್ಲಾ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ಸಂಪರ್ಕಿಸಿ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ಎಲ್ಲಾ ನೆಟ್ವರ್ಕ್ಗಳು"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"ಸೂಚಿಸಿರುವ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಅನುಮತಿಸುವುದೇ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> ಸೂಚಿಸಿರುವ ನೆಟ್ವರ್ಕ್ಗಳು. ಸಾಧನಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಗೊಳ್ಳಬಹುದು."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"ಅನುಮತಿಸಿ"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"ಬೇಡ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ವೈ‑ಫೈ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್ ಆಗುತ್ತದೆ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ನೀವು ಉಳಿಸಿದ ಅಧಿಕ ಗುಣಮಟ್ಟದ ನೆಟ್ವರ್ಕ್ ಸಮೀಪದಲ್ಲಿದ್ದಾಗ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ಮತ್ತೆ ಆನ್ ಮಾಡಲು ಹಿಂತಿರುಗಬೇಡಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index bc6193f..669bb96 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"모든 네트워크를 보려면 탭하세요."</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"연결"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"모든 네트워크"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"제안된 Wi‑Fi 네트워크를 허용하시겠습니까?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g>에서 네트워크를 제안했습니다. 기기가 자동으로 연결될 수 있습니다."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"허용"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"허용 안함"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi가 자동으로 사용 설정됨"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"저장된 고품질 네트워크가 가까이 있는 경우"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"다시 사용 설정하지 않음"</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 75eb9ac..e448a30 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бардык тармактарды көрүү үчүн басыңыз"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Туташуу"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Бардык тармактар"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Сунушталган Wi‑Fi тармактарына туташтырылсынбы?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> сунуштаган тармактар. Түзмөк автоматтык түрдө туташышы мүмкүн."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Уруксат берүү"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Жок, рахмат"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматтык түрдө күйөт"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Байланыш сигналы күчтүү тармактарга жакындаганда"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Өзү кайра күйбөйт"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index f20b90a..56e0a70 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ແຕະເພື່ອເບິ່ງເຄືອຂ່າຍທັງໝົດ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ເຊື່ອມຕໍ່"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ເຄືອຂ່າຍທັງໝົດ"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"ອະນຸຍາດເຄືອຂ່າຍ Wi‑Fi ທີ່ແນະນຳບໍ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"ເຄືອຂ່າຍ <xliff:g id="NAME">%s</xliff:g> ທີ່ແນະນຳ. ອຸປະກອນອາດເຊື່ອມຕໍ່ເອງໂດຍອັດຕະໂນມັດ."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"ອະນຸຍາດ"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"ບໍ່, ຂອບໃຈ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ຈະມີການເປີດໃຊ້ Wi‑Fi ອັດຕະໂນມັດ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ເມື່ອທ່ານຢູ່ໃກ້ເຄືອຂ່າຍຄຸນນະພາບສູງທີ່ບັນທຶກໄວ້"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ບໍ່ຕ້ອງເປີດໃຊ້ຄືນໃໝ່"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 1256e3e..e674c2a 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1301,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Palieskite, jei norite matyti visus tinklus"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Prisijungti"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Visi tinklai"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Leisti siūlomus „Wi‑Fi“ tinklus?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"„<xliff:g id="NAME">%s</xliff:g>“ siūlomi tinklai. Įrenginys gali prisijungti automatiškai."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Leisti"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ne, ačiū"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"„Wi‑Fi“ bus įjungtas automatiškai"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kai būsite netoli išsaugoto aukštos kokybės tinklo"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Neįjunkite vėl"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 5ff3aaf..96cb3cd 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1279,14 +1279,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Pieskarieties, lai skatītu visus tīklus"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Izveidot savienojumu"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Visi tīkli"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Vai atļaut ieteiktos Wi‑Fi tīklus?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Lietotnes <xliff:g id="NAME">%s</xliff:g> ieteiktie tīkli. Ierīcē var tikt automātiski izveidots savienojums."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Atļaut"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nē, paldies"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi tiks automātiski ieslēgts"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kad atrodaties saglabāta augstas kvalitātes tīkla tuvumā"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Neieslēgt atkārtoti"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index ef027a9..39ad811 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Допрете за да ги видите сите мрежи"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Поврзете се"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Сите мрежи"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Да се дозволат предложените Wi‑Fi мрежи?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Предложени мрежи од <xliff:g id="NAME">%s</xliff:g>. Уредот може да се поврзе автоматски."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Дозволи"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Не, фала"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ќе се вклучи автоматски"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Кога сте во близина на зачувана мрежа со висок квалитет"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не вклучувај повторно"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index f77c223..8588031 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -434,10 +434,8 @@
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"നിങ്ങളുടെ ശാരീരിക പ്രവർത്തനം ഈ ആപ്പിന് തിരിച്ചറിയാനാവും."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ചിത്രങ്ങളും വീഡിയോകളും എടുക്കുക"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"ഏതുസമയത്തും ക്യാമറ ഉപയോഗിച്ചുകൊണ്ട് ചിത്രങ്ങൾ എടുക്കാനും വീഡിയോകൾ റെക്കോർഡുചെയ്യാനും ഈ ആപ്പിന് കഴിയും."</string>
- <!-- no translation found for permlab_systemCamera (4074081285026193898) -->
- <skip />
- <!-- no translation found for permdesc_systemCamera (6488131672529669229) -->
- <skip />
+ <string name="permlab_systemCamera" msgid="4074081285026193898">"ചിത്രങ്ങളും വീഡിയോകളും എടുക്കാൻ, സിസ്റ്റം ക്യാമറ ആക്സസ് ചെയ്യുന്നതിന് ആപ്പിനെയോ സേവനത്തെയോ അനുവദിക്കുക"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"സിസ്റ്റം ക്യാമറ ഉപയോഗിച്ച് ഏത് സമയത്തും ചിത്രങ്ങളെടുക്കാനും വീഡിയോകൾ റെക്കോർഡ് ചെയ്യാനും ഈ വിശേഷാധികാര | സിസ്റ്റം ആപ്പിന് കഴിയും. ആപ്പിലും android.permission.CAMERA അനുമതി ഉണ്ടായിരിക്കണം"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"വൈബ്രേറ്റുചെയ്യൽ നിയന്ത്രിക്കുക"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"വൈബ്രേറ്റർ നിയന്ത്രിക്കുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"ഫോൺ നമ്പറുകളിലേക്ക് നേരിട്ട് വിളിക്കുക"</string>
@@ -1259,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"എല്ലാ നെറ്റ്വർക്കുകളും കാണാൻ ടാപ്പുചെയ്യുക"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"കണക്റ്റുചെയ്യുക"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"എല്ലാ നെറ്റ്വർക്കുകളും"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"നിർദ്ദേശിച്ച വെെഫെെ നെറ്റ്വർക്കുകൾ അനുവദിക്കണോ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> നിർദ്ദേശിച്ച നെറ്റ്വർക്കുകൾ. ഉപകരണം സ്വയമേവ കണക്റ്റ് ചെയ്തേക്കാം."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"അനുവദിക്കുക"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"വേണ്ട"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"വൈഫൈ സ്വമേധയാ ഓണാകും"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"നിങ്ങൾ ഉയർന്ന നിലവാരമുള്ള സംരക്ഷിക്കപ്പെട്ട നെറ്റ്വർക്കിനരികിലെത്തുമ്പോൾ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"തിരികെ ഓണാക്കരുത്"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index c530d3e..3672802 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бүх сүлжээг харахын тулд товшино уу"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Холбогдох"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Бүх сүлжээ"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Санал болгосон Wi‑Fi сүлжээг зөвшөөрөх үү?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> сүлжээ санал болголоо. Төхөөрөмж автоматаар холбогдож магадгүй."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Зөвшөөрөх"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Үгүй, баярлалаа"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi автоматаар асна"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Таныг хадгалсан, өндөр чанартай сүлжээний ойролцоо байх үед"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Буцааж асаахгүй"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index 929fedd..c58ae61 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -434,10 +434,8 @@
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"हे अॅप तुमच्या शारीरिक अॅक्टिव्हिटी ओळखू शकते."</string>
<string name="permlab_camera" msgid="3616391919559751192">"चित्रे आणि व्हिडिओ घ्या"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"हा अॅप कोणत्याही वेळी कॅमेरा वापरून चित्रेे घेऊ आणि व्हिडिअो रेकॉर्ड करू शकतो."</string>
- <!-- no translation found for permlab_systemCamera (4074081285026193898) -->
- <skip />
- <!-- no translation found for permdesc_systemCamera (6488131672529669229) -->
- <skip />
+ <string name="permlab_systemCamera" msgid="4074081285026193898">"फोटो आणि व्हिडिओ काढण्यासाठी अॅप्लिकेशन किंवा सेवेला सिस्टम कॅमेरे अॅक्सेस करण्याची अनुमती द्या"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"हे विशेषाधिकृत आहे | सिस्टम अॅप कधीही सिस्टम कॅमेरा वापरून फोटो आणि व्हिडिओ रेकॉर्ड करू शकते. अॅपला android.permission.CAMERA परवानगी देण्याचीदेखील आवश्यकता आहे"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"व्हायब्रेट नियंत्रित करा"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"अॅप ला व्हायब्रेटर नियंत्रित करण्यासाठी अनुमती देते."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"फोन नंबरवर प्रत्यक्ष कॉल करा"</string>
@@ -1259,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सर्व नेटवर्क पाहण्यासाठी टॅप करा"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करा"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सर्व नेटवर्क"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"सुचवलेल्या वाय-फाय नेटवर्कना अनुमती द्यायची का?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> सुचवलेली नेटवर्क. डिव्हाइस आपोआप कनेक्ट होऊ शकते."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"अनुमती द्या"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"नाही, नको"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"वाय-फाय आपोआप चालू होईल"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"तुम्ही जेव्हा सेव्ह केलेल्या उच्च दर्जाच्या नेटवर्कजवळ असाल तेव्हा"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"पुन्हा चालू करू नका"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index ed5e1fb..1fd1d71 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ketik untuk melihat semua rangkaian"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Sambung"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Semua rangkaian"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Benarkan rangkaian Wi-Fi yang dicadangkan?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> rangkaian yang dicadangkan. Peranti mungkin disambungkan secara automatik."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Benarkan"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Tidak perlu"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi akan dihidupkan secara automatik"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Apabila anda berada berdekatan dengan rangkaian disimpan yang berkualiti tinggi"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Jangan hidupkan kembali"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 09dc818..4e91ca2 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ကွန်ရက်အားလုံးကို ကြည့်ရန် တို့ပါ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ချိတ်ဆက်ရန်"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ကွန်ရက်အားလုံး"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"အကြံပြုထားသည့် Wi‑Fi ကွန်ရက်များကို ခွင့်ပြုလိုပါသလား။"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> သည် ကွန်ရက်များကို အကြံပြုထားသည်။ စက်သည် အလိုအလျောက် ချိတ်ဆက်နိုင်သည်။"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"ခွင့်ပြုရန်"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"မလိုပါ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ကို အလိုအလျောက် ပြန်ဖွင့်ပေးလိမ့်ပါမည်"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"သိမ်းဆည်းထားသည့် အရည်အသွေးမြင့်ကွန်ရက်များအနီးသို့ ရောက်ရှိသည့်အခါ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ပြန်မဖွင့်ပါနှင့်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 0ad63bf..6972a64 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trykk for å se alle nettverkene"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Koble til"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle nettverk"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Vil du tillate foreslåtte Wi-Fi nettverk?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g>-foreslåtte nettverk. Enheten kan koble til automatisk."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Tillat"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nei takk"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi slås på automatisk"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Når du er i nærheten av et lagret nettverk av høy kvalitet"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ikke slå på igjen"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index d0f6ae43..ef312a9 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -434,10 +434,8 @@
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"यो अनुप्रयोगले तपाईंको शारीरिक गतिविधिको पहिचान गर्न सक्छ।"</string>
<string name="permlab_camera" msgid="3616391919559751192">"तस्बिरहरू र भिडियोहरू लिनुहोस्।"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"यस अनुप्रयोगले जुनसुकै समय क्यामेराको प्रयोग गरी तस्बिर खिच्न र भिडियो रेकर्ड गर्न सक्छ।"</string>
- <!-- no translation found for permlab_systemCamera (4074081285026193898) -->
- <skip />
- <!-- no translation found for permdesc_systemCamera (6488131672529669229) -->
- <skip />
+ <string name="permlab_systemCamera" msgid="4074081285026193898">"अनुप्रयोग वा सेवालाई तस्बिर र भिडियो खिच्न प्रणालीका क्यामेराहरूमाथि पहुँच राख्न दिनुहोस्"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"यस विशेषाधिकार प्राप्त अनुप्रयोगले जुनसुकै समय प्रणालीको क्यामेरा प्रयोग गरी तस्बिर खिच्न र भिडियो रेकर्ड गर्न सक्छ। अनुप्रयोगसँग पनि android.permission.CAMERA सम्बन्धी अनुमति हुनु पर्छ"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"कम्पन नियन्त्रण गर्नुहोस्"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"अनुप्रयोगलाई भाइब्रेटर नियन्त्रण गर्न अनुमति दिन्छ।"</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"फोन नम्बरहरूमा सिधै कल गर्नुहोस्"</string>
@@ -1265,14 +1263,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सबै नेटवर्कहरू हेर्न ट्याप गर्नुहोस्"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"जडान गर्नुहोस्"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"सबै नेटवर्कहरू"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"सिफारिस गरिएका Wi‑Fi नेटवर्कहरूलाई अनुमति दिनुहोस्?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> ले सिफारिस गरेका नेटवर्कहरू। यन्त्र स्वतः जडान हुन सक्छ।"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"अनुमति दिनुहोस्"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"पर्दैन, धन्यवाद"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi स्वतः सक्रिय हुनेछ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"तपाईं कुनै सुरक्षित गरिएको उच्च गुणस्तरीय नेटवर्कको नजिक हुनुभएको अवस्थामा"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"फेरि सक्रिय नगर्नुहोला"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 1abad6d..1a9797b 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerken te bekijken"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinding maken"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alle netwerken"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Voorgestelde wifi-netwerken toestaan?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> heeft netwerken voorgesteld. Apparaat kan automatisch verbinding maken."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Toestaan"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nee, bedankt"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wifi wordt automatisch ingeschakeld"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Wanneer je in de buurt van een opgeslagen netwerk van hoge kwaliteit bent"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Niet weer inschakelen"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index 425f0ac..1da68a3 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ସମସ୍ତ ନେଟ୍ୱର୍କ ଦେଖିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"କନେକ୍ଟ କରନ୍ତୁ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ସମସ୍ତ ନେଟ୍ୱର୍କ"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"ପ୍ରସ୍ତାବିତ ୱାଇ-ଫାଇ ନେଟ୍ୱାର୍କଗୁଡ଼ିକୁ ଅନୁମତି ଦେବେ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> ପ୍ରସ୍ତାବିତ ନେଟ୍ୱାର୍କଗୁଡ଼ିକ। ଡିଭାଇସ୍ ହୁଏତ ସ୍ୱଚାଳିତ ଭାବେ ସଂଯୋଗ ହୋଇପାରେ।"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"ନାହିଁ, ଥାଉ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ୱାଇ-ଫାଇ ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ ହେବ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ଆପଣ ଏକ ଉଚ୍ଚ-କ୍ୱାଲିଟୀ ବିଶିଷ୍ଟ ସେଭ୍ କରାଯାଇଥିବା ନେଟ୍ୱର୍କ ପାଖରେ ଥିବା ସମୟରେ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ପୁଣି ଅନ୍ କରନ୍ତୁ ନାହିଁ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index c3b2ca8..d39ea13 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ਸਾਰੇ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"ਕਨੈਕਟ ਕਰੋ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"ਸਾਰੇ ਨੈੱਟਵਰਕ"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"ਕੀ ਸੁਝਾਏ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਵਰਤਣੇ ਹਨ?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> ਦੇ ਸੁਝਾਏ ਨੈੱਟਵਰਕ। ਸ਼ਾਇਦ ਡੀਵਾਈਸ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਹੋਵੇ।"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"ਵਰਤਣ ਦਿਓ"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"ਨਹੀਂ ਧੰਨਵਾਦ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"ਵਾਈ‑ਫਾਈ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚੱਲ ਪਵੇਗਾ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ ਰੱਖਿਅਤ ਕੀਤੇ ਉੱਚ-ਗੁਣਵੱਤਾ ਵਾਲੇ ਨੈੱਟਵਰਕ ਦੇ ਨੇੜੇ ਹੋਵੋ"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ਵਾਪਸ ਚਾਲੂ ਨਾ ਕਰੋ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 65058a3..a53608a 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1301,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Kliknij, by zobaczyć wszystkie sieci"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Połącz"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Wszystkie sieci"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Zezwalać na sugerowane sieci Wi‑Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Sugerowane sieci: <xliff:g id="NAME">%s</xliff:g>. Urządzenie może połączyć się automatycznie."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Zezwól"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nie, dziękuję"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi włączy się automatycznie"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Gdy znajdziesz się w pobliżu zapisanej sieci o mocnym sygnale"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Nie włączaj ponownie"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 5c9bed4..f0d8d05 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Permitir redes Wi-Fi sugeridas?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Redes sugeridas pelo app <xliff:g id="NAME">%s</xliff:g>. O dispositivo pode se conectar automaticamente."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Permitir"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Não"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quando você estiver perto de uma rede salva de alta qualidade"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Não ativar novamente"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index ba28c60..5d5618f 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Ligar"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Pretende permitir redes Wi-Fi sugeridas?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Redes sugeridas por <xliff:g id="NAME">%s</xliff:g>. O dispositivo pode estabelecer ligação automaticamente."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Permitir"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Não, obrigado"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quando estiver próximo de uma rede de alta qualidade guardada."</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Não reativar"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 5c9bed4..f0d8d05 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Todas as redes"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Permitir redes Wi-Fi sugeridas?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Redes sugeridas pelo app <xliff:g id="NAME">%s</xliff:g>. O dispositivo pode se conectar automaticamente."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Permitir"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Não"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"O Wi‑Fi será ativado automaticamente"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Quando você estiver perto de uma rede salva de alta qualidade"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Não ativar novamente"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 4386c12..d790efc 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1279,14 +1279,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Atingeți pentru a vedea toate rețelele"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectați-vă"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Toate rețelele"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Permiteți rețelele Wi-Fi sugerate?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> a sugerat rețele. Dispozitivul se poate conecta automat."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Permiteți"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nu, mulțumesc"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi se va activa automat"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Când vă aflați lângă o rețea salvată, de înaltă calitate"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Nu reactivați"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 13d75e3..0becae0 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1301,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Нажмите, чтобы увидеть список сетей"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Подключиться"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Все сети"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Разрешить подключение к предложенным сетям Wi‑Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Приложение \"<xliff:g id="NAME">%s</xliff:g>\" рекомендует сети, к которым устройство может подключаться автоматически."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Разрешить"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Нет, спасибо"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi включится автоматически"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Когда вы будете в зоне действия сохраненной сети с хорошим сигналом."</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не включать снова"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 648f319..a46da16 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1259,14 +1259,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"සියලු ජාල බැලීමට තට්ටු කරන්න"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"සම්බන්ධ කරන්න"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"සියලු ජාල"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"යෝජිත Wi-Fi ජාල ඉඩ දෙන්නද?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> යෝජිත ජාල. උපාංගය ස්වයංක්රියව සම්බන්ධ වනු ඇත."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"ඉඩ දෙන්න"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"එපා, ස්තූතියි"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ස්වයංක්රියව ක්රියාත්මක වනු ඇත"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"ඔබ උසස් තත්ත්වයේ සුරැකි ජාලයක් අවට සිටින විට"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"නැවත ක්රියාත්මක නොකරන්න"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 0202efd..f996537 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1301,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všetky siete"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Pripojiť"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Všetky siete"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Chcete povoliť navrhované siete Wi‑Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Siete navrhnuté aplikáciou <xliff:g id="NAME">%s</xliff:g>. Zariadenie sa môže pripojiť automaticky."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Povoliť"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nie, ďakujem"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi sa zapne automaticky"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Keď budete v blízkosti kvalitnej uloženej siete"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Znova nezapínať"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 4bcdadd..7c6c159 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1301,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dotaknite se, če si želite ogledati vsa omrežja"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Vzpostavi povezavo"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Vsa omrežja"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Želite dovoliti predlagana omrežja Wi-Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> – predlagana omrežja Naprava se lahko poveže samodejno."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Dovoli"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ne, hvala"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Povezava Wi‑Fi se bo samodejno vklopila"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Ko ste v bližini zanesljivega shranjenega omrežja"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ne vklopi znova"</string>
@@ -1405,7 +1401,7 @@
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Zaznana je analogna dodatna zvočna oprema"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključena naprava ni združljiva s tem telefonom. Dotaknite se za več informacij."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Iskanje napak prek USB je povezano"</string>
- <string name="adb_active_notification_message" msgid="7463062450474107752">"Dotaknite se, če želite izklopiti odpravljanje napak prek USB-ja"</string>
+ <string name="adb_active_notification_message" msgid="7463062450474107752">"Dotaknite se, če želite izklop. odpravlj. napak prek USB-ja"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"Izberite, če želite onemogočiti iskanje in odpravljanje napak prek vrat USB."</string>
<string name="test_harness_mode_notification_title" msgid="2216359742631914387">"Način preizkusnega ogrodja je omogočen"</string>
<string name="test_harness_mode_notification_message" msgid="1343197173054407119">"Če želite onemogočiti način preizkusnega ogrodja, ponastavite napravo na tovarniške nastavitve."</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index bc8d3808..2b1dd68 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trokit për të parë të gjitha rrjetet"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Lidhu"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Të gjitha rrjetet"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Të lejohen rrjetet e sugjeruara Wi‑Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Rrjet e sugjeruara të <xliff:g id="NAME">%s</xliff:g>. Pajisja mund të lidhet automatikisht."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Lejo"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Jo, faleminderit"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi do të aktivizohet automatikisht"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kur ndodhesh pranë një rrjeti të ruajtur me cilësi të lartë"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Mos e aktivizo përsëri"</string>
@@ -1679,7 +1675,7 @@
<string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Zgjidh një shërbim për ta përdorur kur troket butonin e qasshmërisë:"</string>
<string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Zgjidh një shërbim për ta përdorur me gjestin e qasshmërisë (rrëshqit shpejt lart nga fundi i ekranit me dy gishta):"</string>
<string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Zgjidh një shërbim për ta përdorur me gjestin e qasshmërisë (rrëshqit shpejt lart nga fundi i ekranit me tre gishta):"</string>
- <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Për të kaluar mes shërbimeve, prek dhe mbaj prekur butonin e qasshmërisë."</string>
+ <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Për të kaluar mes shërbimeve, prek dhe mbaj të shtypur butonin e qasshmërisë."</string>
<string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Për të kaluar mes pajisjeve, rrëshqit shpejt lart me dy gishta dhe mbaje prekur."</string>
<string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Për të kaluar mes pajisjeve, rrëshqit shpejt lart me tre gishta dhe mbaje prekur."</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zmadhimi"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index f4f29a1..6404abc 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1279,14 +1279,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Додирните да бисте видели све мреже"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Повежи"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Све мреже"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Желите да дозволите предложене Wi‑Fi мреже?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Мреже које предлаже <xliff:g id="NAME">%s</xliff:g>. Уређај ће се можда повезати аутоматски."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Дозволи"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Не, хвала"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi ће се аутоматски укључити"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Када сте у близини сачуване мреже високог квалитета"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не укључуј поново"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index ccd80ad..cf4f786 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tryck för att visa alla nätverk"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Anslut"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Alla nätverk"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Vill du tillåta föreslagna Wi-Fi-nätverk?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Nätverk som föreslagits av <xliff:g id="NAME">%s</xliff:g>. Enheten kan anslutas automatiskt."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Tillåt"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Nej tack"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi aktiveras automatiskt"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"När du är i närheten av ett sparat nätverk av hög kvalitet"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Återaktivera inte"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 4439f2c..80fc4f8 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Gusa ili uone mitandao yote"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Unganisha"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Mitandao yote"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Ungependa kuruhusu mitandao inayopendekezwa ya Wi-Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Mitandao inayopendekezwa kwa ajili ya <xliff:g id="NAME">%s</xliff:g>. Huenda kifaa kikaunganisha kiotomatiki."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Ruhusu"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Hapana, asante"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi itawashwa kiotomatiki"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Unapokuwa karibu na mtandao uliohifadhiwa wenye ubora wa juu"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Usiwashe tena"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index fec5c5f..726e223 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -435,7 +435,7 @@
<string name="permlab_camera" msgid="3616391919559751192">"படங்கள் மற்றும் வீடியோக்களை எடுத்தல்"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"இந்த ஆப்ஸ் எப்போது வேண்டுமானாலும் கேமராவைப் பயன்படுத்தி படங்களை எடுக்கலாம், வீடியோக்களை ரெக்கார்டு செய்யலாம்."</string>
<string name="permlab_systemCamera" msgid="4074081285026193898">"படங்களையும் வீடியோக்களையும் எடுப்பதற்கு சிஸ்டம் கேமராக்களை அணுக ஆப்ஸையோ சேவையையோ அனுமதி"</string>
- <string name="permdesc_systemCamera" msgid="6488131672529669229">"இந்த முன்னுரிமை பெற்ற சிஸ்டம் ஆப்ஸால் சிஸ்டம் கேமராவைப் பயன்படுத்தி எப்போது வேண்டுமானாலும் படங்களை எடுக்கவோ வீடியோக்களை ரெக்கார்டு செய்யவோ முடியும். அதே போல android.permission.CAMERA அனுமதியும் ஆப்ஸிற்குத் தேவை"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"இந்த முன்னுரிமை பெற்ற சிஸ்டம் ஆப்ஸால் சிஸ்டம் கேமராவைப் பயன்படுத்தி எப்போது வேண்டுமானாலும் படங்களை எடுக்கவோ வீடியோக்களை ரெக்கார்டு செய்யவோ முடியும். android.permission.CAMERA அனுமதியும் ஆப்ஸிற்குத் தேவை"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"அதிர்வைக் கட்டுப்படுத்துதல்"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"அதிர்வைக் கட்டுப்படுத்தப் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"தொலைபேசி எண்களை நேரடியாக அழைத்தல்"</string>
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"எல்லா நெட்வொர்க்குகளையும் பார்க்க, தட்டவும்"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"இணை"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"எல்லா நெட்வொர்க்குகளும்"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"பரிந்துரைக்கப்பட்ட வைஃபை நெட்வொர்க்குகளை அனுமதிக்க வேண்டுமா?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> பரிந்துரைக்கும் நெட்வொர்க்குகள். சாதனம் தானாக இணைக்கப்படக்கூடும்."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"அனுமதி"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"வேண்டாம்"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"வைஃபை தானாக ஆன் ஆகும்"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"சேமித்த, உயர்தர நெட்வொர்க்கிற்கு அருகில் இருக்கும்போது"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"மீண்டும் ஆன் செய்யாதே"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index de1a8d6..aa5c271 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -434,10 +434,8 @@
<string name="permdesc_activityRecognition" msgid="3143453925156552894">"ఈ యాప్ మీ భౌతిక కార్యాకలాపాన్ని గుర్తించగలదు."</string>
<string name="permlab_camera" msgid="3616391919559751192">"చిత్రాలు మరియు వీడియోలు తీయడం"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"ఈ యాప్ కెమెరాను ఉపయోగించి ఎప్పుడైనా చిత్రాలను తీయగలదు మరియు వీడియోలను రికార్డ్ చేయగలదు."</string>
- <!-- no translation found for permlab_systemCamera (4074081285026193898) -->
- <skip />
- <!-- no translation found for permdesc_systemCamera (6488131672529669229) -->
- <skip />
+ <string name="permlab_systemCamera" msgid="4074081285026193898">"ఫోటోలు, వీడియోలు తీయడానికి సిస్టమ్ కెమెరాలకు యాప్, లేదా సేవా యాక్సెస్ను అనుమతించండి"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"ఈ విశేష | సిస్టమ్ యాప్ ఎప్పుడైనా సిస్టమ్ కెమెరాను ఉపయోగించి ఫోటోలు తీయగలదు, వీడియోలను రికార్డ్ చేయగలదు. యాప్కు android.permission.CAMERA అనుమతి ఇవ్వడం కూడా అవసరం"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"వైబ్రేషన్ను నియంత్రించడం"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"వైబ్రేటర్ను నియంత్రించడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"నేరుగా కాల్ చేసే ఫోన్ నంబర్లు"</string>
@@ -1259,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"అన్ని నెట్వర్క్లు చూడటానికి నొక్కండి"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"కనెక్ట్ చేయి"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"అన్ని నెట్వర్క్లు"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"సూచించిన Wi‑Fi నెట్వర్క్లను అనుమతించాలా?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> సూచించిన నెట్ వర్క్ లు పరికరం ఆటోమేటిక్ గా కనెక్ట్ కాకపోవచ్చు."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"అనుమతించు"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"వద్దు"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi స్వయంచాలకంగా ఆన్ అవుతుంది"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"మీరు అధిక నాణ్యత గల సేవ్ చేసిన నెట్వర్క్కు సమీపంగా ఉన్నప్పుడు"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"తిరిగి ఆన్ చేయవద్దు"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index e8c776c..d170932 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"แตะเพื่อดูเครือข่ายทั้งหมด"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"เชื่อมต่อ"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"เครือข่ายทั้งหมด"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"อนุญาตให้เชื่อมต่อเครือข่าย Wi-Fi ที่แนะนำไหม"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"เครือข่ายที่แนะนำ <xliff:g id="NAME">%s</xliff:g> อุปกรณ์อาจเชื่อมต่อโดยอัตโนมัติ"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"อนุญาต"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"ไม่เป็นไร"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi จะเปิดโดยอัตโนมัติ"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"เมื่อคุณอยู่ใกล้เครือข่ายคุณภาพสูงที่บันทึกไว้"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"ไม่ต้องเปิดอีกครั้ง"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index fc0a90c..49a13c9 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"I-tap upang makita ang lahat ng network"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Kumonekta"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Lahat ng network"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Payagan ang mga iminumungkahing Wi‑Fi network?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Mga iminumungkahing network ng <xliff:g id="NAME">%s</xliff:g>. Posibleng awtomatikong kumonekta ang device."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Payagan"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Hindi, salamat na lang"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Awtomatikong mag-o-on ang Wi‑Fi"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Kapag malapit ka sa naka-save na network na mataas ang kalidad"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Huwag i-on muli"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 5b61b97..dd75d23 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tüm ağları görmek için dokunun"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Bağlan"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tüm ağlar"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Önerilen kablosuz ağlara izin verilsin mi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> tarafından önerilen ağlar. Cihaz otomatik olarak bağlanabilir."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"İzin ver"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Hayır, teşekkürler"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Kablosuz özelliği otomatik olarak açılacak"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Daha önce kaydedilmiş yüksek kaliteli bir ağın yakınında olduğunuzda"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Tekrar açılmasın"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 0855110..02c7957 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1301,14 +1301,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Торкніться, щоб побачити всі мережі"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Під’єднатися"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Усі мережі"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Дозволити пропоновані мережі Wi‑Fi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Мережі, пропоновані додатком <xliff:g id="NAME">%s</xliff:g>. Пристрій може підключитися автоматично."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Дозволити"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Ні, дякую"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi вмикатиметься автоматично"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Коли ви поблизу збереженої мережі високої якості"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Не вмикати знову"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index f5978e2..f7d03c5 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"تمام نیٹ ورکس دیکھنے کیلئے تھپتھپائيں"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"منسلک کریں"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"سبھی نیٹ ورکس"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"تجویز کردہ Wi‑Fi نیٹ ورکس کو اجازت دیں؟"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> تجویز کردہ نیٹ ورکس۔ آلہ خودکار طور پر منسلک ہو سکتا ہے۔"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"اجازت ہیں"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"نہیں شکریہ"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi از خود آن ہو جائے گا"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"جب آپ اعلی معیار کے محفوظ کردہ نیٹ ورک کے قریب ہوں"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"دوبارہ آن نہ کریں"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 681e742..a6c1d3a 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -435,7 +435,7 @@
<string name="permlab_camera" msgid="3616391919559751192">"rasm va videoga olish"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"Bu ilova xohlagan vaqtda kamera orqali suratga olishi va video yozib olishi mumkin."</string>
<string name="permlab_systemCamera" msgid="4074081285026193898">"Ilova yoki xizmatga tizim kamerasi orqali surat va videolar olishga ruxsat berish"</string>
- <string name="permdesc_systemCamera" msgid="6488131672529669229">"Bu imtiyozli | tizim ilovasi istalgan vaqtda tizim kamerasi orqali surat va videolar olishi mumkin. Ilovada android.permission.CAMERA permission ruxsati ham yoqilgan boʻlishi talab qilinadi"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"Bu imtiyozli | tizim ilovasi istalgan vaqtda tizim kamerasi orqali surat va videolar olishi mumkin. Ilovada android.permission.CAMERA ruxsati ham yoqilgan boʻlishi talab qilinadi"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"tebranishni boshqarish"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"Ilova tebranishli signallarni boshqarishi mumkin."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"telefon raqamlariga tog‘ridan to‘g‘ri qo‘ng‘iroq qilish"</string>
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Barcha tarmoqlarni ko‘rish uchun bosing"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Ulanish"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Barcha tarmoqlar"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Tavsiya qilingan Wi‑Fi tarmoqlarga ruxsat berilsinmi?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> tavsiya qilgan tarmoqlar. Qurilma avtomatik ulanishi mumkin."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Ruxsat"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Kerak emas"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi avtomatik ravishda yoqiladi"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Saqlangan tarmoqlar ichidan signali yaxshisi hududida ekaningizda"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Qayta yoqilmasin"</string>
@@ -1361,7 +1357,7 @@
<string name="usb_power_notification_message" msgid="4647527153291917218">"Ulangan qurilma quvvatlanmoqda. Boshqa parametrlar uchun bosing."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogli audio uskuna aniqlandi"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Biriktirilgan qurilma mazkur telefon bilan mos emas. Batafsil axborot olish uchun bu yerga bosing."</string>
- <string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozliklarni tuzatish"</string>
+ <string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozliklarni aniqlash"</string>
<string name="adb_active_notification_message" msgid="7463062450474107752">"USB orqali nosozliklarni aniqlashni faolsizlantirish uchun bosing"</string>
<string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"USB orqali nosozliklarni tuzatishni o‘chirib qo‘yish uchun bosing."</string>
<string name="test_harness_mode_notification_title" msgid="2216359742631914387">"Xavfsizlik sinovi rejimi yoqildi"</string>
@@ -1935,7 +1931,7 @@
<string name="app_category_maps" msgid="5878491404538024367">"Xaritalar va navigatsiya"</string>
<string name="app_category_productivity" msgid="3742083261781538852">"Ish va unumdorlik"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Qurilma xotirasi"</string>
- <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB orqali nosozliklarni tuzatish"</string>
+ <string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB orqali nosozliklarni aniqlash"</string>
<string name="time_picker_hour_label" msgid="2979075098868106450">"soat"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"daqiqa"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Vaqtni sozlash"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 9f8d48a..59b55d0 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Nhấn để xem tất cả các mạng"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Kết nối"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Tất cả các mạng"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Cho phép các mạng Wi‑Fi được đề xuất?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"Các mạng do <xliff:g id="NAME">%s</xliff:g> đề xuất. Thiết bị có thể kết nối tự động."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Cho phép"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Không, cảm ơn"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi sẽ tự động bật"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Khi bạn ở gần mạng đã lưu chất lượng cao"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Không bật lại"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 0293237..d8b18d3 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"点按即可查看所有网络"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"连接"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有网络"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"是否允许系统连接到建议的 WLAN 网络?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g>建议的网络。设备可能会自动连接到这些网络。"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"允许"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"不用了"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"WLAN 将自动开启"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"当您位于已保存的高品质网络信号范围内时"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"不要重新开启"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 9c30e70..1a73904 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -435,7 +435,7 @@
<string name="permlab_camera" msgid="3616391919559751192">"拍照和拍攝影片"</string>
<string name="permdesc_camera" msgid="5392231870049240670">"此應用程式可以隨時使用相機拍照和攝錄。"</string>
<string name="permlab_systemCamera" msgid="4074081285026193898">"允許應用程式或服務存取系統相機來拍照和攝錄"</string>
- <string name="permdesc_systemCamera" msgid="6488131672529669229">"此特別權限 | 系統應用程式可以隨時使用系統相機來拍照和攝錄。應用程式亦需要獲得 Android 權限/相機權限"</string>
+ <string name="permdesc_systemCamera" msgid="6488131672529669229">"這個獲特別權限的系統應用程式可以在任何時候使用系統相機來拍照和攝錄。此外,應用程式亦需要 android.permission.CAMERA 權限"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"控制震動"</string>
<string name="permdesc_vibrate" msgid="6284989245902300945">"允許應用程式控制震動。"</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"直接撥打電話號碼"</string>
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕按即可查看所有網絡"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有網絡"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"要允許連線至建議的 Wi-Fi 網絡嗎?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"「<xliff:g id="NAME">%s</xliff:g>」已建議網絡連線,裝置可能會自動連接網絡。"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"允許"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"不用了,謝謝"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi-Fi 將會自動開啟"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"當您位於已儲存的高品質網絡信號範圍內時"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"不要重新開啟"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index ce95582..8f8b758 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕觸即可查看所有網路"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"所有網路"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"是否允許系統連線到建議的 Wi‑Fi 網路?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"「<xliff:g id="NAME">%s</xliff:g>」建議的網路。裝置可能會自動連線到這些網路。"</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"允許"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"不用了,謝謝"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"Wi‑Fi 將自動開啟"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"當你位於已儲存的高品質網路範圍內時"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"不要重新開啟"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index e5e5311..4c37933 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1257,14 +1257,10 @@
<string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Thepha ukuze ubone onke amanethiwekhi"</string>
<string name="wifi_available_action_connect" msgid="2635699628459488788">"Xhuma"</string>
<string name="wifi_available_action_all_networks" msgid="4368435796357931006">"Onke amanethiwekhi"</string>
- <!-- no translation found for wifi_suggestion_title (6396033039578436801) -->
- <skip />
- <!-- no translation found for wifi_suggestion_content (5603992011371520746) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_allow_app (7978995387498669901) -->
- <skip />
- <!-- no translation found for wifi_suggestion_action_disallow_app (6434097275967940372) -->
- <skip />
+ <string name="wifi_suggestion_title" msgid="6396033039578436801">"Vumela amanethiwekhi e-Wi-Fi aphakanyisiwe?"</string>
+ <string name="wifi_suggestion_content" msgid="5603992011371520746">"<xliff:g id="NAME">%s</xliff:g> amanethiwekhi aphakanyisiwe. Idivayisi ingaxhumeka ngokuzenzakalela."</string>
+ <string name="wifi_suggestion_action_allow_app" msgid="7978995387498669901">"Vumela"</string>
+ <string name="wifi_suggestion_action_disallow_app" msgid="6434097275967940372">"Cha ngiyabonga"</string>
<string name="wifi_wakeup_onboarding_title" msgid="228772560195634292">"I-Wi-Fi izovuleka ngokuzenzakalela"</string>
<string name="wifi_wakeup_onboarding_subtext" msgid="3989697580301186973">"Uma useduze kwenethiwekhi yekhwalithi ephezulu elondoloziwe"</string>
<string name="wifi_wakeup_onboarding_action_disable" msgid="838648204200836028">"Ungaphindi uvule"</string>
diff --git a/core/tests/coretests/src/android/app/usage/UsageStatsTest.java b/core/tests/coretests/src/android/app/usage/UsageStatsTest.java
index 1633e1a..6ec3dc9 100644
--- a/core/tests/coretests/src/android/app/usage/UsageStatsTest.java
+++ b/core/tests/coretests/src/android/app/usage/UsageStatsTest.java
@@ -34,7 +34,10 @@
import android.app.usage.UsageEvents.Event;
import android.os.Parcel;
+import android.os.UserHandle;
+import android.support.test.uiautomator.UiDevice;
+import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -121,6 +124,15 @@
}
@Test
+ public void testDataIsInCe() throws Exception {
+ final int userId = UserHandle.myUserId();
+ final String expectedPath = "/data/system_ce/" + userId + "/usagestats";
+ final String actualPath = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+ .executeShellCommand("dumpsys usagestats stats-directory " + userId).trim();
+ assertEquals(expectedPath, actualPath);
+ }
+
+ @Test
public void testParcelable() {
left.mPackageName = "com.test";
left.mBeginTimeStamp = 100000;
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 233f826..0960f78 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -166,6 +166,7 @@
<assign-permission name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE" uid="cameraserver" />
<assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="cameraserver" />
<assign-permission name="android.permission.WATCH_APPOPS" uid="cameraserver" />
+ <assign-permission name="android.permission.MANAGE_APP_OPS_MODES" uid="cameraserver" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="graphics" />
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index 7ea83f5..b0ab5b4 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -948,8 +948,8 @@
pw.print(" mNavigationBarView=");
pw.println(mNavigationBarView);
- if (KeyguardUpdateMonitor.getInstance(mContext) != null) {
- KeyguardUpdateMonitor.getInstance(mContext).dump(fd, pw, args);
+ if (Dependency.get(KeyguardUpdateMonitor.class) != null) {
+ Dependency.get(KeyguardUpdateMonitor.class).dump(fd, pw, args);
}
Dependency.get(FalsingManager.class).dump(pw);
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 75344c4..e591121 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -414,7 +414,7 @@
<string name="disabled" msgid="9206776641295849915">"నిలిపివేయబడింది"</string>
<string name="external_source_trusted" msgid="2707996266575928037">"అనుమతించినవి"</string>
<string name="external_source_untrusted" msgid="2677442511837596726">"అనుమతించబడలేదు"</string>
- <string name="install_other_apps" msgid="6986686991775883017">"తెలియని యాప్లను ఇన్స్టాల్ చేయండి"</string>
+ <string name="install_other_apps" msgid="6986686991775883017">"తెలియని యాప్లను ఇన్స్టాల్ చేయడం"</string>
<string name="home" msgid="3256884684164448244">"సెట్టింగ్ల హోమ్"</string>
<string-array name="battery_labels">
<item msgid="8494684293649631252">"0%"</item>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 5dca475..0d3e8de 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -201,7 +201,7 @@
<string name="vpn_settings_not_available" msgid="956841430176985598">"Ushbu foydalanuvchi uchun VPN sozlamalari mavjud emas"</string>
<string name="tethering_settings_not_available" msgid="6765770438438291012">"Ushbu foydalanuvchi uchun Modem rejimi sozlamalari mavjud emas"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"Ushbu foydalanuvchi uchun Internetga kirish nuqtasi (APN) sozlamalari mavjud emas"</string>
- <string name="enable_adb" msgid="7982306934419797485">"USB orqali nosozliklarni tuzatish"</string>
+ <string name="enable_adb" msgid="7982306934419797485">"USB orqali nosozliklarni aniqlash"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"USB orqali kompyuterga ulanganda tuzatish rejimi yoqilsin"</string>
<string name="clear_adb_keys" msgid="4038889221503122743">"USB orqali nosozliklarni tuzatishni taqiqlash"</string>
<string name="bugreport_in_power" msgid="7923901846375587241">"Xatoliklar hisoboti"</string>
@@ -264,7 +264,7 @@
<string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Mobil internet har doim yoniq tursin, hatto Wi-Fi yoniq bo‘lsa ham (bir tarmoqdan ikkinchisiga tezroq o‘tish uchun)."</string>
<string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Modem rejimida apparatli tezlashtirishdan foydalanish (agar mavjud bo‘lsa)"</string>
<string name="adb_warning_title" msgid="6234463310896563253">"USB orqali nosozliklarni tuzatishga ruxsat berilsinmi?"</string>
- <string name="adb_warning_message" msgid="7316799925425402244">"USB orqali nosozliklarni tuzatish faqat dasturlash maqsadlarida yoqiladi. Undan ma‘lumotlarni qurilmangiz va kompyuter o‘rtasida ko‘chirish, ilovalarni xabarnomasiz o‘rnatish va jurnal ma‘lumotlarini o‘qish uchun foydalaniladi."</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"USB orqali nosozliklarni aniqlash faqat dasturlash maqsadlarida yoqiladi. Undan maʼlumotlarni qurilmangiz va kompyuter o‘rtasida ko‘chirish, ilovalarni xabarnomasiz o‘rnatish va jurnal maʼlumotlarini o‘qish uchun foydalaniladi."</string>
<string name="adb_keys_warning_message" msgid="5659849457135841625">"USB orqali nosozliklarni tuzatishga berilgan ruxsat siz hisobingizga kirgan barcha kompyuterlar uchun bekor qilinsinmi?"</string>
<string name="dev_settings_warning_title" msgid="7244607768088540165">"Dasturlash sozlamalariga ruxsat berilsinmi?"</string>
<string name="dev_settings_warning_message" msgid="2298337781139097964">"Bu sozlamalar faqat dasturlash maqsadlariga mo‘ljallangan. Shuning uchun, ular qurilmangizga va undagi ilovalariga shikast yetkazib, noto‘g‘ri ishlashiga sabab bo‘lishi mumkin."</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index bd026dc..c948328 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -298,7 +298,7 @@
<string name="dessert_case" msgid="1295161776223959221">"\"Kutia e ëmbëlsirës\""</string>
<string name="start_dreams" msgid="5640361424498338327">"Mbrojtësi i ekranit"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Eternet"</string>
- <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Trokit dhe mbaj prekur ikonat për më shumë opsione"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="8030309023792936283">"Trokit dhe mbaj të shtypur ikonat për më shumë opsione"</string>
<string name="quick_settings_dnd_label" msgid="7112342227663678739">"Mos shqetëso"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vetëm me prioritet"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vetëm alarmet"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index e4a4548..eaca944 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -60,7 +60,7 @@
<string name="usb_debugging_always" msgid="303335496705863070">"Doimo ushbu kompyuterdan ruxsat berilsin"</string>
<string name="usb_debugging_allow" msgid="2272145052073254852">"Ruxsat berish"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB orqali nosozliklarni tuzatishga ruxsat berilmagan"</string>
- <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni tuzatish funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting."</string>
+ <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni aniqlash funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting."</string>
<string name="usb_contaminant_title" msgid="206854874263058490">"USB port faolsizlashtirildi"</string>
<string name="usb_contaminant_message" msgid="7379089091591609111">"Qurilmangizni suyuqlik va turli parchalardan himoya qilish uchun USB port faolsizlashtiriladi va hech qanday aksessuarni aniqlay olmaydi.\n\nUSB portdan xavfsiz foydalanish mumkin boʻlganda, sizga xabar beriladi."</string>
<string name="usb_port_enabled" msgid="7906141351687694867">"Quvvatlash moslamalari va aksessuarlarni aniqlash uchun USB port yoqildi"</string>
@@ -459,7 +459,7 @@
<string name="media_projection_remember_text" msgid="3103510882172746752">"Boshqa ko‘rsatilmasin"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"Hammasini tozalash"</string>
<string name="manage_notifications_text" msgid="2386728145475108753">"Boshqarish"</string>
- <string name="notification_section_header_gentle" msgid="4372438504154095677">"Ovozsiz bildirishnomalar"</string>
+ <string name="notification_section_header_gentle" msgid="4372438504154095677">"Sokin bildirishnomalar"</string>
<string name="accessibility_notification_section_header_gentle_clear_all" msgid="4286716295850400959">"Barcha tovushsiz bildirishnomalarni tozalash"</string>
<string name="dnd_suppressing_shade_text" msgid="1904574852846769301">"Bezovta qilinmasin rejimida bildirishnomalar pauza qilingan"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Boshlash"</string>
diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierText.java b/packages/SystemUI/src/com/android/keyguard/CarrierText.java
index adcb7a1..7592a8d 100644
--- a/packages/SystemUI/src/com/android/keyguard/CarrierText.java
+++ b/packages/SystemUI/src/com/android/keyguard/CarrierText.java
@@ -24,6 +24,8 @@
import android.view.View;
import android.widget.TextView;
+import com.android.systemui.Dependency;
+
import java.util.Locale;
public class CarrierText extends TextView {
@@ -83,7 +85,7 @@
com.android.internal.R.string.kg_text_message_separator);
mCarrierTextController = new CarrierTextController(mContext, mSeparator, mShowAirplaneMode,
mShowMissingSim);
- mShouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive();
+ mShouldMarquee = Dependency.get(KeyguardUpdateMonitor.class).isDeviceInteractive();
setSelected(mShouldMarquee); // Allow marquee to work.
}
diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
index 107d5cc..cdabbd7 100644
--- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
+++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
@@ -225,7 +225,7 @@
// TODO(b/140034799)
if (whitelistIpcs(() -> ConnectivityManager.from(mContext).isNetworkSupported(
ConnectivityManager.TYPE_MOBILE))) {
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mKeyguardUpdateMonitor.registerCallback(mCallback);
mWakefulnessLifecycle.addObserver(mWakefulnessObserver);
telephonyManager.listen(mPhoneStateListener,
@@ -487,7 +487,7 @@
}
final boolean missingAndNotProvisioned =
- !KeyguardUpdateMonitor.getInstance(mContext).isDeviceProvisioned()
+ !Dependency.get(KeyguardUpdateMonitor.class).isDeviceProvisioned()
&& (simState == IccCardConstants.State.ABSENT
|| simState == IccCardConstants.State.PERM_DISABLED);
diff --git a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
index 979f3dc..1c30762 100644
--- a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
+++ b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
@@ -40,6 +40,7 @@
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.util.EmergencyAffordanceManager;
import com.android.internal.widget.LockPatternUtils;
+import com.android.systemui.Dependency;
import com.android.systemui.util.EmergencyDialerConstants;
/**
@@ -104,13 +105,13 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mInfoCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mInfoCallback);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mInfoCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).removeCallback(mInfoCallback);
}
@Override
@@ -186,7 +187,7 @@
mEmergencyButtonCallback.onEmergencyButtonClickedWhenInCall();
}
} else {
- KeyguardUpdateMonitor.getInstance(mContext).reportEmergencyCallAction(
+ Dependency.get(KeyguardUpdateMonitor.class).reportEmergencyCallAction(
true /* bypassHandler */);
getContext().startActivityAsUser(INTENT_EMERGENCY_DIAL,
ActivityOptions.makeCustomAnimation(getContext(), 0, 0).toBundle(),
@@ -201,7 +202,7 @@
if (isInCall()) {
visible = true; // always show "return to call" if phone is off-hook
} else {
- final boolean simLocked = KeyguardUpdateMonitor.getInstance(mContext)
+ final boolean simLocked = Dependency.get(KeyguardUpdateMonitor.class)
.isSimPinVoiceSecure();
if (simLocked) {
// Some countries can't handle emergency calls while SIM is locked.
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
index 14ead04..97e435d 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
@@ -35,6 +35,7 @@
import com.android.keyguard.KeyguardSecurityContainer.SecurityCallback;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.settingslib.Utils;
+import com.android.systemui.Dependency;
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import java.io.File;
@@ -106,7 +107,7 @@
public KeyguardHostView(Context context, AttributeSet attrs) {
super(context, attrs);
- KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mUpdateCallback);
}
@Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
index 037a8d3..811b458 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardMessageArea.java
@@ -31,6 +31,7 @@
import android.view.View;
import android.widget.TextView;
+import com.android.systemui.Dependency;
import com.android.systemui.statusbar.policy.ConfigurationController;
import java.lang.ref.WeakReference;
@@ -85,7 +86,7 @@
@Inject
public KeyguardMessageArea(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs,
ConfigurationController configurationController) {
- this(context, attrs, KeyguardUpdateMonitor.getInstance(context), configurationController);
+ this(context, attrs, Dependency.get(KeyguardUpdateMonitor.class), configurationController);
}
public KeyguardMessageArea(Context context, AttributeSet attrs, KeyguardUpdateMonitor monitor,
@@ -177,7 +178,7 @@
@Override
protected void onFinishInflate() {
- boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive();
+ boolean shouldMarquee = Dependency.get(KeyguardUpdateMonitor.class).isDeviceInteractive();
setSelected(shouldMarquee); // This is required to ensure marquee works
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
index 6808c0f..299e72b 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java
@@ -24,6 +24,7 @@
import com.android.settingslib.animation.AppearAnimationUtils;
import com.android.settingslib.animation.DisappearAnimationUtils;
+import com.android.systemui.Dependency;
/**
* Displays a PIN pad for unlocking.
@@ -61,7 +62,7 @@
mContext, android.R.interpolator.fast_out_linear_in));
mDisappearYTranslation = getResources().getDimensionPixelSize(
R.dimen.disappear_y_translation);
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
}
@Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
index 56b38f7..11a70b6 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
@@ -42,6 +42,7 @@
import com.android.settingslib.animation.AppearAnimationCreator;
import com.android.settingslib.animation.AppearAnimationUtils;
import com.android.settingslib.animation.DisappearAnimationUtils;
+import com.android.systemui.Dependency;
import java.util.List;
@@ -116,7 +117,7 @@
public KeyguardPatternView(Context context, AttributeSet attrs) {
super(context, attrs);
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mAppearAnimationUtils = new AppearAnimationUtils(context,
AppearAnimationUtils.DEFAULT_APPEAR_DURATION, 1.5f /* translationScale */,
2.0f /* delayScale */, AnimationUtils.loadInterpolator(
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 454f446..878c9c4 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -129,7 +129,7 @@
super(context, attrs, defStyle);
mSecurityModel = new KeyguardSecurityModel(context);
mLockPatternUtils = new LockPatternUtils(context);
- mUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mSpringAnimation = new SpringAnimation(this, DynamicAnimation.Y);
mInjectionInflationController = new InjectionInflationController(
SystemUIFactory.getInstance().getRootComponent());
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java
index 16e9ffc..bb89959 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityModel.java
@@ -23,6 +23,7 @@
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.widget.LockPatternUtils;
+import com.android.systemui.Dependency;
public class KeyguardSecurityModel {
@@ -57,7 +58,7 @@
}
SecurityMode getSecurityMode(int userId) {
- KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
+ KeyguardUpdateMonitor monitor = Dependency.get(KeyguardUpdateMonitor.class);
if (mIsPukScreenAvailable && SubscriptionManager.isValidSubscriptionId(
monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED))) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
index 69da990..b93e28b 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
@@ -41,6 +41,7 @@
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.PhoneConstants;
+import com.android.systemui.Dependency;
/**
* Displays a PIN pad for unlocking.
@@ -111,8 +112,8 @@
if (count < 2) {
msg = rez.getString(R.string.kg_sim_pin_instructions);
} else {
- SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext).
- getSubscriptionInfoForSubId(mSubId);
+ SubscriptionInfo info = Dependency.get(KeyguardUpdateMonitor.class)
+ .getSubscriptionInfoForSubId(mSubId);
CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash
msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName);
if (info != null) {
@@ -149,7 +150,7 @@
}
private void handleSubInfoChangeIfNeeded() {
- KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
+ KeyguardUpdateMonitor monitor = Dependency.get(KeyguardUpdateMonitor.class);
int subId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED);
if (subId != mSubId && SubscriptionManager.isValidSubscriptionId(subId)) {
mSubId = subId;
@@ -222,7 +223,7 @@
@Override
public void onResume(int reason) {
super.onResume(reason);
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mUpdateMonitorCallback);
resetState();
}
@@ -233,7 +234,7 @@
mSimUnlockProgressDialog.dismiss();
mSimUnlockProgressDialog = null;
}
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).removeCallback(mUpdateMonitorCallback);
}
/**
@@ -337,7 +338,7 @@
resetPasswordText(true /* animate */,
result != PhoneConstants.PIN_RESULT_SUCCESS /* announce */);
if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
- KeyguardUpdateMonitor.getInstance(getContext())
+ Dependency.get(KeyguardUpdateMonitor.class)
.reportSimUnlocked(mSubId);
mRemainingAttempts = -1;
mShowDefaultMessage = true;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java
index 27f71d1..44cd2ef 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java
@@ -40,6 +40,7 @@
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.PhoneConstants;
+import com.android.systemui.Dependency;
/**
@@ -171,8 +172,8 @@
if (count < 2) {
msg = rez.getString(R.string.kg_puk_enter_puk_hint);
} else {
- SubscriptionInfo info = KeyguardUpdateMonitor.getInstance(mContext).
- getSubscriptionInfoForSubId(mSubId);
+ SubscriptionInfo info = Dependency.get(KeyguardUpdateMonitor.class)
+ .getSubscriptionInfoForSubId(mSubId);
CharSequence displayName = info != null ? info.getDisplayName() : "";
msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName);
if (info != null) {
@@ -202,7 +203,7 @@
}
private void handleSubInfoChangeIfNeeded() {
- KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
+ KeyguardUpdateMonitor monitor = Dependency.get(KeyguardUpdateMonitor.class);
int subId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED);
if (subId != mSubId && SubscriptionManager.isValidSubscriptionId(subId)) {
mSubId = subId;
@@ -271,14 +272,14 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mUpdateMonitorCallback);
resetState();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).removeCallback(mUpdateMonitorCallback);
}
@Override
@@ -408,7 +409,7 @@
resetPasswordText(true /* animate */,
result != PhoneConstants.PIN_RESULT_SUCCESS /* announce */);
if (result == PhoneConstants.PIN_RESULT_SUCCESS) {
- KeyguardUpdateMonitor.getInstance(getContext())
+ Dependency.get(KeyguardUpdateMonitor.class)
.reportSimUnlocked(mSubId);
mRemainingAttempts = -1;
mShowDefaultMessage = true;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index 37e89c0..0cbe43b 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -198,7 +198,7 @@
mKeyguardSlice.setContentChangeListener(this::onSliceContentChanged);
onSliceContentChanged();
- boolean shouldMarquee = KeyguardUpdateMonitor.getInstance(mContext).isDeviceInteractive();
+ boolean shouldMarquee = Dependency.get(KeyguardUpdateMonitor.class).isDeviceInteractive();
setEnableMarquee(shouldMarquee);
refreshFormat();
updateOwnerInfo();
@@ -314,14 +314,14 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mInfoCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mInfoCallback);
Dependency.get(ConfigurationController.class).addCallback(this);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mInfoCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).removeCallback(mInfoCallback);
Dependency.get(ConfigurationController.class).removeCallback(this);
}
@@ -441,7 +441,7 @@
}
private boolean shouldShowLogout() {
- return KeyguardUpdateMonitor.getInstance(mContext).isLogoutEnabled()
+ return Dependency.get(KeyguardUpdateMonitor.class).isLogoutEnabled()
&& KeyguardUpdateMonitor.getCurrentUser() != UserHandle.USER_SYSTEM;
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index aa1d8b4..81a6576 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -39,13 +39,13 @@
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
import static com.android.systemui.DejankUtils.whitelistIpcs;
+import static com.android.systemui.Dependency.MAIN_LOOPER_NAME;
import android.annotation.AnyThread;
import android.annotation.MainThread;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.app.AlarmManager;
-import android.app.Instrumentation;
import android.app.PendingIntent;
import android.app.UserSwitchObserver;
import android.app.admin.DevicePolicyManager;
@@ -96,7 +96,6 @@
import com.android.internal.telephony.IccCardConstants.State;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.util.Preconditions;
import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.WirelessUtils;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -115,6 +114,9 @@
import java.util.TimeZone;
import java.util.function.Consumer;
+import javax.inject.Inject;
+import javax.inject.Named;
+
/**
* Watches for updates that may be interesting to the keyguard, and provides
* the up to date information as well as a registration for callbacks that care
@@ -292,119 +294,7 @@
}
};
- private final Handler mHandler = new Handler(Looper.getMainLooper()) {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_TIME_UPDATE:
- handleTimeUpdate();
- break;
- case MSG_TIMEZONE_UPDATE:
- handleTimeZoneUpdate((String) msg.obj);
- break;
- case MSG_BATTERY_UPDATE:
- handleBatteryUpdate((BatteryStatus) msg.obj);
- break;
- case MSG_SIM_STATE_CHANGE:
- handleSimStateChange(msg.arg1, msg.arg2, (State) msg.obj);
- break;
- case MSG_RINGER_MODE_CHANGED:
- handleRingerModeChange(msg.arg1);
- break;
- case MSG_PHONE_STATE_CHANGED:
- handlePhoneStateChanged((String) msg.obj);
- break;
- case MSG_DEVICE_PROVISIONED:
- handleDeviceProvisioned();
- break;
- case MSG_DPM_STATE_CHANGED:
- handleDevicePolicyManagerStateChanged();
- break;
- case MSG_USER_SWITCHING:
- handleUserSwitching(msg.arg1, (IRemoteCallback) msg.obj);
- break;
- case MSG_USER_SWITCH_COMPLETE:
- handleUserSwitchComplete(msg.arg1);
- break;
- case MSG_KEYGUARD_RESET:
- handleKeyguardReset();
- break;
- case MSG_KEYGUARD_BOUNCER_CHANGED:
- handleKeyguardBouncerChanged(msg.arg1);
- break;
- case MSG_BOOT_COMPLETED:
- handleBootCompleted();
- break;
- case MSG_USER_INFO_CHANGED:
- handleUserInfoChanged(msg.arg1);
- break;
- case MSG_REPORT_EMERGENCY_CALL_ACTION:
- handleReportEmergencyCallAction();
- break;
- case MSG_STARTED_GOING_TO_SLEEP:
- handleStartedGoingToSleep(msg.arg1);
- break;
- case MSG_FINISHED_GOING_TO_SLEEP:
- handleFinishedGoingToSleep(msg.arg1);
- break;
- case MSG_STARTED_WAKING_UP:
- Trace.beginSection("KeyguardUpdateMonitor#handler MSG_STARTED_WAKING_UP");
- handleStartedWakingUp();
- Trace.endSection();
- break;
- case MSG_FACE_UNLOCK_STATE_CHANGED:
- Trace.beginSection(
- "KeyguardUpdateMonitor#handler MSG_FACE_UNLOCK_STATE_CHANGED");
- handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2);
- Trace.endSection();
- break;
- case MSG_SIM_SUBSCRIPTION_INFO_CHANGED:
- handleSimSubscriptionInfoChanged();
- break;
- case MSG_AIRPLANE_MODE_CHANGED:
- handleAirplaneModeChanged();
- break;
- case MSG_SERVICE_STATE_CHANGE:
- handleServiceStateChange(msg.arg1, (ServiceState) msg.obj);
- break;
- case MSG_SCREEN_TURNED_ON:
- handleScreenTurnedOn();
- break;
- case MSG_SCREEN_TURNED_OFF:
- Trace.beginSection("KeyguardUpdateMonitor#handler MSG_SCREEN_TURNED_ON");
- handleScreenTurnedOff();
- Trace.endSection();
- break;
- case MSG_DREAMING_STATE_CHANGED:
- handleDreamingStateChanged(msg.arg1);
- break;
- case MSG_USER_UNLOCKED:
- handleUserUnlocked(msg.arg1);
- break;
- case MSG_USER_STOPPED:
- handleUserStopped(msg.arg1);
- break;
- case MSG_USER_REMOVED:
- handleUserRemoved(msg.arg1);
- break;
- case MSG_ASSISTANT_STACK_CHANGED:
- setAssistantVisible((boolean) msg.obj);
- break;
- case MSG_BIOMETRIC_AUTHENTICATION_CONTINUE:
- updateBiometricListeningState();
- break;
- case MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED:
- updateLogoutEnabled();
- break;
- case MSG_TELEPHONY_CAPABLE:
- updateTelephonyCapable((boolean) msg.obj);
- break;
- default:
- super.handleMessage(msg);
- break;
- }
- }
- };
+ private final Handler mHandler;
private SparseBooleanArray mFaceSettingEnabledForUser = new SparseBooleanArray();
private BiometricManager mBiometricManager;
@@ -446,7 +336,6 @@
private static int sCurrentUser;
private Runnable mUpdateBiometricListeningState = this::updateBiometricListeningState;
- private static boolean sDisableHandlerCheckForTesting;
public synchronized static void setCurrentUser(int currentUser) {
sCurrentUser = currentUser;
@@ -1486,13 +1375,6 @@
}
}
- public static KeyguardUpdateMonitor getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new KeyguardUpdateMonitor(context);
- }
- return sInstance;
- }
-
protected void handleStartedWakingUp() {
Trace.beginSection("KeyguardUpdateMonitor#handleStartedWakingUp");
checkIsHandlerThread();
@@ -1599,12 +1481,127 @@
}
@VisibleForTesting
- protected KeyguardUpdateMonitor(Context context) {
+ @Inject
+ protected KeyguardUpdateMonitor(Context context, @Named(MAIN_LOOPER_NAME) Looper mainLooper) {
mContext = context;
mSubscriptionManager = SubscriptionManager.from(context);
mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
mStrongAuthTracker = new StrongAuthTracker(context, this::notifyStrongAuthStateChanged);
+ mHandler = new Handler(mainLooper) {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_TIME_UPDATE:
+ handleTimeUpdate();
+ break;
+ case MSG_TIMEZONE_UPDATE:
+ handleTimeZoneUpdate((String) msg.obj);
+ break;
+ case MSG_BATTERY_UPDATE:
+ handleBatteryUpdate((BatteryStatus) msg.obj);
+ break;
+ case MSG_SIM_STATE_CHANGE:
+ handleSimStateChange(msg.arg1, msg.arg2, (State) msg.obj);
+ break;
+ case MSG_RINGER_MODE_CHANGED:
+ handleRingerModeChange(msg.arg1);
+ break;
+ case MSG_PHONE_STATE_CHANGED:
+ handlePhoneStateChanged((String) msg.obj);
+ break;
+ case MSG_DEVICE_PROVISIONED:
+ handleDeviceProvisioned();
+ break;
+ case MSG_DPM_STATE_CHANGED:
+ handleDevicePolicyManagerStateChanged();
+ break;
+ case MSG_USER_SWITCHING:
+ handleUserSwitching(msg.arg1, (IRemoteCallback) msg.obj);
+ break;
+ case MSG_USER_SWITCH_COMPLETE:
+ handleUserSwitchComplete(msg.arg1);
+ break;
+ case MSG_KEYGUARD_RESET:
+ handleKeyguardReset();
+ break;
+ case MSG_KEYGUARD_BOUNCER_CHANGED:
+ handleKeyguardBouncerChanged(msg.arg1);
+ break;
+ case MSG_BOOT_COMPLETED:
+ handleBootCompleted();
+ break;
+ case MSG_USER_INFO_CHANGED:
+ handleUserInfoChanged(msg.arg1);
+ break;
+ case MSG_REPORT_EMERGENCY_CALL_ACTION:
+ handleReportEmergencyCallAction();
+ break;
+ case MSG_STARTED_GOING_TO_SLEEP:
+ handleStartedGoingToSleep(msg.arg1);
+ break;
+ case MSG_FINISHED_GOING_TO_SLEEP:
+ handleFinishedGoingToSleep(msg.arg1);
+ break;
+ case MSG_STARTED_WAKING_UP:
+ Trace.beginSection("KeyguardUpdateMonitor#handler MSG_STARTED_WAKING_UP");
+ handleStartedWakingUp();
+ Trace.endSection();
+ break;
+ case MSG_FACE_UNLOCK_STATE_CHANGED:
+ Trace.beginSection(
+ "KeyguardUpdateMonitor#handler MSG_FACE_UNLOCK_STATE_CHANGED");
+ handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2);
+ Trace.endSection();
+ break;
+ case MSG_SIM_SUBSCRIPTION_INFO_CHANGED:
+ handleSimSubscriptionInfoChanged();
+ break;
+ case MSG_AIRPLANE_MODE_CHANGED:
+ handleAirplaneModeChanged();
+ break;
+ case MSG_SERVICE_STATE_CHANGE:
+ handleServiceStateChange(msg.arg1, (ServiceState) msg.obj);
+ break;
+ case MSG_SCREEN_TURNED_ON:
+ handleScreenTurnedOn();
+ break;
+ case MSG_SCREEN_TURNED_OFF:
+ Trace.beginSection("KeyguardUpdateMonitor#handler MSG_SCREEN_TURNED_ON");
+ handleScreenTurnedOff();
+ Trace.endSection();
+ break;
+ case MSG_DREAMING_STATE_CHANGED:
+ handleDreamingStateChanged(msg.arg1);
+ break;
+ case MSG_USER_UNLOCKED:
+ handleUserUnlocked(msg.arg1);
+ break;
+ case MSG_USER_STOPPED:
+ handleUserStopped(msg.arg1);
+ break;
+ case MSG_USER_REMOVED:
+ handleUserRemoved(msg.arg1);
+ break;
+ case MSG_ASSISTANT_STACK_CHANGED:
+ setAssistantVisible((boolean) msg.obj);
+ break;
+ case MSG_BIOMETRIC_AUTHENTICATION_CONTINUE:
+ updateBiometricListeningState();
+ break;
+ case MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED:
+ updateLogoutEnabled();
+ break;
+ case MSG_TELEPHONY_CAPABLE:
+ updateTelephonyCapable((boolean) msg.obj);
+ break;
+ default:
+ super.handleMessage(msg);
+ break;
+ }
+ }
+ };
+
// Since device can't be un-provisioned, we only need to register a content observer
// to update mDeviceProvisioned when we are...
if (!mDeviceProvisioned) {
@@ -2752,35 +2749,12 @@
}
private void checkIsHandlerThread() {
- if (sDisableHandlerCheckForTesting) {
- return;
- }
if (!mHandler.getLooper().isCurrentThread()) {
Log.wtf(TAG, "must call on mHandler's thread "
+ mHandler.getLooper().getThread() + ", not " + Thread.currentThread());
}
}
- /**
- * Turn off the handler check for testing.
- *
- * This is necessary because currently tests are not too careful about which thread they call
- * into this class on.
- *
- * Note that this must be called before scheduling any work involving KeyguardUpdateMonitor
- * instances.
- *
- * TODO: fix the tests and remove this.
- */
- @VisibleForTesting
- public static void disableHandlerCheckForTesting(Instrumentation instrumentation) {
- Preconditions.checkNotNull(instrumentation, "Must only call this method in tests!");
- // Don't need synchronization here *if* the callers follow the contract and call this only
- // before scheduling work for KeyguardUpdateMonitor on other threads, because the scheduling
- // of that work forces a happens-before relationship.
- sDisableHandlerCheckForTesting = true;
- }
-
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("KeyguardUpdateMonitor state:");
pw.println(" SIM States:");
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index f9452e2..d8f039c 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -30,6 +30,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.Preconditions;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.clock.ClockManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.appops.AppOpsController;
@@ -145,6 +146,11 @@
private static final String TAG = "Dependency";
/**
+ * Key for getting a the main looper.
+ */
+ public static final String MAIN_LOOPER_NAME = "main_looper";
+
+ /**
* Key for getting a background Looper for background work.
*/
public static final String BG_LOOPER_NAME = "background_looper";
@@ -177,6 +183,10 @@
*/
public static final DependencyKey<Looper> BG_LOOPER = new DependencyKey<>(BG_LOOPER_NAME);
/**
+ * Key for getting a mainer Looper.
+ */
+ public static final DependencyKey<Looper> MAIN_LOOPER = new DependencyKey<>(MAIN_LOOPER_NAME);
+ /**
* Key for getting a background Handler for background work.
*/
public static final DependencyKey<Handler> BG_HANDLER = new DependencyKey<>(BG_HANDLER_NAME);
@@ -215,6 +225,7 @@
@Inject Lazy<UserSwitcherController> mUserSwitcherController;
@Inject Lazy<UserInfoController> mUserInfoController;
@Inject Lazy<KeyguardMonitor> mKeyguardMonitor;
+ @Inject Lazy<KeyguardUpdateMonitor> mKeyguardUpdateMonitor;
@Inject Lazy<BatteryController> mBatteryController;
@Inject Lazy<NightDisplayListener> mNightDisplayListener;
@Inject Lazy<ManagedProfileController> mManagedProfileController;
@@ -291,6 +302,7 @@
@Inject Lazy<PrivacyItemController> mPrivacyItemController;
@Inject @Named(BG_LOOPER_NAME) Lazy<Looper> mBgLooper;
@Inject @Named(BG_HANDLER_NAME) Lazy<Handler> mBgHandler;
+ @Inject @Named(MAIN_LOOPER_NAME) Lazy<Looper> mMainLooper;
@Inject @Named(MAIN_HANDLER_NAME) Lazy<Handler> mMainHandler;
@Inject @Named(TIME_TICK_HANDLER_NAME) Lazy<Handler> mTimeTickHandler;
@Nullable
@@ -318,6 +330,7 @@
mProviders.put(TIME_TICK_HANDLER, mTimeTickHandler::get);
mProviders.put(BG_LOOPER, mBgLooper::get);
mProviders.put(BG_HANDLER, mBgHandler::get);
+ mProviders.put(MAIN_LOOPER, mMainLooper::get);
mProviders.put(MAIN_HANDLER, mMainHandler::get);
mProviders.put(ActivityStarter.class, mActivityStarter::get);
mProviders.put(ActivityStarterDelegate.class, mActivityStarterDelegate::get);
@@ -344,6 +357,8 @@
mProviders.put(KeyguardMonitor.class, mKeyguardMonitor::get);
+ mProviders.put(KeyguardUpdateMonitor.class, mKeyguardUpdateMonitor::get);
+
mProviders.put(UserSwitcherController.class, mUserSwitcherController::get);
mProviders.put(UserInfoController.class, mUserInfoController::get);
diff --git a/packages/SystemUI/src/com/android/systemui/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/DependencyProvider.java
index 3e2010e..d46a86c 100644
--- a/packages/SystemUI/src/com/android/systemui/DependencyProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/DependencyProvider.java
@@ -19,6 +19,7 @@
import static com.android.systemui.Dependency.BG_HANDLER_NAME;
import static com.android.systemui.Dependency.BG_LOOPER_NAME;
import static com.android.systemui.Dependency.MAIN_HANDLER_NAME;
+import static com.android.systemui.Dependency.MAIN_LOOPER_NAME;
import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
import android.annotation.Nullable;
@@ -87,6 +88,14 @@
return thread.getLooper();
}
+ /** Main Looper */
+ @Singleton
+ @Provides
+ @Named(MAIN_LOOPER_NAME)
+ public Looper provideMainLooper() {
+ return Looper.getMainLooper();
+ }
+
@Singleton
@Provides
@Named(BG_HANDLER_NAME)
@@ -97,8 +106,8 @@
@Singleton
@Provides
@Named(MAIN_HANDLER_NAME)
- public Handler provideMainHandler() {
- return new Handler(Looper.getMainLooper());
+ public Handler provideMainHandler(@Named(MAIN_LOOPER_NAME) Looper mainLooper) {
+ return new Handler(mainLooper);
}
@Singleton
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java
index 6a59fa1..0f99674 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIAppComponentFactory.java
@@ -51,8 +51,8 @@
@NonNull ClassLoader cl, @NonNull String className)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Application app = super.instantiateApplicationCompat(cl, className);
- if (app instanceof ContextProvider) {
- ((ContextProvider) app).setContextAvailableCallback(
+ if (app instanceof ContextInitializer) {
+ ((ContextInitializer) app).setContextAvailableCallback(
context -> {
SystemUIFactory.createFromConfig(context);
SystemUIFactory.getInstance().getRootComponent().inject(
@@ -71,8 +71,8 @@
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
ContentProvider contentProvider = super.instantiateProviderCompat(cl, className);
- if (contentProvider instanceof ContextProvider) {
- ((ContextProvider) contentProvider).setContextAvailableCallback(
+ if (contentProvider instanceof ContextInitializer) {
+ ((ContextInitializer) contentProvider).setContextAvailableCallback(
context -> {
SystemUIFactory.createFromConfig(context);
SystemUIFactory.getInstance().getRootComponent().inject(
@@ -96,11 +96,17 @@
return super.instantiateServiceCompat(cl, className, intent);
}
- interface ContextAvailableCallback {
+ /**
+ * A callback that receives a Context when one is ready.
+ */
+ public interface ContextAvailableCallback {
void onContextAvailable(Context context);
}
- interface ContextProvider {
+ /**
+ * Implemented in classes that get started by the system before a context is available.
+ */
+ public interface ContextInitializer {
void setContextAvailableCallback(ContextAvailableCallback callback);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index aafc67e..351ca42 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -49,7 +49,7 @@
* Application class for SystemUI.
*/
public class SystemUIApplication extends Application implements SysUiServiceProvider,
- SystemUIAppComponentFactory.ContextProvider {
+ SystemUIAppComponentFactory.ContextInitializer {
public static final String TAG = "SystemUIService";
private static final boolean DEBUG = false;
@@ -182,7 +182,7 @@
o = ((SystemUI.Injector) o).apply(this);
}
mServices[i] = (SystemUI) o;
- } catch(ClassNotFoundException ex){
+ } catch (ClassNotFoundException ex) {
throw new RuntimeException(ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException(ex);
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 45142b0..0e5bdaf 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -136,7 +136,7 @@
return new KeyguardBouncer(context, callback, lockPatternUtils, container,
dismissCallbackRegistry, falsingManager,
expansionCallback, UnlockMethodCache.getInstance(context),
- KeyguardUpdateMonitor.getInstance(context), bypassController,
+ Dependency.get(KeyguardUpdateMonitor.class), bypassController,
new Handler(Looper.getMainLooper()));
}
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/SystemUIModule.java
index 5d103eb..3395014 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIModule.java
@@ -46,7 +46,7 @@
if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
return null;
}
- return new KeyguardLiftController(context, statusBarStateController, asyncSensorManager);
+ return new KeyguardLiftController(statusBarStateController, asyncSensorManager);
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java
index fba0d50..c2b0fe4 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java
@@ -154,7 +154,7 @@
updateConfiguration();
Dependency.get(StatusBarStateController.class).addCallback(mStatusBarStateListener);
- KeyguardUpdateMonitor.getInstance(context).registerCallback(mKeyguardUpdateCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mKeyguardUpdateCallback);
}
private void updateConfiguration() {
@@ -556,7 +556,7 @@
mSensorManager.unregisterListener(mSensorEventListener);
mContext.getContentResolver().unregisterContentObserver(mSettingsObserver);
Dependency.get(StatusBarStateController.class).removeCallback(mStatusBarStateListener);
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mKeyguardUpdateCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).removeCallback(mKeyguardUpdateCallback);
}
public Uri reportRejectedTouch() {
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
index efac147..c9f5b79 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
@@ -114,7 +114,7 @@
mInternalFalsingManager = new BrightLineFalsingManager(
new FalsingDataProvider(context.getResources().getDisplayMetrics()),
Dependency.get(AsyncSensorManager.class),
- KeyguardUpdateMonitor.getInstance(context),
+ Dependency.get(KeyguardUpdateMonitor.class),
mDeviceConfig
);
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java b/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java
index e5a54b8..abd41d4 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java
@@ -19,6 +19,7 @@
import android.content.Context;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.Dependency;
/**
* Controls removing Keyguard authorization when the phone goes to sleep.
@@ -28,7 +29,7 @@
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
public DozeAuthRemover(Context context) {
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index 86d4a48..c367286 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -29,8 +29,8 @@
import com.android.systemui.R;
import com.android.systemui.SystemUIApplication;
import com.android.systemui.dock.DockManager;
-import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AsyncSensorManager;
@@ -104,7 +104,7 @@
DozeMachine machine, Handler handler, AlarmManager alarmManager,
DozeParameters params) {
return new DozeUi(context, alarmManager, machine, wakeLock, host, handler, params,
- KeyguardUpdateMonitor.getInstance(context));
+ Dependency.get(KeyguardUpdateMonitor.class));
}
public static DozeHost getHost(DozeService service) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index c09e284..8fe9f92 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -23,6 +23,7 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
+import com.android.systemui.Dependency;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
@@ -112,7 +113,7 @@
}
log("init");
if (sRegisterKeyguardCallback) {
- KeyguardUpdateMonitor.getInstance(context).registerCallback(sKeyguardCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(sKeyguardCallback);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
index 1f3403b..6f8665a 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
@@ -82,7 +82,7 @@
mGlobalActions.showDialog(mKeyguardMonitor.isShowing(),
mDeviceProvisionedController.isDeviceProvisioned(),
mPanelExtension.get());
- KeyguardUpdateMonitor.getInstance(mContext).requestFaceAuth();
+ Dependency.get(KeyguardUpdateMonitor.class).requestFaceAuth();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
index 48f32cf..abfcbc1 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
@@ -49,7 +49,9 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
+import com.android.systemui.Dependency;
import com.android.systemui.R;
+import com.android.systemui.SystemUIAppComponentFactory;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.StatusBarState;
@@ -72,7 +74,8 @@
*/
public class KeyguardSliceProvider extends SliceProvider implements
NextAlarmController.NextAlarmChangeCallback, ZenModeController.Callback,
- NotificationMediaManager.MediaListener, StatusBarStateController.StateListener {
+ NotificationMediaManager.MediaListener, StatusBarStateController.StateListener,
+ SystemUIAppComponentFactory.ContextInitializer {
private static final StyleSpan BOLD_STYLE = new StyleSpan(Typeface.BOLD);
public static final String KEYGUARD_SLICE_URI = "content://com.android.systemui.keyguard/main";
@@ -93,6 +96,7 @@
@VisibleForTesting
static final int ALARM_VISIBILITY_HOURS = 12;
+ private static final Object sInstanceLock = new Object();
private static KeyguardSliceProvider sInstance;
protected final Uri mSliceUri;
@@ -130,6 +134,7 @@
protected boolean mDozing;
private int mStatusBarState;
private boolean mMediaIsVisible;
+ private SystemUIAppComponentFactory.ContextAvailableCallback mContextAvailableCallback;
/**
* Receiver responsible for time ticking and updating the date format.
@@ -310,7 +315,11 @@
@Override
public boolean onCreateSliceProvider() {
- synchronized (this) {
+ if (mContextAvailableCallback != null) {
+ mContextAvailableCallback.onContextAvailable(getContext());
+ Dependency.initDependencies(getContext());
+ }
+ synchronized (KeyguardSliceProvider.sInstanceLock) {
KeyguardSliceProvider oldInstance = KeyguardSliceProvider.sInstance;
if (oldInstance != null) {
oldInstance.onDestroy();
@@ -335,7 +344,7 @@
@VisibleForTesting
protected void onDestroy() {
- synchronized (this) {
+ synchronized (KeyguardSliceProvider.sInstanceLock) {
mNextAlarmController.removeCallback(this);
mZenModeController.removeCallback(this);
mMediaWakeLock.setAcquired(false);
@@ -345,6 +354,7 @@
getKeyguardUpdateMonitor().removeCallback(mKeyguardUpdateMonitorCallback);
getContext().unregisterReceiver(mIntentReceiver);
}
+ KeyguardSliceProvider.sInstance = null;
}
}
@@ -449,9 +459,8 @@
updateNextAlarm();
}
- @VisibleForTesting
- protected KeyguardUpdateMonitor getKeyguardUpdateMonitor() {
- return KeyguardUpdateMonitor.getInstance(getContext());
+ private KeyguardUpdateMonitor getKeyguardUpdateMonitor() {
+ return Dependency.get(KeyguardUpdateMonitor.class);
}
/**
@@ -530,4 +539,10 @@
notifyChange();
}
}
+
+ @Override
+ public void setContextAvailableCallback(
+ SystemUIAppComponentFactory.ContextAvailableCallback callback) {
+ mContextAvailableCallback = callback;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 4016b59..dc026e7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -710,7 +710,7 @@
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
- mUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mLockPatternUtils = new LockPatternUtils(mContext);
KeyguardUpdateMonitor.setCurrentUser(ActivityManager.getCurrentUser());
@@ -846,7 +846,7 @@
playSounds(true);
}
}
- KeyguardUpdateMonitor.getInstance(mContext).dispatchStartedGoingToSleep(why);
+ mUpdateMonitor.dispatchStartedGoingToSleep(why);
notifyStartedGoingToSleep();
}
@@ -891,7 +891,7 @@
}
}
- KeyguardUpdateMonitor.getInstance(mContext).dispatchFinishedGoingToSleep(why);
+ mUpdateMonitor.dispatchFinishedGoingToSleep(why);
}
private long getLockTimeout(int userId) {
@@ -1004,7 +1004,7 @@
if (DEBUG) Log.d(TAG, "onStartedWakingUp, seq = " + mDelayedShowingSequence);
notifyStartedWakingUp();
}
- KeyguardUpdateMonitor.getInstance(mContext).dispatchStartedWakingUp();
+ mUpdateMonitor.dispatchStartedWakingUp();
maybeSendUserPresentBroadcast();
Trace.endSection();
}
@@ -1047,7 +1047,7 @@
* if there is a secure lock pattern.
*/
public void onDreamingStarted() {
- KeyguardUpdateMonitor.getInstance(mContext).dispatchDreamingStarted();
+ mUpdateMonitor.dispatchDreamingStarted();
synchronized (this) {
if (mDeviceInteractive
&& mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser())) {
@@ -1060,7 +1060,7 @@
* A dream stopped.
*/
public void onDreamingStopped() {
- KeyguardUpdateMonitor.getInstance(mContext).dispatchDreamingStopped();
+ mUpdateMonitor.dispatchDreamingStopped();
synchronized (this) {
if (mDeviceInteractive) {
cancelDoKeyguardLaterLocked();
@@ -1456,11 +1456,11 @@
public boolean isSecure(int userId) {
return mLockPatternUtils.isSecure(userId)
- || KeyguardUpdateMonitor.getInstance(mContext).isSimPinSecure();
+ || mUpdateMonitor.isSimPinSecure();
}
public void setSwitchingUser(boolean switching) {
- KeyguardUpdateMonitor.getInstance(mContext).setSwitchingUser(switching);
+ mUpdateMonitor.setSwitchingUser(switching);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 9178fda..6556ed0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -142,7 +142,7 @@
Dependency.get(AccessibilityController.class),
UnlockMethodCache.getInstance(context),
Dependency.get(StatusBarStateController.class),
- KeyguardUpdateMonitor.getInstance(context));
+ Dependency.get(KeyguardUpdateMonitor.class));
}
/**
@@ -649,7 +649,7 @@
@Override
public void onBiometricHelp(int msgId, String helpString,
BiometricSourceType biometricSourceType) {
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
if (!updateMonitor.isUnlockingWithBiometricAllowed()) {
return;
}
@@ -674,7 +674,7 @@
@Override
public void onBiometricError(int msgId, String errString,
BiometricSourceType biometricSourceType) {
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
if (shouldSuppressBiometricError(msgId, biometricSourceType, updateMonitor)) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
index 107b24c..289277e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManagerImpl.java
@@ -281,7 +281,7 @@
if (userId == UserHandle.USER_ALL) {
userId = mCurrentUserId;
}
- return KeyguardUpdateMonitor.getInstance(mContext).isUserInLockdown(userId);
+ return Dependency.get(KeyguardUpdateMonitor.class).isUserInLockdown(userId);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java b/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java
index 2a5ccdb..843c37f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java
@@ -70,7 +70,7 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mKeyguardUpdateMonitor.registerCallback(mCallback);
Dependency.get(DarkIconDispatcher.class).addDarkReceiver(this);
Dependency.get(NetworkController.class).addCallback(this);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index ab9162a..b6f82a1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -278,7 +278,7 @@
filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
getContext().registerReceiverAsUser(mDevicePolicyReceiver,
UserHandle.ALL, filter, null, null);
- KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mUpdateMonitorCallback);
mUnlockMethodCache.addListener(this);
}
@@ -290,7 +290,7 @@
mRightExtension.destroy();
mLeftExtension.destroy();
getContext().unregisterReceiver(mDevicePolicyReceiver);
- KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateMonitorCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).removeCallback(mUpdateMonitorCallback);
}
private void initAccessibility() {
@@ -817,7 +817,7 @@
@Override
public Intent getIntent() {
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
boolean canSkipBouncer = updateMonitor.getUserCanSkipBouncer(
KeyguardUpdateMonitor.getCurrentUser());
boolean secure = mUnlockMethodCache.isMethodSecure();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
index f4635d1..f7bb97b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt
@@ -16,23 +16,22 @@
package com.android.systemui.statusbar.phone
-import android.content.Context
import android.hardware.Sensor
import android.hardware.TriggerEvent
import android.hardware.TriggerEventListener
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
+import com.android.systemui.Dependency
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.util.Assert
import com.android.systemui.util.AsyncSensorManager
class KeyguardLiftController constructor(
- context: Context,
private val statusBarStateController: StatusBarStateController,
private val asyncSensorManager: AsyncSensorManager
) : StatusBarStateController.StateListener, KeyguardUpdateMonitorCallback() {
- private val keyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context)
+ private val keyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor::class.java)
private val pickupSensor = asyncSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE)
private var isListening = false
private var bouncerVisible = false
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index ecfc45b..62d855d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -42,6 +42,7 @@
import com.android.internal.telephony.IccCardConstants;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
+import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.dock.DockManager;
@@ -182,7 +183,7 @@
super(context, attrs);
mContext = context;
mUnlockMethodCache = UnlockMethodCache.getInstance(context);
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mAccessibilityController = accessibilityController;
mConfigurationController = configurationController;
mStatusBarStateController = statusBarStateController;
@@ -509,7 +510,7 @@
}
private int getState() {
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
if ((mUnlockMethodCache.canSkipBouncer() || !mKeyguardShowing
|| mKeyguardMonitor.isKeyguardGoingAway()) && !mSimLocked) {
return STATE_LOCK_OPEN;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
index dcb349b..e34c639 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
@@ -75,7 +75,7 @@
mH = h;
mWallpaperManager = (WallpaperManager) ctx.getSystemService(Context.WALLPAPER_SERVICE);
mCurrentUserId = ActivityManager.getCurrentUser();
- mUpdateMonitor = KeyguardUpdateMonitor.getInstance(ctx);
+ mUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
IWallpaperManager service = IWallpaperManager.Stub.asInterface(
ServiceManager.getService(Context.WALLPAPER_SERVICE));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 248bc75..a58ba85 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -421,7 +421,7 @@
});
mThemeResId = context.getThemeResId();
mKeyguardBypassController = bypassController;
- mUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
dynamicPrivacyController.addListener(this);
mBottomAreaShadeAlphaAnimator = ValueAnimator.ofFloat(1f, 0);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 5733d4b..8c95b84 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -198,7 +198,7 @@
mContext = scrimBehind.getContext();
mUnlockMethodCache = UnlockMethodCache.getInstance(mContext);
mDarkenWhileDragging = !mUnlockMethodCache.canSkipBouncer();
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mKeyguardVisibilityCallback = new KeyguardVisibilityCallback();
mKeyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback);
mScrimBehindAlphaResValue = mContext.getResources().getFloat(R.dimen.scrim_behind_alpha);
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 1c85724..fe96ef7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -701,7 +701,7 @@
mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController);
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index ccb85fa..50c3561 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -193,7 +193,7 @@
mViewMediatorCallback = callback;
mLockPatternUtils = lockPatternUtils;
mStatusBarWindowController = Dependency.get(StatusBarWindowController.class);
- KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateMonitorCallback);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mUpdateMonitorCallback);
mStatusBarStateController.addCallback(this);
Dependency.get(ConfigurationController.class).addCallback(this);
mGesturalNav = QuickStepContract.isGesturalMode(
@@ -395,7 +395,7 @@
} else {
showBouncerOrKeyguard(hideBouncerWhenShowing);
}
- KeyguardUpdateMonitor.getInstance(mContext).sendKeyguardReset();
+ Dependency.get(KeyguardUpdateMonitor.class).sendKeyguardReset();
updateStates();
}
}
@@ -533,7 +533,7 @@
mShowing, mKeyguardMonitor.isSecure(), mKeyguardMonitor.isOccluded());
launchPendingWakeupAction();
- if (KeyguardUpdateMonitor.getInstance(mContext).needsSlowUnlockTransition()) {
+ if (Dependency.get(KeyguardUpdateMonitor.class).needsSlowUnlockTransition()) {
fadeoutDuration = KEYGUARD_DISMISS_DURATION_LOCKED;
}
long uptimeMillis = SystemClock.uptimeMillis();
@@ -785,7 +785,7 @@
updateLockIcon();
}
- KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ KeyguardUpdateMonitor updateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
if ((showing && !occluded) != (mLastShowing && !mLastOccluded) || mFirstUpdate) {
updateMonitor.onKeyguardVisibilityChanged(showing && !occluded);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index a870590..d8b2239 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -240,7 +240,7 @@
public void onDensityOrFontScaleChanged() {
MessagingMessage.dropCache();
MessagingGroup.dropCache();
- if (!KeyguardUpdateMonitor.getInstance(mContext).isSwitchingUser()) {
+ if (!Dependency.get(KeyguardUpdateMonitor.class).isSwitchingUser()) {
updateNotificationsOnDensityOrFontScaleChanged();
} else {
mReinflateNotificationsOnUserSwitched = true;
@@ -249,7 +249,7 @@
@Override
public void onUiModeChanged() {
- if (!KeyguardUpdateMonitor.getInstance(mContext).isSwitchingUser()) {
+ if (!Dependency.get(KeyguardUpdateMonitor.class).isSwitchingUser()) {
updateNotificationOnUiModeChanged();
} else {
mDispatchUiModeChangeOnUserSwitched = true;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
index 24ecd14..c76f93e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
@@ -28,6 +28,7 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.DejankUtils;
+import com.android.systemui.Dependency;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -57,8 +58,8 @@
private UnlockMethodCache(Context ctx) {
mLockPatternUtils = new LockPatternUtils(ctx);
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(ctx);
- KeyguardUpdateMonitor.getInstance(ctx).registerCallback(mCallback);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
+ Dependency.get(KeyguardUpdateMonitor.class).registerCallback(mCallback);
update(true /* updateAlways */);
if (Build.IS_DEBUGGABLE && DEBUG_AUTH_WITH_ADB) {
// Watch for interesting updates
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EmergencyCryptkeeperText.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EmergencyCryptkeeperText.java
index f2c0434..353d6a4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EmergencyCryptkeeperText.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EmergencyCryptkeeperText.java
@@ -32,6 +32,7 @@
import com.android.internal.telephony.TelephonyIntents;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
+import com.android.systemui.Dependency;
import java.util.List;
@@ -66,7 +67,7 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mKeyguardUpdateMonitor.registerCallback(mCallback);
getContext().registerReceiver(mReceiver,
new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
index 87ed14a..a950626 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
@@ -23,6 +23,7 @@
import com.android.internal.util.Preconditions;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
+import com.android.systemui.Dependency;
import com.android.systemui.settings.CurrentUserTracker;
import java.util.ArrayList;
@@ -61,7 +62,7 @@
@Inject
public KeyguardMonitorImpl(Context context) {
mContext = context;
- mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ mKeyguardUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class);
mUserTracker = new CurrentUserTracker(mContext) {
@Override
public void onUserSwitched(int newUserId) {
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
index 1ae1b97..21f6b67 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
@@ -111,6 +111,7 @@
mDependency.injectMockDependency(WakefulnessLifecycle.class);
mDependency.injectTestDependency(Dependency.MAIN_HANDLER,
new Handler(mTestableLooper.getLooper()));
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mCarrierTextCallbackInfo = new CarrierTextController.CarrierTextCallbackInfo("",
new CharSequence[]{}, false, new int[]{});
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java
index a69fd56..25f279b 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardHostViewTest.java
@@ -39,6 +39,7 @@
@Before
public void setup() {
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mKeyguardHostView = new KeyguardHostView(getContext());
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt
index 5f03bdb..22e10206 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewTest.kt
@@ -41,6 +41,7 @@
@Before
fun setup() {
val inflater = LayoutInflater.from(context)
+ mDependency.injectMockDependency(KeyguardUpdateMonitor::class.java)
mKeyguardPatternView = inflater.inflate(R.layout.keyguard_pattern_view, null)
as KeyguardPatternView
mSecurityMessage = KeyguardMessageArea(mContext, null,
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java
index eadb1b6..b2a4281 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinBasedInputViewTest.java
@@ -52,6 +52,7 @@
@Before
public void setup() {
LayoutInflater inflater = LayoutInflater.from(getContext());
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mKeyguardPinView =
(KeyguardPinBasedInputView) inflater.inflate(R.layout.keyguard_pin_view, null);
MockitoAnnotations.initMocks(this);
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPresentationTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPresentationTest.java
index 8138420..082782d 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPresentationTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPresentationTest.java
@@ -36,6 +36,7 @@
public class KeyguardPresentationTest extends SysuiTestCase {
@Test
public void testInflation_doesntCrash() {
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper();
InjectionInflationController inflationController = new InjectionInflationController(
SystemUIFactory.getInstance().getRootComponent());
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java
index 31ea39c..8da5306 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.java
@@ -50,6 +50,7 @@
@Before
public void setUp() {
Assert.sMainLooper = TestableLooper.get(this).getLooper();
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
InjectionInflationController inflationController = new InjectionInflationController(
SystemUIFactory.getInstance().getRootComponent());
LayoutInflater layoutInflater = inflationController
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
index fce79c3..ad7bba1 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java
@@ -51,7 +51,6 @@
import android.testing.AndroidTestingRunner;
import android.testing.TestableContext;
import android.testing.TestableLooper;
-import android.testing.TestableLooper.RunWithLooper;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.PhoneConstants;
@@ -72,12 +71,7 @@
@SmallTest
@RunWith(AndroidTestingRunner.class)
-// We must run on the main looper because KeyguardUpdateMonitor#mHandler is initialized with
-// new Handler(Looper.getMainLooper()).
-//
-// Using the main looper should be avoided whenever possible, please don't copy this over to
-// new tests.
-@RunWithLooper(setAsMainLooper = true)
+@TestableLooper.RunWithLooper
public class KeyguardUpdateMonitorTest extends SysuiTestCase {
private static final String TEST_CARRIER = "TEST_CARRIER";
private static final String TEST_CARRIER_2 = "TEST_CARRIER_2";
@@ -501,7 +495,7 @@
AtomicBoolean mSimStateChanged = new AtomicBoolean(false);
protected TestableKeyguardUpdateMonitor(Context context) {
- super(context);
+ super(context, TestableLooper.get(KeyguardUpdateMonitorTest.this).getLooper());
context.unregisterReceiver(mBroadcastReceiver);
context.unregisterReceiver(mBroadcastAllReceiver);
mStrongAuthTracker = KeyguardUpdateMonitorTest.this.mStrongAuthTracker;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
index e07d17f..a07f25a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java
@@ -29,6 +29,7 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.SmallTest;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.util.Assert;
@@ -48,6 +49,7 @@
@Before
public void setUp() throws Exception {
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
Assert.sMainLooper = TestableLooper.get(this).getLooper();
Context context = getContext();
mRow = new NotificationTestHelper(context).createRow();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
index e4f33e2..94ca9e9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
@@ -29,7 +29,8 @@
import androidx.test.InstrumentationRegistry;
-import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.classifier.FalsingManagerFake;
+import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.util.Assert;
import org.junit.After;
@@ -74,7 +75,9 @@
"SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext");
});
InstrumentationRegistry.registerInstance(inst, InstrumentationRegistry.getArguments());
- KeyguardUpdateMonitor.disableHandlerCheckForTesting(inst);
+ // A lot of tests get the FalsingManager, often via several layers of indirection.
+ // None of them actually need it.
+ mDependency.injectTestDependency(FalsingManager.class, new FalsingManagerFake());
}
@After
diff --git a/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java
index a583b1c..6db5ef9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java
@@ -37,6 +37,7 @@
import com.android.internal.app.AssistUtils;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
+import com.android.systemui.DumpController;
import com.android.systemui.ScreenDecorations;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -70,6 +71,7 @@
MockitoAnnotations.initMocks(this);
mDependency.injectMockDependency(StatusBarStateController.class);
mDependency.injectMockDependency(OverviewProxyService.class);
+ mDependency.injectMockDependency(DumpController.class);
doAnswer(answerVoid(Runnable::run)).when(mMockHandler).post(any(Runnable.class));
doAnswer(answerVoid(Runnable::run)).when(mMockHandler)
.postDelayed(any(Runnable.class), anyLong());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java
index 2073ae1..e1457ef 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java
@@ -28,6 +28,7 @@
import androidx.test.filters.SmallTest;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.brightline.BrightLineFalsingManager;
import com.android.systemui.shared.plugins.PluginManager;
@@ -55,6 +56,7 @@
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mTestableLooper = TestableLooper.get(this);
mHandler = new Handler(mTestableLooper.getLooper());
mDeviceConfig = new DeviceConfigProxyFake();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
index 9576cb2..c9b6790 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java
@@ -54,6 +54,7 @@
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.util.wakelock.SettableWakeLock;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -85,15 +86,15 @@
@Mock
private SettableWakeLock mMediaWakeLock;
@Mock
- private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
- @Mock
private DozeParameters mDozeParameters;
+ private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private TestableKeyguardSliceProvider mProvider;
private boolean mIsZenMode;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
+ mKeyguardUpdateMonitor = mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mIsZenMode = false;
mProvider = new TestableKeyguardSliceProvider();
mProvider.attachInfo(getContext(), null);
@@ -102,6 +103,11 @@
SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST)));
}
+ @After
+ public void tearDown() {
+ mProvider.onDestroy();
+ }
+
@Test
public void registersClockUpdate() {
Assert.assertTrue("registerClockUpdate should have been called during initialization.",
@@ -269,11 +275,6 @@
}
@Override
- public KeyguardUpdateMonitor getKeyguardUpdateMonitor() {
- return mKeyguardUpdateMonitor;
- }
-
- @Override
protected String getFormattedDateLocked() {
return super.getFormattedDateLocked() + mCounter++;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
index 690133a..a0a410d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java
@@ -24,6 +24,7 @@
import androidx.test.filters.SmallTest;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dependency;
import com.android.systemui.InitController;
import com.android.systemui.SysuiTestCase;
@@ -66,6 +67,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mDependency.injectTestDependency(Dependency.MAIN_HANDLER,
new Handler(TestableLooper.get(this).getLooper()));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
index cd60e47..c51263f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java
@@ -95,6 +95,7 @@
public void setup() {
com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper();
MockitoAnnotations.initMocks(this);
+ mDependency.injectTestDependency(KeyguardUpdateMonitor.class, mKeyguardUpdateMonitor);
DejankUtils.setImmediate(true);
final ViewGroup container = new FrameLayout(getContext());
when(mKeyguardHostView.getViewTreeObserver()).thenReturn(mViewTreeObserver);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index c5d4019..2623b46 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -45,6 +45,7 @@
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.util.function.TriConsumer;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
@@ -91,6 +92,7 @@
mAlwaysOnEnabled = true;
mDozeParamenters = mock(DozeParameters.class);
mLooper = TestableLooper.get(this);
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
when(mDozeParamenters.getAlwaysOn()).thenAnswer(invocation -> mAlwaysOnEnabled);
when(mDozeParamenters.getDisplayNeedsBlanking()).thenReturn(true);
mScrimController = new SynchronousScrimController(mScrimBehind, mScrimInFront,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
index 63f653b..3c445c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java
@@ -37,6 +37,7 @@
import androidx.test.filters.SmallTest;
import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.classifier.FalsingManagerFake;
@@ -87,6 +88,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mDependency.injectMockDependency(StatusBarWindowController.class);
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
when(mLockIconContainer.getParent()).thenReturn(mock(ViewGroup.class));
when(mLockIconContainer.animate()).thenReturn(mock(ViewPropertyAnimator.class,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
index b59bac1..8e3e2db 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
@@ -48,6 +48,7 @@
import androidx.test.filters.SmallTest;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ActivityStarter;
@@ -112,6 +113,7 @@
mDependency.get(KeyguardDismissUtil.class).setDismissHandler((action, unused) -> {
action.onDismiss();
});
+ mDependency.injectMockDependency(KeyguardUpdateMonitor.class);
mDependency.injectMockDependency(ShadeController.class);
mDependency.injectTestDependency(ActivityStarter.class, mActivityStarter);
mDependency.injectTestDependency(SmartReplyConstants.class, mConstants);
diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ru/strings.xml b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ru/strings.xml
index dc77981..0ff85fe 100644
--- a/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ru/strings.xml
+++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/res/values-ru/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="display_cutout_emulation_overlay" msgid="1677693377327336341">"Сделать вырез в углу"</string>
+ <string name="display_cutout_emulation_overlay" msgid="1677693377327336341">"В правом углу"</string>
</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-ru/strings.xml b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-ru/strings.xml
index a02eaf7..2493da3 100644
--- a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-ru/strings.xml
+++ b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/res/values-ru/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="display_cutout_emulation_overlay" msgid="5323179900047630217">"Увеличить вырез вдвое"</string>
+ <string name="display_cutout_emulation_overlay" msgid="5323179900047630217">"Сверху и снизу"</string>
</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ru/strings.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ru/strings.xml
index 1d1656d..89ac1c3 100644
--- a/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ru/strings.xml
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/res/values-ru/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="display_cutout_emulation_overlay" msgid="6424539415439220018">"Сделать вырез выше"</string>
+ <string name="display_cutout_emulation_overlay" msgid="6424539415439220018">"Сверху"</string>
</resources>
diff --git a/services/core/java/com/android/server/RecoverySystemService.java b/services/core/java/com/android/server/RecoverySystemService.java
index 1517887..997178e 100644
--- a/services/core/java/com/android/server/RecoverySystemService.java
+++ b/services/core/java/com/android/server/RecoverySystemService.java
@@ -25,15 +25,12 @@
import android.os.RecoverySystem;
import android.os.RemoteException;
import android.os.SystemProperties;
-import android.system.ErrnoException;
-import android.system.Os;
import android.util.Slog;
import libcore.io.IoUtils;
import java.io.DataInputStream;
import java.io.DataOutputStream;
-import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
@@ -288,7 +285,6 @@
byte[] cmdUtf8 = command.getBytes("UTF-8");
dos.writeInt(cmdUtf8.length);
dos.write(cmdUtf8, 0, cmdUtf8.length);
- dos.flush();
}
// Read the status from the socket.
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index d11b6f2..e53cbc1 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -64,6 +64,7 @@
import android.content.pm.PermissionInfo;
import android.content.pm.UserInfo;
import android.database.ContentObserver;
+import android.hardware.camera2.CameraDevice.CAMERA_AUDIO_RESTRICTION;
import android.media.AudioAttributes;
import android.net.Uri;
import android.os.AsyncTask;
@@ -572,7 +573,7 @@
final ArrayMap<IBinder, ModeCallback> mModeWatchers = new ArrayMap<>();
final ArrayMap<IBinder, SparseArray<ActiveCallback>> mActiveWatchers = new ArrayMap<>();
final ArrayMap<IBinder, SparseArray<NotedCallback>> mNotedWatchers = new ArrayMap<>();
- final SparseArray<SparseArray<Restriction>> mAudioRestrictions = new SparseArray<>();
+ final AudioRestrictionManager mAudioRestrictionManager = new AudioRestrictionManager();
final class ModeCallback implements DeathRecipient {
final IAppOpsCallback mCallback;
@@ -1837,60 +1838,43 @@
}
private int checkAudioOperationImpl(int code, int usage, int uid, String packageName) {
- synchronized (this) {
- final int mode = checkRestrictionLocked(code, usage, uid, packageName);
- if (mode != AppOpsManager.MODE_ALLOWED) {
- return mode;
- }
+ final int mode = mAudioRestrictionManager.checkAudioOperation(
+ code, usage, uid, packageName);
+ if (mode != AppOpsManager.MODE_ALLOWED) {
+ return mode;
}
return checkOperation(code, uid, packageName);
}
- private int checkRestrictionLocked(int code, int usage, int uid, String packageName) {
- final SparseArray<Restriction> usageRestrictions = mAudioRestrictions.get(code);
- if (usageRestrictions != null) {
- final Restriction r = usageRestrictions.get(usage);
- if (r != null && !r.exceptionPackages.contains(packageName)) {
- return r.mode;
- }
- }
- return AppOpsManager.MODE_ALLOWED;
- }
-
@Override
public void setAudioRestriction(int code, int usage, int uid, int mode,
String[] exceptionPackages) {
enforceManageAppOpsModes(Binder.getCallingPid(), Binder.getCallingUid(), uid);
verifyIncomingUid(uid);
verifyIncomingOp(code);
- synchronized (this) {
- SparseArray<Restriction> usageRestrictions = mAudioRestrictions.get(code);
- if (usageRestrictions == null) {
- usageRestrictions = new SparseArray<Restriction>();
- mAudioRestrictions.put(code, usageRestrictions);
- }
- usageRestrictions.remove(usage);
- if (mode != AppOpsManager.MODE_ALLOWED) {
- final Restriction r = new Restriction();
- r.mode = mode;
- if (exceptionPackages != null) {
- final int N = exceptionPackages.length;
- r.exceptionPackages = new ArraySet<String>(N);
- for (int i = 0; i < N; i++) {
- final String pkg = exceptionPackages[i];
- if (pkg != null) {
- r.exceptionPackages.add(pkg.trim());
- }
- }
- }
- usageRestrictions.put(usage, r);
- }
- }
+
+ mAudioRestrictionManager.setZenModeAudioRestriction(
+ code, usage, uid, mode, exceptionPackages);
mHandler.sendMessage(PooledLambda.obtainMessage(
AppOpsService::notifyWatchersOfChange, this, code, UID_ANY));
}
+
+ @Override
+ public void setCameraAudioRestriction(@CAMERA_AUDIO_RESTRICTION int mode) {
+ enforceManageAppOpsModes(Binder.getCallingPid(), Binder.getCallingUid(), -1);
+
+ mAudioRestrictionManager.setCameraAudioRestriction(mode);
+
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyWatchersOfChange, this,
+ AppOpsManager.OP_PLAY_AUDIO, UID_ANY));
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyWatchersOfChange, this,
+ AppOpsManager.OP_VIBRATE, UID_ANY));
+ }
+
@Override
public int checkPackage(int uid, String packageName) {
Preconditions.checkNotNull(packageName);
@@ -4135,31 +4119,9 @@
}
}
}
- if (mAudioRestrictions.size() > 0 && dumpOp < 0 && dumpPackage != null
- && dumpMode < 0 && !dumpWatchers && !dumpWatchers) {
- boolean printedHeader = false;
- for (int o=0; o<mAudioRestrictions.size(); o++) {
- final String op = AppOpsManager.opToName(mAudioRestrictions.keyAt(o));
- final SparseArray<Restriction> restrictions = mAudioRestrictions.valueAt(o);
- for (int i=0; i<restrictions.size(); i++) {
- if (!printedHeader){
- pw.println(" Audio Restrictions:");
- printedHeader = true;
- needSep = true;
- }
- final int usage = restrictions.keyAt(i);
- pw.print(" "); pw.print(op);
- pw.print(" usage="); pw.print(AudioAttributes.usageToString(usage));
- Restriction r = restrictions.valueAt(i);
- pw.print(": mode="); pw.println(AppOpsManager.modeToName(r.mode));
- if (!r.exceptionPackages.isEmpty()) {
- pw.println(" Exceptions:");
- for (int j=0; j<r.exceptionPackages.size(); j++) {
- pw.print(" "); pw.println(r.exceptionPackages.valueAt(j));
- }
- }
- }
- }
+ if (mAudioRestrictionManager.hasActiveRestrictions() && dumpOp < 0
+ && dumpPackage != null && dumpMode < 0 && !dumpWatchers && !dumpWatchers) {
+ needSep = mAudioRestrictionManager.dump(pw) | needSep ;
}
if (needSep) {
pw.println();
@@ -4410,12 +4372,6 @@
}
}
- private static final class Restriction {
- private static final ArraySet<String> NO_EXCEPTIONS = new ArraySet<String>();
- int mode;
- ArraySet<String> exceptionPackages = NO_EXCEPTIONS;
- }
-
@Override
public void setUserRestrictions(Bundle restrictions, IBinder token, int userHandle) {
checkSystemUid("setUserRestrictions");
diff --git a/services/core/java/com/android/server/appop/AudioRestrictionManager.java b/services/core/java/com/android/server/appop/AudioRestrictionManager.java
new file mode 100644
index 0000000..be87037
--- /dev/null
+++ b/services/core/java/com/android/server/appop/AudioRestrictionManager.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2019 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.appop;
+
+import android.app.AppOpsManager;
+import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CameraDevice.CAMERA_AUDIO_RESTRICTION;
+import android.media.AudioAttributes;
+import android.util.ArraySet;
+import android.util.Slog;
+import android.util.SparseArray;
+import android.util.SparseBooleanArray;
+
+import java.io.PrintWriter;
+
+/**
+ * AudioRestrictionManager host all audio restriction related logic and states for AppOpsService.
+ */
+public class AudioRestrictionManager {
+ static final String TAG = "AudioRestriction";
+
+ // Audio restrictions coming from Zen mode API
+ final SparseArray<SparseArray<Restriction>> mZenModeAudioRestrictions = new SparseArray<>();
+ // Audio restrictions coming from Camera2 API
+ @CAMERA_AUDIO_RESTRICTION int mCameraAudioRestriction = CameraDevice.AUDIO_RESTRICTION_NONE;
+ // Predefined <code, usages> camera audio restriction settings
+ static final SparseArray<SparseBooleanArray> CAMERA_AUDIO_RESTRICTIONS;
+
+ static {
+ SparseBooleanArray audioMutedUsages = new SparseBooleanArray();
+ SparseBooleanArray vibrationMutedUsages = new SparseBooleanArray();
+ for (int usage : AudioAttributes.SDK_USAGES) {
+ final int suppressionBehavior = AudioAttributes.SUPPRESSIBLE_USAGES.get(usage);
+ if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NOTIFICATION ||
+ suppressionBehavior == AudioAttributes.SUPPRESSIBLE_CALL ||
+ suppressionBehavior == AudioAttributes.SUPPRESSIBLE_ALARM) {
+ audioMutedUsages.append(usage, true);
+ vibrationMutedUsages.append(usage, true);
+ } else if (suppressionBehavior != AudioAttributes.SUPPRESSIBLE_MEDIA &&
+ suppressionBehavior != AudioAttributes.SUPPRESSIBLE_SYSTEM &&
+ suppressionBehavior != AudioAttributes.SUPPRESSIBLE_NEVER) {
+ Slog.e(TAG, "Unknown audio suppression behavior" + suppressionBehavior);
+ }
+ }
+ CAMERA_AUDIO_RESTRICTIONS = new SparseArray<>();
+ CAMERA_AUDIO_RESTRICTIONS.append(AppOpsManager.OP_PLAY_AUDIO, audioMutedUsages);
+ CAMERA_AUDIO_RESTRICTIONS.append(AppOpsManager.OP_VIBRATE, vibrationMutedUsages);
+ }
+
+ private static final class Restriction {
+ private static final ArraySet<String> NO_EXCEPTIONS = new ArraySet<String>();
+ int mode;
+ ArraySet<String> exceptionPackages = NO_EXCEPTIONS;
+ }
+
+ public int checkAudioOperation(int code, int usage, int uid, String packageName) {
+ synchronized (this) {
+ // Check for camera audio restrictions
+ if (mCameraAudioRestriction != CameraDevice.AUDIO_RESTRICTION_NONE) {
+ if (code == AppOpsManager.OP_VIBRATE || (code == AppOpsManager.OP_PLAY_AUDIO &&
+ mCameraAudioRestriction ==
+ CameraDevice.AUDIO_RESTRICTION_VIBRATION_SOUND)) {
+ final SparseBooleanArray mutedUsages = CAMERA_AUDIO_RESTRICTIONS.get(code);
+ if (mutedUsages != null) {
+ if (mutedUsages.get(usage)) {
+ return AppOpsManager.MODE_IGNORED;
+ }
+ }
+ }
+ }
+
+ final int mode = checkZenModeRestrictionLocked(code, usage, uid, packageName);
+ if (mode != AppOpsManager.MODE_ALLOWED) {
+ return mode;
+ }
+ }
+ return AppOpsManager.MODE_ALLOWED;
+ }
+
+ private int checkZenModeRestrictionLocked(int code, int usage, int uid, String packageName) {
+ final SparseArray<Restriction> usageRestrictions = mZenModeAudioRestrictions.get(code);
+ if (usageRestrictions != null) {
+ final Restriction r = usageRestrictions.get(usage);
+ if (r != null && !r.exceptionPackages.contains(packageName)) {
+ return r.mode;
+ }
+ }
+ return AppOpsManager.MODE_ALLOWED;
+ }
+
+ public void setZenModeAudioRestriction(int code, int usage, int uid, int mode,
+ String[] exceptionPackages) {
+ synchronized (this) {
+ SparseArray<Restriction> usageRestrictions = mZenModeAudioRestrictions.get(code);
+ if (usageRestrictions == null) {
+ usageRestrictions = new SparseArray<Restriction>();
+ mZenModeAudioRestrictions.put(code, usageRestrictions);
+ }
+ usageRestrictions.remove(usage);
+ if (mode != AppOpsManager.MODE_ALLOWED) {
+ final Restriction r = new Restriction();
+ r.mode = mode;
+ if (exceptionPackages != null) {
+ final int N = exceptionPackages.length;
+ r.exceptionPackages = new ArraySet<String>(N);
+ for (int i = 0; i < N; i++) {
+ final String pkg = exceptionPackages[i];
+ if (pkg != null) {
+ r.exceptionPackages.add(pkg.trim());
+ }
+ }
+ }
+ usageRestrictions.put(usage, r);
+ }
+ }
+ }
+
+ public void setCameraAudioRestriction(@CAMERA_AUDIO_RESTRICTION int mode) {
+ synchronized (this) {
+ mCameraAudioRestriction = mode;
+ }
+ }
+
+ public boolean hasActiveRestrictions() {
+ boolean hasActiveRestrictions = false;
+ synchronized (this) {
+ hasActiveRestrictions = (mZenModeAudioRestrictions.size() > 0 ||
+ mCameraAudioRestriction != CameraDevice.AUDIO_RESTRICTION_NONE);
+ }
+ return hasActiveRestrictions;
+ }
+
+ // return: needSep used by AppOpsService#dump
+ public boolean dump(PrintWriter pw) {
+ boolean printedHeader = false;
+ boolean needSep = hasActiveRestrictions();
+
+ synchronized (this) {
+ for (int o = 0; o < mZenModeAudioRestrictions.size(); o++) {
+ final String op = AppOpsManager.opToName(mZenModeAudioRestrictions.keyAt(o));
+ final SparseArray<Restriction> restrictions = mZenModeAudioRestrictions.valueAt(o);
+ for (int i = 0; i < restrictions.size(); i++) {
+ if (!printedHeader){
+ pw.println(" Zen Mode Audio Restrictions:");
+ printedHeader = true;
+
+ }
+ final int usage = restrictions.keyAt(i);
+ pw.print(" "); pw.print(op);
+ pw.print(" usage="); pw.print(AudioAttributes.usageToString(usage));
+ Restriction r = restrictions.valueAt(i);
+ pw.print(": mode="); pw.println(AppOpsManager.modeToName(r.mode));
+ if (!r.exceptionPackages.isEmpty()) {
+ pw.println(" Exceptions:");
+ for (int j = 0; j < r.exceptionPackages.size(); j++) {
+ pw.print(" "); pw.println(r.exceptionPackages.valueAt(j));
+ }
+ }
+ }
+ }
+ if (mCameraAudioRestriction != CameraDevice.AUDIO_RESTRICTION_NONE) {
+ pw.println(" Camera Audio Restriction Mode: " +
+ cameraRestrictionModeToName(mCameraAudioRestriction));
+ }
+ }
+ return needSep;
+ }
+
+ private static String cameraRestrictionModeToName(@CAMERA_AUDIO_RESTRICTION int mode) {
+ switch (mode) {
+ case CameraDevice.AUDIO_RESTRICTION_NONE:
+ return "None";
+ case CameraDevice.AUDIO_RESTRICTION_VIBRATION:
+ return "MuteVibration";
+ case CameraDevice.AUDIO_RESTRICTION_VIBRATION_SOUND:
+ return "MuteVibrationAndSound";
+ default:
+ return "Unknown";
+ }
+ }
+
+}
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index faf01f9..7b3eae1 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -2082,7 +2082,6 @@
}
out.write(0xFF);
out.write(0xFF);
- out.flush();
// Wait for End-of-File.
InputStream in = mSockets[i].getInputStream();
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 22929d8..72c8b22 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -843,7 +843,23 @@
private boolean checkSinglePermissionInternal(int uid,
@NonNull PermissionsState permissionsState, @NonNull String permissionName) {
- if (!permissionsState.hasPermission(permissionName, UserHandle.getUserId(uid))) {
+ boolean hasPermission = permissionsState.hasPermission(permissionName,
+ UserHandle.getUserId(uid));
+
+ if (!hasPermission && mSettings.isPermissionRuntime(permissionName)) {
+ final String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid);
+ final int packageNamesSize = packageNames != null ? packageNames.length : 0;
+ for (int i = 0; i < packageNamesSize; i++) {
+ final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageNames[i]);
+ if (pkg != null && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M
+ && pkg.requestedPermissions.contains(permissionName)) {
+ hasPermission = true;
+ break;
+ }
+ }
+ }
+
+ if (!hasPermission) {
return false;
}
@@ -2962,8 +2978,6 @@
Slog.i(TAG, newPerm + " does not inherit from " + sourcePerms
+ " for " + pkgName + " as split permission is also new");
}
-
- break;
} else {
// Inherit from new install or existing runtime permissions
inheritPermissionStateToNewImplicitPermissionLocked(sourcePerms,
diff --git a/services/core/java/com/android/server/pm/permission/PermissionSettings.java b/services/core/java/com/android/server/pm/permission/PermissionSettings.java
index 9208032..3d8cf2d 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionSettings.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionSettings.java
@@ -18,13 +18,11 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.content.Context;
import android.content.pm.PackageParser;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
-import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.XmlUtils;
import com.android.server.pm.DumpState;
@@ -37,7 +35,6 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
-import java.util.Set;
/**
* Permissions and other related data. This class is not meant for
@@ -249,6 +246,18 @@
}
}
+ /**
+ * Check whether a permission is runtime.
+ *
+ * @see BasePermission#isRuntime()
+ */
+ public boolean isPermissionRuntime(@NonNull String permName) {
+ synchronized (mLock) {
+ final BasePermission bp = mPermissions.get(permName);
+ return (bp != null && bp.isRuntime());
+ }
+ }
+
public boolean isPermissionInstant(String permName) {
synchronized (mLock) {
final BasePermission bp = mPermissions.get(permName);
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index b17036a..4c1e7f9 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -3617,6 +3617,10 @@
}
stack.moveToFront(myReason);
+ // Top display focused stack is changed, update top resumed activity if needed.
+ if (stack.mResumedActivity != null) {
+ mStackSupervisor.updateTopResumedActivityIfNeeded();
+ }
return stack;
}
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 48bc963..5717e2f 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -81,7 +81,6 @@
import static com.android.server.wm.ActivityTaskManagerService.ANIMATE;
import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.PHASE_BOUNDS;
import static com.android.server.wm.LaunchParamsController.LaunchParamsModifier.PHASE_DISPLAY;
-import static com.android.server.wm.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT;
import static com.android.server.wm.TaskRecord.REPARENT_MOVE_STACK_TO_FRONT;
import android.annotation.NonNull;
@@ -1502,197 +1501,46 @@
mSupervisor.mRecentTasks.setFreezeTaskListReordering();
}
- // Do not start home activity if it cannot be launched on preferred display. We are not
- // doing this in ActivityStackSupervisor#canPlaceEntityOnDisplay because it might
- // fallback to launch on other displays.
- if (r.isActivityTypeHome() && !mRootActivityContainer.canStartHomeOnDisplay(r.info,
- mPreferredDisplayId, true /* allowInstrumenting */)) {
- Slog.w(TAG, "Cannot launch home on display " + mPreferredDisplayId);
- return START_CANCELED;
+ // Compute if there is an existing task that should be used for.
+ final TaskRecord targetTask = computeTargetTask(reusedActivity);
+ final boolean newTask = targetTask == null;
+
+ // Check if starting activity on given task or on a new task is allowed.
+ int startResult = isAllowedToStart(r, newTask, targetTask);
+ if (startResult != START_SUCCESS) {
+ return startResult;
}
- if (reusedActivity != null) {
- // When the flags NEW_TASK and CLEAR_TASK are set, then the task gets reused but
- // still needs to be a lock task mode violation since the task gets cleared out and
- // the device would otherwise leave the locked task.
- if (mService.getLockTaskController().isLockTaskModeViolation(
- reusedActivity.getTaskRecord(),
- (mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
- == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))) {
- Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode");
- return START_RETURN_LOCK_TASK_MODE_VIOLATION;
+ final ActivityRecord targetTaskTop = newTask ? null : targetTask.getTopActivity();
+ if (targetTaskTop != null) {
+ // Recycle the target task for this launch.
+ startResult = recycleTask(targetTask, targetTaskTop, reusedActivity, outActivity);
+ if (startResult != START_SUCCESS) {
+ return startResult;
}
-
- // True if we are clearing top and resetting of a standard (default) launch mode
- // ({@code LAUNCH_MULTIPLE}) activity. The existing activity will be finished.
- final boolean clearTopAndResetStandardLaunchMode =
- (mLaunchFlags & (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED))
- == (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
- && mLaunchMode == LAUNCH_MULTIPLE;
-
- // If mStartActivity does not have a task associated with it, associate it with the
- // reused activity's task. Do not do so if we're clearing top and resetting for a
- // standard launchMode activity.
- if (mStartActivity.getTaskRecord() == null && !clearTopAndResetStandardLaunchMode) {
- mStartActivity.setTask(reusedActivity.getTaskRecord());
- }
-
- if (reusedActivity.getTaskRecord().intent == null) {
- // This task was started because of movement of the activity based on affinity...
- // Now that we are actually launching it, we can assign the base intent.
- reusedActivity.getTaskRecord().setIntent(mStartActivity);
- } else {
- final boolean taskOnHome =
- (mStartActivity.intent.getFlags() & FLAG_ACTIVITY_TASK_ON_HOME) != 0;
- if (taskOnHome) {
- reusedActivity.getTaskRecord().intent.addFlags(FLAG_ACTIVITY_TASK_ON_HOME);
- } else {
- reusedActivity.getTaskRecord().intent.removeFlags(FLAG_ACTIVITY_TASK_ON_HOME);
- }
- }
-
- // This code path leads to delivering a new intent, we want to make sure we schedule it
- // as the first operation, in case the activity will be resumed as a result of later
- // operations.
- if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0
- || isDocumentLaunchesIntoExisting(mLaunchFlags)
- || isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
- final TaskRecord task = reusedActivity.getTaskRecord();
-
- // In this situation we want to remove all activities from the task up to the one
- // being started. In most cases this means we are resetting the task to its initial
- // state.
- final ActivityRecord top = task.performClearTaskForReuseLocked(mStartActivity,
- mLaunchFlags);
-
- // The above code can remove {@code reusedActivity} from the task, leading to the
- // the {@code ActivityRecord} removing its reference to the {@code TaskRecord}. The
- // task reference is needed in the call below to
- // {@link setTargetStackAndMoveToFrontIfNeeded}.
- if (reusedActivity.getTaskRecord() == null) {
- reusedActivity.setTask(task);
- }
-
- if (top != null) {
- if (top.isRootOfTask()) {
- // Activity aliases may mean we use different intents for the top activity,
- // so make sure the task now has the identity of the new intent.
- top.getTaskRecord().setIntent(mStartActivity);
- }
- deliverNewIntent(top);
- }
- }
-
- mRootActivityContainer.sendPowerHintForLaunchStartIfNeeded
- (false /* forceSend */, reusedActivity);
-
- reusedActivity = setTargetStackAndMoveToFrontIfNeeded(reusedActivity);
-
- final ActivityRecord outResult =
- outActivity != null && outActivity.length > 0 ? outActivity[0] : null;
-
- // When there is a reused activity and the current result is a trampoline activity,
- // set the reused activity as the result.
- if (outResult != null && (outResult.finishing || outResult.noDisplay)) {
- outActivity[0] = reusedActivity;
- }
-
- if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
- // We don't need to start a new activity, and the client said not to do anything
- // if that is the case, so this is it! And for paranoia, make sure we have
- // correctly resumed the top activity.
- resumeTargetStackIfNeeded();
- return START_RETURN_INTENT_TO_CALLER;
- }
-
- if (reusedActivity != null) {
- setTaskFromIntentActivity(reusedActivity);
-
- if (!mAddingToTask && mReuseTask == null) {
- // We didn't do anything... but it was needed (a.k.a., client don't use that
- // intent!) And for paranoia, make sure we have correctly resumed the top activity.
- resumeTargetStackIfNeeded();
- if (outActivity != null && outActivity.length > 0) {
- // The reusedActivity could be finishing, for example of starting an
- // activity with FLAG_ACTIVITY_CLEAR_TOP flag. In that case, return the
- // top running activity in the task instead.
- outActivity[0] = reusedActivity.finishing
- ? reusedActivity.getTaskRecord().getTopActivity() : reusedActivity;
- }
-
- return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
- }
- }
- }
-
- if (mStartActivity.packageName == null) {
- if (mStartActivity.resultTo != null) {
- mStartActivity.resultTo.sendResult(INVALID_UID, mStartActivity.resultWho,
- mStartActivity.requestCode, RESULT_CANCELED, null /* data */);
- }
- ActivityOptions.abort(mOptions);
- return START_CLASS_NOT_FOUND;
}
// If the activity being launched is the same as the one currently at the top, then
// we need to check if it should only be launched once.
final ActivityStack topStack = mRootActivityContainer.getTopDisplayFocusedStack();
- final ActivityRecord topFocused = topStack.getTopActivity();
- final ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(mNotTop);
- final boolean dontStart = top != null && mStartActivity.resultTo == null
- && top.mActivityComponent.equals(mStartActivity.mActivityComponent)
- && top.mUserId == mStartActivity.mUserId
- && top.attachedToProcess()
- && ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
- || isLaunchModeOneOf(LAUNCH_SINGLE_TOP, LAUNCH_SINGLE_TASK))
- // This allows home activity to automatically launch on secondary display when
- // display added, if home was the top activity on default display, instead of
- // sending new intent to the home activity on default display.
- && (!top.isActivityTypeHome() || top.getDisplayId() == mPreferredDisplayId);
- if (dontStart) {
- // For paranoia, make sure we have correctly resumed the top activity.
- topStack.mLastPausedActivity = null;
- if (mDoResume) {
- mRootActivityContainer.resumeFocusedStacksTopActivities();
- }
- ActivityOptions.abort(mOptions);
- if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
- // We don't need to start a new activity, and the client said not to do
- // anything if that is the case, so this is it!
- return START_RETURN_INTENT_TO_CALLER;
- }
-
- deliverNewIntent(top);
-
- // Don't use mStartActivity.task to show the toast. We're not starting a new activity
- // but reusing 'top'. Fields in mStartActivity may not be fully initialized.
- mSupervisor.handleNonResizableTaskIfNeeded(top.getTaskRecord(), preferredWindowingMode,
- mPreferredDisplayId, topStack);
-
- return START_DELIVERED_TO_TOP;
+ startResult = deliverToCurrentTopIfNeeded(topStack);
+ if (startResult != START_SUCCESS) {
+ return startResult;
}
- boolean newTask = false;
- final TaskRecord taskToAffiliate = (mLaunchTaskBehind && mSourceRecord != null)
- ? mSourceRecord.getTaskRecord() : null;
-
- // Should this be considered a new task?
- int result = START_SUCCESS;
- if (mStartActivity.resultTo == null && mInTask == null && !mAddingToTask
- && (mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
- newTask = true;
- result = setTaskFromReuseOrCreateNewTask(taskToAffiliate);
- } else if (mSourceRecord != null) {
- result = setTaskFromSourceRecord();
- } else if (mInTask != null) {
- result = setTaskFromInTask();
- } else {
- // This not being started from an existing activity, and not part of a new task...
- // just put it in the top task, though these days this case should never happen.
- result = setTaskToCurrentTopOrCreateNewTask();
+ if (mTargetStack == null) {
+ mTargetStack = computeStackFocus(mStartActivity, true, mLaunchFlags, mOptions);
}
- if (result != START_SUCCESS) {
- return result;
+ if (newTask) {
+ final TaskRecord taskToAffiliate = (mLaunchTaskBehind && mSourceRecord != null)
+ ? mSourceRecord.getTaskRecord() : null;
+ setNewTask(taskToAffiliate);
+ } else if (mAddingToTask) {
+ addOrReparentStartingActivity(targetTask, "adding to task");
+ }
+
+ if (!mAvoidMoveToFront && mDoResume) {
+ mTargetStack.moveToFront("reuseOrNewTask");
}
mService.mUgmInternal.grantUriPermissionFromIntent(mCallingUid, mStartActivity.packageName,
@@ -1712,8 +1560,8 @@
mRootActivityContainer.sendPowerHintForLaunchStartIfNeeded(
false /* forceSend */, mStartActivity);
- mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,
- mOptions);
+ mTargetStack.startActivityLocked(mStartActivity, topStack.getTopActivity(), newTask,
+ mKeepCurTransition, mOptions);
if (mDoResume) {
final ActivityRecord topTaskActivity =
mStartActivity.getTaskRecord().topRunningActivityLocked();
@@ -1754,6 +1602,313 @@
return START_SUCCESS;
}
+ private TaskRecord computeTargetTask(ActivityRecord reusedActivity) {
+ if (reusedActivity != null) {
+ return reusedActivity.getTaskRecord();
+ } else if (mStartActivity.resultTo == null && mInTask == null && !mAddingToTask
+ && (mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0) {
+ // A new task should be created instead of using existing one.
+ return null;
+ } else if (mSourceRecord != null) {
+ return mSourceRecord.getTaskRecord();
+ } else if (mInTask != null) {
+ return mInTask;
+ } else {
+ final ActivityRecord top = computeStackFocus(mStartActivity, false /* newTask */,
+ mLaunchFlags, mOptions).getTopActivity();
+ if (top != null) {
+ return top.getTaskRecord();
+ }
+ }
+ return null;
+ }
+
+ private int isAllowedToStart(ActivityRecord r, boolean newTask, TaskRecord targetTask) {
+ if (mStartActivity.packageName == null) {
+ if (mStartActivity.resultTo != null) {
+ mStartActivity.resultTo.sendResult(INVALID_UID, mStartActivity.resultWho,
+ mStartActivity.requestCode, RESULT_CANCELED, null /* data */);
+ }
+ ActivityOptions.abort(mOptions);
+ return START_CLASS_NOT_FOUND;
+ }
+
+ // Do not start home activity if it cannot be launched on preferred display. We are not
+ // doing this in ActivityStackSupervisor#canPlaceEntityOnDisplay because it might
+ // fallback to launch on other displays.
+ if (r.isActivityTypeHome() && !mRootActivityContainer.canStartHomeOnDisplay(r.info,
+ mPreferredDisplayId, true /* allowInstrumenting */)) {
+ Slog.w(TAG, "Cannot launch home on display " + mPreferredDisplayId);
+ return START_CANCELED;
+ }
+
+ if (mRestrictedBgActivity && (newTask || !targetTask.containsAppUid(mCallingUid))
+ && handleBackgroundActivityAbort(mStartActivity)) {
+ Slog.e(TAG, "Abort background activity starts from " + mCallingUid);
+ return START_ABORTED;
+ }
+
+ // When the flags NEW_TASK and CLEAR_TASK are set, then the task gets reused but still
+ // needs to be a lock task mode violation since the task gets cleared out and the device
+ // would otherwise leave the locked task.
+ final boolean isNewClearTask =
+ (mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
+ == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
+ if (mService.getLockTaskController().isInLockTaskMode() && (newTask
+ || mService.getLockTaskController().isLockTaskModeViolation(targetTask,
+ isNewClearTask))) {
+ Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
+ return START_RETURN_LOCK_TASK_MODE_VIOLATION;
+ }
+
+ return START_SUCCESS;
+ }
+
+ /**
+ * Prepare the target task to be reused for this launch, which including:
+ * - Position the target task on valid stack on preferred display.
+ * - Comply to the specified activity launch flags
+ * - Determine whether need to add a new activity on top or just brought the task to front.
+ */
+ private int recycleTask(TaskRecord targetTask, ActivityRecord targetTaskTop,
+ ActivityRecord reusedActivity, ActivityRecord[] outActivity) {
+ // True if we are clearing top and resetting of a standard (default) launch mode
+ // ({@code LAUNCH_MULTIPLE}) activity. The existing activity will be finished.
+ final boolean clearTopAndResetStandardLaunchMode =
+ (mLaunchFlags & (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED))
+ == (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+ && mLaunchMode == LAUNCH_MULTIPLE;
+
+ // If mStartActivity does not have a task associated with it, associate it with the
+ // reused activity's task. Do not do so if we're clearing top and resetting for a
+ // standard launchMode activity.
+ if (mStartActivity.getTaskRecord() == null && !clearTopAndResetStandardLaunchMode) {
+ mStartActivity.setTask(targetTask);
+ }
+
+ if (reusedActivity != null) {
+ if (targetTask.intent == null) {
+ // This task was started because of movement of the activity based on
+ // affinity...
+ // Now that we are actually launching it, we can assign the base intent.
+ targetTask.setIntent(mStartActivity);
+ } else {
+ final boolean taskOnHome =
+ (mStartActivity.intent.getFlags() & FLAG_ACTIVITY_TASK_ON_HOME) != 0;
+ if (taskOnHome) {
+ targetTask.intent.addFlags(FLAG_ACTIVITY_TASK_ON_HOME);
+ } else {
+ targetTask.intent.removeFlags(FLAG_ACTIVITY_TASK_ON_HOME);
+ }
+ }
+ }
+
+ mRootActivityContainer.sendPowerHintForLaunchStartIfNeeded(false /* forceSend */,
+ targetTaskTop);
+
+ setTargetStackIfNeeded(targetTaskTop);
+
+ final ActivityRecord outResult =
+ outActivity != null && outActivity.length > 0 ? outActivity[0] : null;
+
+ // When there is a reused activity and the current result is a trampoline activity,
+ // set the reused activity as the result.
+ if (outResult != null && (outResult.finishing || outResult.noDisplay)) {
+ outActivity[0] = targetTaskTop;
+ }
+
+ if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
+ // We don't need to start a new activity, and the client said not to do anything
+ // if that is the case, so this is it! And for paranoia, make sure we have
+ // correctly resumed the top activity.
+ if (!mMovedToFront && mDoResume) {
+ if (DEBUG_TASKS) {
+ Slog.d(TAG_TASKS, "Bring to front target: " + mTargetStack
+ + " from " + targetTaskTop);
+ }
+ mTargetStack.moveToFront("intentActivityFound");
+ }
+ resumeTargetStackIfNeeded();
+ return START_RETURN_INTENT_TO_CALLER;
+ }
+
+ complyActivityFlags(targetTask, reusedActivity);
+
+ if (mAddingToTask) {
+ return START_SUCCESS;
+ }
+
+ if (!mMovedToFront && mDoResume) {
+ mTargetStack.moveToFront("intentActivityFound");
+ }
+ // We didn't do anything... but it was needed (a.k.a., client don't use that intent!)
+ // And for paranoia, make sure we have correctly resumed the top activity.
+ resumeTargetStackIfNeeded();
+ if (outActivity != null && outActivity.length > 0) {
+ // The reusedActivity could be finishing, for example of starting an activity with
+ // FLAG_ACTIVITY_CLEAR_TOP flag. In that case, return the top running activity in the
+ // task instead.
+ outActivity[0] = targetTaskTop.finishing ? targetTask.getTopActivity() : targetTaskTop;
+ }
+ return mMovedToFront ? START_TASK_TO_FRONT : START_DELIVERED_TO_TOP;
+ }
+
+ /**
+ * Check if the activity being launched is the same as the one currently at the top and it
+ * should only be launched once.
+ */
+ private int deliverToCurrentTopIfNeeded(ActivityStack topStack) {
+ final ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(mNotTop);
+ final boolean dontStart = top != null && mStartActivity.resultTo == null
+ && top.mActivityComponent.equals(mStartActivity.mActivityComponent)
+ && top.mUserId == mStartActivity.mUserId
+ && top.attachedToProcess()
+ && ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
+ || isLaunchModeOneOf(LAUNCH_SINGLE_TOP, LAUNCH_SINGLE_TASK))
+ // This allows home activity to automatically launch on secondary display when
+ // display added, if home was the top activity on default display, instead of
+ // sending new intent to the home activity on default display.
+ && (!top.isActivityTypeHome() || top.getDisplayId() == mPreferredDisplayId);
+ if (!dontStart) {
+ return START_SUCCESS;
+ }
+
+ // For paranoia, make sure we have correctly resumed the top activity.
+ topStack.mLastPausedActivity = null;
+ if (mDoResume) {
+ mRootActivityContainer.resumeFocusedStacksTopActivities();
+ }
+ ActivityOptions.abort(mOptions);
+ if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
+ // We don't need to start a new activity, and the client said not to do anything if
+ // that is the case, so this is it!
+ return START_RETURN_INTENT_TO_CALLER;
+ }
+
+ deliverNewIntent(top);
+
+ // Don't use mStartActivity.task to show the toast. We're not starting a new activity but
+ // reusing 'top'. Fields in mStartActivity may not be fully initialized.
+ mSupervisor.handleNonResizableTaskIfNeeded(top.getTaskRecord(),
+ mLaunchParams.mWindowingMode, mPreferredDisplayId, topStack);
+
+ return START_DELIVERED_TO_TOP;
+ }
+
+ /**
+ * Applying the launching flags to the task, which might clear few or all the activities in the
+ * task.
+ */
+ private void complyActivityFlags(TaskRecord targetTask, ActivityRecord reusedActivity) {
+ ActivityRecord targetTaskTop = targetTask.getTopActivity();
+ if (reusedActivity != null && (mLaunchFlags & FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
+ targetTaskTop = mTargetStack.resetTaskIfNeededLocked(targetTaskTop, mStartActivity);
+ }
+
+ if ((mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
+ == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) {
+ // The caller has requested to completely replace any existing task with its new
+ // activity. Well that should not be too hard...
+ // Note: we must persist the {@link TaskRecord} first as intentActivity could be
+ // removed from calling performClearTaskLocked (For example, if it is being brought out
+ // of history or if it is finished immediately), thus disassociating the task. Also note
+ // that mReuseTask is reset as a result of {@link TaskRecord#performClearTaskLocked}
+ // launching another activity.
+ // TODO(b/36119896): We shouldn't trigger activity launches in this path since we are
+ // already launching one.
+ targetTask.performClearTaskLocked();
+ targetTask.setIntent(mStartActivity);
+ mAddingToTask = true;
+ } else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0
+ || isDocumentLaunchesIntoExisting(mLaunchFlags)
+ || isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
+ // In this situation we want to remove all activities from the task up to the one
+ // being started. In most cases this means we are resetting the task to its initial
+ // state.
+ final ActivityRecord top = targetTask.performClearTaskForReuseLocked(mStartActivity,
+ mLaunchFlags);
+
+ // The above code can remove {@code reusedActivity} from the task, leading to the
+ // the {@code ActivityRecord} removing its reference to the {@code TaskRecord}. The
+ // task reference is needed in the call below to
+ // {@link setTargetStackAndMoveToFrontIfNeeded}.
+ if (targetTaskTop.getTaskRecord() == null) {
+ targetTaskTop.setTask(targetTask);
+ }
+
+ if (top != null) {
+ if (top.isRootOfTask()) {
+ // Activity aliases may mean we use different intents for the top activity,
+ // so make sure the task now has the identity of the new intent.
+ top.getTaskRecord().setIntent(mStartActivity);
+ }
+ deliverNewIntent(top);
+ } else {
+ // A special case: we need to start the activity because it is not currently
+ // running, and the caller has asked to clear the current task to have this
+ // activity at the top.
+ mAddingToTask = true;
+ if (targetTask.getStack() == null) {
+ // Target stack got cleared when we all activities were removed above.
+ // Go ahead and reset it.
+ mTargetStack = computeStackFocus(mSourceRecord, false /* newTask */,
+ mLaunchFlags, mOptions);
+ mTargetStack.addTask(targetTask,
+ !mLaunchTaskBehind /* toTop */, "startActivityUnchecked");
+ }
+ }
+ } else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) == 0 && !mAddingToTask
+ && (mLaunchFlags & FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
+ // In this case, we are launching an activity in our own task that may
+ // already be running somewhere in the history, and we want to shuffle it to
+ // the front of the stack if so.
+ final ActivityRecord act = targetTask.findActivityInHistoryLocked(
+ mStartActivity);
+ if (act != null) {
+ final TaskRecord task = act.getTaskRecord();
+ task.moveActivityToFrontLocked(act);
+ act.updateOptionsLocked(mOptions);
+ deliverNewIntent(act);
+ mTargetStack.mLastPausedActivity = null;
+ } else {
+ mAddingToTask = true;
+ }
+ } else if (mStartActivity.mActivityComponent.equals(targetTask.realActivity)) {
+ // In this case the top activity on the task is the same as the one being launched,
+ // so we take that as a request to bring the task to the foreground. If the top
+ // activity in the task is the root activity, deliver this new intent to it if it
+ // desires.
+ if (((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
+ || LAUNCH_SINGLE_TOP == mLaunchMode)
+ && targetTaskTop.mActivityComponent.equals(
+ mStartActivity.mActivityComponent) && mStartActivity.resultTo == null) {
+ if (targetTaskTop.isRootOfTask()) {
+ targetTaskTop.getTaskRecord().setIntent(mStartActivity);
+ }
+ deliverNewIntent(targetTaskTop);
+ } else if (!targetTask.isSameIntentFilter(mStartActivity)) {
+ // In this case we are launching the root activity of the task, but with a
+ // different intent. We should start a new instance on top.
+ mAddingToTask = true;
+ } else if (reusedActivity == null) {
+ mAddingToTask = true;
+ }
+ } else if ((mLaunchFlags & FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
+ // In this case an activity is being launched in to an existing task, without
+ // resetting that task. This is typically the situation of launching an activity
+ // from a notification or shortcut. We want to place the new activity on top of the
+ // current task.
+ mAddingToTask = true;
+ } else if (!targetTask.rootWasReset) {
+ // In this case we are launching into an existing task that has not yet been started
+ // from its front door. The current task has been brought to the front. Ideally,
+ // we'd probably like to place this new task at the bottom of its stack, but that's
+ // a little hard to do with the current organization of the code so for now we'll
+ // just drop it.
+ targetTask.setIntent(mStartActivity);
+ }
+ }
+
/**
* Resets the {@link ActivityStarter} state.
* @param clearRequest whether the request should be reset to default values.
@@ -2106,7 +2261,7 @@
* @param intentActivity Existing matching activity.
* @return {@link ActivityRecord} brought to front.
*/
- private ActivityRecord setTargetStackAndMoveToFrontIfNeeded(ActivityRecord intentActivity) {
+ private void setTargetStackIfNeeded(ActivityRecord intentActivity) {
mTargetStack = intentActivity.getActivityStack();
mTargetStack.mLastPausedActivity = null;
// If the target task is not in the front, then we need to bring it to the front...
@@ -2136,167 +2291,66 @@
intentActivity.setTaskToAffiliateWith(mSourceRecord.getTaskRecord());
}
- // If the launch flags carry both NEW_TASK and CLEAR_TASK, the task's activities
- // will be cleared soon by ActivityStarter in setTaskFromIntentActivity().
- // So no point resuming any of the activities here, it just wastes one extra
- // resuming, plus enter AND exit transitions.
- // Here we only want to bring the target stack forward. Transition will be applied
- // to the new activity that's started after the old ones are gone.
- final boolean willClearTask =
- (mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
- == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
- if (!willClearTask) {
- final ActivityStack launchStack = getLaunchStack(
- mStartActivity, mLaunchFlags, mStartActivity.getTaskRecord(), mOptions);
- final TaskRecord intentTask = intentActivity.getTaskRecord();
- if (launchStack == null || launchStack == mTargetStack) {
- // We only want to move to the front, if we aren't going to launch on a
- // different stack. If we launch on a different stack, we will put the
- // task on top there.
- mTargetStack.moveTaskToFrontLocked(intentTask, mNoAnimation, mOptions,
- mStartActivity.appTimeTracker, "bringingFoundTaskToFront");
- mMovedToFront = true;
- } else if (launchStack.inSplitScreenWindowingMode()) {
- if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0) {
- // If we want to launch adjacent and mTargetStack is not the computed
- // launch stack - move task to top of computed stack.
- intentTask.reparent(launchStack, ON_TOP,
- REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
- "launchToSide");
- } else {
- // TODO: This should be reevaluated in MW v2.
- // We choose to move task to front instead of launching it adjacent
- // when specific stack was requested explicitly and it appeared to be
- // adjacent stack, but FLAG_ACTIVITY_LAUNCH_ADJACENT was not set.
- mTargetStack.moveTaskToFrontLocked(intentTask,
- mNoAnimation, mOptions, mStartActivity.appTimeTracker,
- "bringToFrontInsteadOfAdjacentLaunch");
- }
- mMovedToFront = launchStack != launchStack.getDisplay()
- .getTopStackInWindowingMode(launchStack.getWindowingMode());
- } else if (launchStack.mDisplayId != mTargetStack.mDisplayId) {
- // Target and computed stacks are on different displays and we've
- // found a matching task - move the existing instance to that display and
- // move it to front.
- intentActivity.getTaskRecord().reparent(launchStack, ON_TOP,
+ final ActivityStack launchStack = getLaunchStack(
+ mStartActivity, mLaunchFlags, mStartActivity.getTaskRecord(), mOptions);
+ final TaskRecord intentTask = intentActivity.getTaskRecord();
+ if (launchStack == null || launchStack == mTargetStack) {
+ // We only want to move to the front, if we aren't going to launch on a
+ // different stack. If we launch on a different stack, we will put the
+ // task on top there.
+ mTargetStack.moveTaskToFrontLocked(intentTask, mNoAnimation, mOptions,
+ mStartActivity.appTimeTracker, "bringingFoundTaskToFront");
+ mMovedToFront = true;
+ } else if (launchStack.inSplitScreenWindowingMode()) {
+ if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0) {
+ // If we want to launch adjacent and mTargetStack is not the computed
+ // launch stack - move task to top of computed stack.
+ intentTask.reparent(launchStack, ON_TOP,
REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
- "reparentToDisplay");
- mMovedToFront = true;
- } else if (launchStack.isActivityTypeHome()
- && !mTargetStack.isActivityTypeHome()) {
- // It is possible for the home activity to be in another stack initially.
- // For example, the activity may have been initially started with an intent
- // which placed it in the fullscreen stack. To ensure the proper handling of
- // the activity based on home stack assumptions, we must move it over.
- intentActivity.getTaskRecord().reparent(launchStack, ON_TOP,
- REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
- "reparentingHome");
- mMovedToFront = true;
+ "launchToSide");
+ } else {
+ // TODO: This should be reevaluated in MW v2.
+ // We choose to move task to front instead of launching it adjacent
+ // when specific stack was requested explicitly and it appeared to be
+ // adjacent stack, but FLAG_ACTIVITY_LAUNCH_ADJACENT was not set.
+ mTargetStack.moveTaskToFrontLocked(intentTask,
+ mNoAnimation, mOptions, mStartActivity.appTimeTracker,
+ "bringToFrontInsteadOfAdjacentLaunch");
}
- mOptions = null;
-
- // We are moving a task to the front, use starting window to hide initial drawn
- // delay.
- intentActivity.showStartingWindow(null /* prev */, false /* newTask */,
- true /* taskSwitch */);
+ mMovedToFront = launchStack != launchStack.getDisplay()
+ .getTopStackInWindowingMode(launchStack.getWindowingMode());
+ } else if (launchStack.mDisplayId != mTargetStack.mDisplayId) {
+ // Target and computed stacks are on different displays and we've
+ // found a matching task - move the existing instance to that display and
+ // move it to front.
+ intentActivity.getTaskRecord().reparent(launchStack, ON_TOP,
+ REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
+ "reparentToDisplay");
+ mMovedToFront = true;
+ } else if (launchStack.isActivityTypeHome()
+ && !mTargetStack.isActivityTypeHome()) {
+ // It is possible for the home activity to be in another stack initially.
+ // For example, the activity may have been initially started with an intent
+ // which placed it in the fullscreen stack. To ensure the proper handling of
+ // the activity based on home stack assumptions, we must move it over.
+ intentActivity.getTaskRecord().reparent(launchStack, ON_TOP,
+ REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
+ "reparentingHome");
+ mMovedToFront = true;
}
+ mOptions = null;
+
+ // We are moving a task to the front, use starting window to hide initial drawn
+ // delay.
+ intentActivity.showStartingWindow(null /* prev */, false /* newTask */,
+ true /* taskSwitch */);
}
}
// Need to update mTargetStack because if task was moved out of it, the original stack may
// be destroyed.
mTargetStack = intentActivity.getActivityStack();
- if (!mMovedToFront && mDoResume) {
- if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Bring to front target: " + mTargetStack
- + " from " + intentActivity);
- mTargetStack.moveToFront("intentActivityFound");
- }
-
mSupervisor.handleNonResizableTaskIfNeeded(intentActivity.getTaskRecord(),
WINDOWING_MODE_UNDEFINED, DEFAULT_DISPLAY, mTargetStack);
-
- // If the caller has requested that the target task be reset, then do so.
- if ((mLaunchFlags & FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
- return mTargetStack.resetTaskIfNeededLocked(intentActivity, mStartActivity);
- }
- return intentActivity;
- }
-
- private void setTaskFromIntentActivity(ActivityRecord intentActivity) {
- if ((mLaunchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
- == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) {
- // The caller has requested to completely replace any existing task with its new
- // activity. Well that should not be too hard...
- // Note: we must persist the {@link TaskRecord} first as intentActivity could be
- // removed from calling performClearTaskLocked (For example, if it is being brought out
- // of history or if it is finished immediately), thus disassociating the task. Also note
- // that mReuseTask is reset as a result of {@link TaskRecord#performClearTaskLocked}
- // launching another activity.
- // TODO(b/36119896): We shouldn't trigger activity launches in this path since we are
- // already launching one.
- final TaskRecord task = intentActivity.getTaskRecord();
- task.performClearTaskLocked();
- mReuseTask = task;
- mReuseTask.setIntent(mStartActivity);
- } else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0
- || isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
- final ActivityRecord top = intentActivity.getTaskRecord().performClearTaskLocked(
- mStartActivity, mLaunchFlags);
- if (top == null) {
- // A special case: we need to start the activity because it is not currently
- // running, and the caller has asked to clear the current task to have this
- // activity at the top.
- mAddingToTask = true;
-
- // We are no longer placing the activity in the task we previously thought we were.
- mStartActivity.setTask(null);
- // Now pretend like this activity is being started by the top of its task, so it
- // is put in the right place.
- mSourceRecord = intentActivity;
- final TaskRecord task = mSourceRecord.getTaskRecord();
- if (task != null && task.getStack() == null) {
- // Target stack got cleared when we all activities were removed above.
- // Go ahead and reset it.
- mTargetStack = computeStackFocus(mSourceRecord, false /* newTask */,
- mLaunchFlags, mOptions);
- mTargetStack.addTask(task,
- !mLaunchTaskBehind /* toTop */, "startActivityUnchecked");
- }
- }
- } else if (mStartActivity.mActivityComponent.equals(
- intentActivity.getTaskRecord().realActivity)) {
- // In this case the top activity on the task is the same as the one being launched,
- // so we take that as a request to bring the task to the foreground. If the top
- // activity in the task is the root activity, deliver this new intent to it if it
- // desires.
- if (((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
- || LAUNCH_SINGLE_TOP == mLaunchMode)
- && intentActivity.mActivityComponent.equals(
- mStartActivity.mActivityComponent)) {
- if (intentActivity.isRootOfTask()) {
- intentActivity.getTaskRecord().setIntent(mStartActivity);
- }
- deliverNewIntent(intentActivity);
- } else if (!intentActivity.getTaskRecord().isSameIntentFilter(mStartActivity)) {
- // In this case we are launching the root activity of the task, but with a
- // different intent. We should start a new instance on top.
- mAddingToTask = true;
- mSourceRecord = intentActivity;
- }
- } else if ((mLaunchFlags & FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
- // In this case an activity is being launched in to an existing task, without
- // resetting that task. This is typically the situation of launching an activity
- // from a notification or shortcut. We want to place the new activity on top of the
- // current task.
- mAddingToTask = true;
- mSourceRecord = intentActivity;
- } else if (!intentActivity.getTaskRecord().rootWasReset) {
- // In this case we are launching into an existing task that has not yet been started
- // from its front door. The current task has been brought to the front. Ideally,
- // we'd probably like to place this new task at the bottom of its stack, but that's
- // a little hard to do with the current organization of the code so for now we'll
- // just drop it.
- intentActivity.getTaskRecord().setIntent(mStartActivity);
- }
}
private void resumeTargetStackIfNeeded() {
@@ -2308,47 +2362,24 @@
mRootActivityContainer.updateUserStack(mStartActivity.mUserId, mTargetStack);
}
- private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate) {
- if (mRestrictedBgActivity && (mReuseTask == null || !mReuseTask.containsAppUid(mCallingUid))
- && handleBackgroundActivityAbort(mStartActivity)) {
- return START_ABORTED;
- }
+ private void setNewTask(TaskRecord taskToAffiliate) {
+ final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront;
+ final TaskRecord task = mTargetStack.createTaskRecord(
+ mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId),
+ mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info,
+ mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession,
+ mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions);
+ addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask");
+ updateBounds(mStartActivity.getTaskRecord(), mLaunchParams.mBounds);
- mTargetStack = computeStackFocus(mStartActivity, true, mLaunchFlags, mOptions);
-
- // Do no move the target stack to front yet, as we might bail if
- // isLockTaskModeViolation fails below.
-
- if (mReuseTask == null) {
- final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront;
- final TaskRecord task = mTargetStack.createTaskRecord(
- mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId),
- mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info,
- mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession,
- mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions);
- addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask");
- updateBounds(mStartActivity.getTaskRecord(), mLaunchParams.mBounds);
-
- if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity
+ if (DEBUG_TASKS) {
+ Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity
+ " in new task " + mStartActivity.getTaskRecord());
- } else {
- addOrReparentStartingActivity(mReuseTask, "setTaskFromReuseOrCreateNewTask");
}
if (taskToAffiliate != null) {
mStartActivity.setTaskToAffiliateWith(taskToAffiliate);
}
-
- if (mService.getLockTaskController().isLockTaskModeViolation(
- mStartActivity.getTaskRecord())) {
- Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
- return START_RETURN_LOCK_TASK_MODE_VIOLATION;
- }
-
- if (mDoResume) {
- mTargetStack.moveToFront("reuseOrNewTask");
- }
- return START_SUCCESS;
}
private void deliverNewIntent(ActivityRecord activity) {
@@ -2362,166 +2393,6 @@
mIntentDelivered = true;
}
- private int setTaskFromSourceRecord() {
- if (mService.getLockTaskController().isLockTaskModeViolation(
- mSourceRecord.getTaskRecord())) {
- Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
- return START_RETURN_LOCK_TASK_MODE_VIOLATION;
- }
-
- final TaskRecord sourceTask = mSourceRecord.getTaskRecord();
- final ActivityStack sourceStack = mSourceRecord.getActivityStack();
- if (mRestrictedBgActivity && !sourceTask.containsAppUid(mCallingUid)) {
- if (handleBackgroundActivityAbort(mStartActivity)) {
- return START_ABORTED;
- }
- }
- // We only want to allow changing stack in two cases:
- // 1. If the target task is not the top one. Otherwise we would move the launching task to
- // the other side, rather than show two side by side.
- // 2. If activity is not allowed on target display.
- final int targetDisplayId = mTargetStack != null ? mTargetStack.mDisplayId
- : sourceStack.mDisplayId;
- final boolean moveStackAllowed = sourceStack.topTask() != sourceTask
- || !mStartActivity.canBeLaunchedOnDisplay(targetDisplayId);
- if (moveStackAllowed) {
- mTargetStack = getLaunchStack(mStartActivity, mLaunchFlags,
- mStartActivity.getTaskRecord(), mOptions);
- // If target stack is not found now - we can't just rely on the source stack, as it may
- // be not suitable. Let's check other displays.
- if (mTargetStack == null && targetDisplayId != sourceStack.mDisplayId) {
- // Can't use target display, lets find a stack on the source display.
- mTargetStack = mRootActivityContainer.getValidLaunchStackOnDisplay(
- sourceStack.mDisplayId, mStartActivity, mOptions, mLaunchParams);
- }
- if (mTargetStack == null) {
- // There are no suitable stacks on the target and source display(s). Look on all
- // displays.
- mTargetStack = mRootActivityContainer.getNextValidLaunchStack(
- mStartActivity, -1 /* currentFocus */);
- }
- }
-
- if (mTargetStack == null) {
- mTargetStack = sourceStack;
- } else if (mTargetStack != sourceStack) {
- sourceTask.reparent(mTargetStack, ON_TOP, REPARENT_MOVE_STACK_TO_FRONT, !ANIMATE,
- DEFER_RESUME, "launchToSide");
- }
-
- final TaskRecord topTask = mTargetStack.topTask();
- if (topTask != sourceTask && !mAvoidMoveToFront) {
- mTargetStack.moveTaskToFrontLocked(sourceTask, mNoAnimation, mOptions,
- mStartActivity.appTimeTracker, "sourceTaskToFront");
- } else if (mDoResume) {
- mTargetStack.moveToFront("sourceStackToFront");
- }
-
- if (!mAddingToTask && (mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0) {
- // In this case, we are adding the activity to an existing task, but the caller has
- // asked to clear that task if the activity is already running.
- ActivityRecord top = sourceTask.performClearTaskLocked(mStartActivity, mLaunchFlags);
- mKeepCurTransition = true;
- if (top != null) {
- mStartActivity.logStartActivity(AM_NEW_INTENT, top.getTaskRecord());
- deliverNewIntent(top);
- // For paranoia, make sure we have correctly resumed the top activity.
- mTargetStack.mLastPausedActivity = null;
- if (mDoResume) {
- mRootActivityContainer.resumeFocusedStacksTopActivities();
- }
- ActivityOptions.abort(mOptions);
- return START_DELIVERED_TO_TOP;
- }
- } else if (!mAddingToTask && (mLaunchFlags & FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
- // In this case, we are launching an activity in our own task that may already be
- // running somewhere in the history, and we want to shuffle it to the front of the
- // stack if so.
- final ActivityRecord top = sourceTask.findActivityInHistoryLocked(mStartActivity);
- if (top != null) {
- final TaskRecord task = top.getTaskRecord();
- task.moveActivityToFrontLocked(top);
- top.updateOptionsLocked(mOptions);
- mStartActivity.logStartActivity(AM_NEW_INTENT, task);
- deliverNewIntent(top);
- mTargetStack.mLastPausedActivity = null;
- if (mDoResume) {
- mRootActivityContainer.resumeFocusedStacksTopActivities();
- }
- return START_DELIVERED_TO_TOP;
- }
- }
-
- // An existing activity is starting this new activity, so we want to keep the new one in
- // the same task as the one that is starting it.
- addOrReparentStartingActivity(sourceTask, "setTaskFromSourceRecord");
- if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity
- + " in existing task " + mStartActivity.getTaskRecord()
- + " from source " + mSourceRecord);
- return START_SUCCESS;
- }
-
- private int setTaskFromInTask() {
- // The caller is asking that the new activity be started in an explicit
- // task it has provided to us.
- if (mService.getLockTaskController().isLockTaskModeViolation(mInTask)) {
- Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
- return START_RETURN_LOCK_TASK_MODE_VIOLATION;
- }
-
- mTargetStack = mInTask.getStack();
-
- // Check whether we should actually launch the new activity in to the task,
- // or just reuse the current activity on top.
- ActivityRecord top = mInTask.getTopActivity();
- if (top != null && top.mActivityComponent.equals(mStartActivity.mActivityComponent)
- && top.mUserId == mStartActivity.mUserId) {
- if ((mLaunchFlags & FLAG_ACTIVITY_SINGLE_TOP) != 0
- || isLaunchModeOneOf(LAUNCH_SINGLE_TOP, LAUNCH_SINGLE_TASK)) {
- mTargetStack.moveTaskToFrontLocked(mInTask, mNoAnimation, mOptions,
- mStartActivity.appTimeTracker, "inTaskToFront");
- if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
- // We don't need to start a new activity, and the client said not to do
- // anything if that is the case, so this is it!
- return START_RETURN_INTENT_TO_CALLER;
- }
- deliverNewIntent(top);
- return START_DELIVERED_TO_TOP;
- }
- }
-
- if (!mAddingToTask) {
- mTargetStack.moveTaskToFrontLocked(mInTask, mNoAnimation, mOptions,
- mStartActivity.appTimeTracker, "inTaskToFront");
- // We don't actually want to have this activity added to the task, so just
- // stop here but still tell the caller that we consumed the intent.
- ActivityOptions.abort(mOptions);
- return START_TASK_TO_FRONT;
- }
-
- if (!mLaunchParams.mBounds.isEmpty()) {
- // TODO: Shouldn't we already know what stack to use by the time we get here?
- ActivityStack stack = mRootActivityContainer.getLaunchStack(
- null, null, mInTask, ON_TOP);
- if (stack != mInTask.getStack()) {
- mInTask.reparent(stack, ON_TOP, REPARENT_KEEP_STACK_AT_FRONT, !ANIMATE,
- DEFER_RESUME, "inTaskToFront");
- mTargetStack = mInTask.getStack();
- }
-
- updateBounds(mInTask, mLaunchParams.mBounds);
- }
-
- mTargetStack.moveTaskToFrontLocked(
- mInTask, mNoAnimation, mOptions, mStartActivity.appTimeTracker, "inTaskToFront");
-
- addOrReparentStartingActivity(mInTask, "setTaskFromInTask");
- if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity
- + " in explicit task " + mStartActivity.getTaskRecord());
-
- return START_SUCCESS;
- }
-
@VisibleForTesting
void updateBounds(TaskRecord task, Rect bounds) {
if (bounds.isEmpty()) {
@@ -2537,33 +2408,6 @@
}
}
- private int setTaskToCurrentTopOrCreateNewTask() {
- mTargetStack = computeStackFocus(mStartActivity, false, mLaunchFlags, mOptions);
- if (mDoResume) {
- mTargetStack.moveToFront("addingToTopTask");
- }
- final ActivityRecord prev = mTargetStack.getTopActivity();
- if (mRestrictedBgActivity && prev == null) {
- if (handleBackgroundActivityAbort(mStartActivity)) {
- return START_ABORTED;
- }
- }
- final TaskRecord task = (prev != null)
- ? prev.getTaskRecord() : mTargetStack.createTaskRecord(
- mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId), mStartActivity.info,
- mIntent, null, null, true, mStartActivity, mSourceRecord, mOptions);
- if (mRestrictedBgActivity && prev != null && !task.containsAppUid(mCallingUid)) {
- if (handleBackgroundActivityAbort(mStartActivity)) {
- return START_ABORTED;
- }
- }
- addOrReparentStartingActivity(task, "setTaskToCurrentTopOrCreateNewTask");
- mTargetStack.positionChildWindowContainerAtTop(task);
- if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + mStartActivity
- + " in new guessed " + mStartActivity.getTaskRecord());
- return START_SUCCESS;
- }
-
private void addOrReparentStartingActivity(TaskRecord parent, String reason) {
if (mStartActivity.getTaskRecord() == null || mStartActivity.getTaskRecord() == parent) {
parent.addActivityToTop(mStartActivity);
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 1bcf47b..8d40f87 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -5460,7 +5460,7 @@
updateOomAdj = true;
}
if (updateOomAdj) {
- mH.post(mAmInternal::updateOomAdj);
+ updateOomAdj();
}
}
diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java
index b30da5e..caf87cd 100644
--- a/services/core/java/com/android/server/wm/LockTaskController.java
+++ b/services/core/java/com/android/server/wm/LockTaskController.java
@@ -280,6 +280,13 @@
}
/**
+ * @return true if currently in the lock task mode, otherwise, return false.
+ */
+ boolean isInLockTaskMode() {
+ return !mLockTaskModeTasks.isEmpty();
+ }
+
+ /**
* @return whether the requested task is disallowed to be launched.
*/
boolean isLockTaskModeViolation(TaskRecord task) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index d49d245..fa1ace6 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -28,6 +28,7 @@
import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
import static android.app.StatusBarManager.DISABLE_MASK;
import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED;
+import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
import static android.content.pm.PackageManager.FEATURE_PC;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Process.SYSTEM_UID;
@@ -36,7 +37,9 @@
import static android.provider.DeviceConfig.WindowManager.KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE;
import static android.provider.DeviceConfig.WindowManager.KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP;
import static android.provider.DeviceConfig.WindowManager.KEY_SYSTEM_GESTURE_EXCLUSION_LOG_DEBOUNCE_MILLIS;
+import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
+import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.WindowManager.DOCKED_INVALID;
@@ -666,7 +669,8 @@
WindowManagerInternal.OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener;
SettingsObserver mSettingsObserver;
- private final class SettingsObserver extends ContentObserver {
+ @VisibleForTesting
+ final class SettingsObserver extends ContentObserver {
private final Uri mDisplayInversionEnabledUri =
Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
private final Uri mWindowAnimationScaleUri =
@@ -681,6 +685,12 @@
Settings.Global.getUriFor(Settings.Global.POLICY_CONTROL);
private final Uri mPointerLocationUri =
Settings.System.getUriFor(Settings.System.POINTER_LOCATION);
+ private final Uri mForceDesktopModeOnExternalDisplaysUri = Settings.Global.getUriFor(
+ Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS);
+ private final Uri mFreeformWindowUri = Settings.Global.getUriFor(
+ Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT);
+ private final Uri mForceResizableUri = Settings.Global.getUriFor(
+ DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES);
public SettingsObserver() {
super(new Handler());
@@ -697,6 +707,10 @@
UserHandle.USER_ALL);
resolver.registerContentObserver(mPolicyControlUri, false, this, UserHandle.USER_ALL);
resolver.registerContentObserver(mPointerLocationUri, false, this, UserHandle.USER_ALL);
+ resolver.registerContentObserver(mForceDesktopModeOnExternalDisplaysUri, false, this,
+ UserHandle.USER_ALL);
+ resolver.registerContentObserver(mFreeformWindowUri, false, this, UserHandle.USER_ALL);
+ resolver.registerContentObserver(mForceResizableUri, false, this, UserHandle.USER_ALL);
}
@Override
@@ -720,6 +734,21 @@
return;
}
+ if (mForceDesktopModeOnExternalDisplaysUri.equals(uri)) {
+ updateForceDesktopModeOnExternalDisplays();
+ return;
+ }
+
+ if (mFreeformWindowUri.equals(uri)) {
+ updateFreeformWindowManagement();
+ return;
+ }
+
+ if (mForceResizableUri.equals(uri)) {
+ updateForceResizableTasks();
+ return;
+ }
+
@UpdateAnimationScaleMode
final int mode;
if (mWindowAnimationScaleUri.equals(uri)) {
@@ -762,6 +791,33 @@
mPointerLocationEnabled));
}
}
+
+ void updateForceDesktopModeOnExternalDisplays() {
+ ContentResolver resolver = mContext.getContentResolver();
+ final boolean enableForceDesktopMode = Settings.Global.getInt(resolver,
+ DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS, 0) != 0;
+ if (mForceDesktopModeOnExternalDisplays == enableForceDesktopMode) {
+ return;
+ }
+ setForceDesktopModeOnExternalDisplays(enableForceDesktopMode);
+ }
+
+ void updateFreeformWindowManagement() {
+ ContentResolver resolver = mContext.getContentResolver();
+ final boolean freeformWindowManagement = mContext.getPackageManager().hasSystemFeature(
+ FEATURE_FREEFORM_WINDOW_MANAGEMENT) || Settings.Global.getInt(
+ resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
+
+ mAtmService.mSupportsFreeformWindowManagement = freeformWindowManagement;
+ }
+
+ void updateForceResizableTasks() {
+ ContentResolver resolver = mContext.getContentResolver();
+ final boolean forceResizable = Settings.Global.getInt(resolver,
+ DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0;
+
+ mAtmService.mForceResizableActivities = forceResizable;
+ }
}
PowerManager mPowerManager;
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
index 341b8f0..127cf49 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
@@ -341,7 +341,10 @@
final byte[] pattern = "123654".getBytes();
final byte[] token = "some-high-entropy-secure-token".getBytes();
initializeCredentialUnderSP(password, PRIMARY_USER_ID);
+ // Disregard any reportPasswordChanged() invocations as part of credential setup.
+ flushHandlerTasks();
reset(mDevicePolicyManager);
+
final byte[] storageKey = mStorageManager.getUserUnlockToken(PRIMARY_USER_ID);
assertFalse(mService.hasPendingEscrowToken(PRIMARY_USER_ID));
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 31babd0..1d1a4e1 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -100,6 +100,7 @@
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import java.util.concurrent.TimeUnit;
@@ -112,6 +113,7 @@
*/
@MediumTest
@Presubmit
+@RunWith(WindowTestRunner.class)
public class ActivityRecordTests extends ActivityTestsBase {
private ActivityStack mStack;
private TaskRecord mTask;
@@ -644,7 +646,7 @@
// The override configuration should be reset and the activity's process will be killed.
assertFalse(mActivity.inSizeCompatMode());
verify(mActivity).restartProcessIfVisible();
- mService.mH.runWithScissors(() -> { }, TimeUnit.SECONDS.toMillis(3));
+ mLockRule.runWithScissors(mService.mH, () -> { }, TimeUnit.SECONDS.toMillis(3));
verify(mService.mAmInternal).killProcess(
eq(mActivity.app.mName), eq(mActivity.app.mUid), anyString());
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
index 81fbfe4..d2af18e 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java
@@ -83,6 +83,7 @@
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Tests for the {@link ActivityStarter} class.
@@ -92,6 +93,7 @@
*/
@SmallTest
@Presubmit
+@RunWith(WindowTestRunner.class)
public class ActivityStarterTests extends ActivityTestsBase {
private ActivityStarter mStarter;
private ActivityStartController mController;
@@ -499,6 +501,7 @@
final ActivityStarter starter = prepareStarter(0);
final LockTaskController lockTaskController = mService.getLockTaskController();
+ doReturn(true).when(lockTaskController).isInLockTaskMode();
doReturn(true).when(lockTaskController).isLockTaskModeViolation(any());
final int result = starter.setReason("testTaskModeViolation").execute();
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
index a5dc241..e6d7632 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java
@@ -62,6 +62,10 @@
@Rule
public final SystemServicesTestRule mSystemServicesTestRule = new SystemServicesTestRule();
+ @WindowTestRunner.MethodWrapperRule
+ public final WindowManagerGlobalLockRule mLockRule =
+ new WindowManagerGlobalLockRule(mSystemServicesTestRule);
+
final Context mContext = getInstrumentation().getTargetContext();
ActivityTaskManagerService mService;
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
index f6f8811..703ebc9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayWindowSettingsTests.java
@@ -51,14 +51,13 @@
import androidx.test.filters.SmallTest;
-import com.android.dx.mockito.inline.extended.ExtendedMockito;
import com.android.server.LocalServices;
import com.android.server.policy.WindowManagerPolicy;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.mockito.MockitoSession;
+import org.junit.runner.RunWith;
import org.xmlpull.v1.XmlPullParser;
import java.io.ByteArrayInputStream;
@@ -78,6 +77,7 @@
*/
@SmallTest
@Presubmit
+@RunWith(WindowTestRunner.class)
public class DisplayWindowSettingsTests extends WindowTestsBase {
private static final File TEST_FOLDER = getInstrumentation().getTargetContext().getCacheDir();
@@ -444,8 +444,6 @@
mTarget.setUserRotation(mPrimaryDisplay, WindowManagerPolicy.USER_ROTATION_LOCKED,
Surface.ROTATION_0);
- final MockitoSession mockitoSession = ExtendedMockito.mockitoSession()
- .startMocking();
final DisplayRotation displayRotation = mock(DisplayRotation.class);
spyOn(mPrimaryDisplay);
doReturn(displayRotation).when(mPrimaryDisplay).getDisplayRotation();
@@ -454,15 +452,12 @@
verify(displayRotation).restoreSettings(anyInt(), anyInt(),
eq(FIXED_TO_USER_ROTATION_DEFAULT));
- mockitoSession.finishMocking();
}
@Test
public void testSetFixedToUserRotationDisabled() {
mTarget.setFixedToUserRotation(mPrimaryDisplay, FIXED_TO_USER_ROTATION_DISABLED);
- final MockitoSession mockitoSession = ExtendedMockito.mockitoSession()
- .startMocking();
final DisplayRotation displayRotation = mock(DisplayRotation.class);
spyOn(mPrimaryDisplay);
doReturn(displayRotation).when(mPrimaryDisplay).getDisplayRotation();
@@ -471,15 +466,12 @@
verify(displayRotation).restoreSettings(anyInt(), anyInt(),
eq(FIXED_TO_USER_ROTATION_DISABLED));
- mockitoSession.finishMocking();
}
@Test
public void testSetFixedToUserRotationEnabled() {
mTarget.setFixedToUserRotation(mPrimaryDisplay, FIXED_TO_USER_ROTATION_ENABLED);
- final MockitoSession mockitoSession = ExtendedMockito.mockitoSession()
- .startMocking();
final DisplayRotation displayRotation = mock(DisplayRotation.class);
spyOn(mPrimaryDisplay);
doReturn(displayRotation).when(mPrimaryDisplay).getDisplayRotation();
@@ -488,7 +480,6 @@
verify(displayRotation).restoreSettings(anyInt(), anyInt(),
eq(FIXED_TO_USER_ROTATION_ENABLED));
- mockitoSession.finishMocking();
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java
index dcc295c..b4ccd50 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java
@@ -56,6 +56,7 @@
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* Build/Install/Run:
@@ -63,6 +64,7 @@
*/
@MediumTest
@Presubmit
+@RunWith(WindowTestRunner.class)
public class RecentsAnimationTest extends ActivityTestsBase {
private static final int TEST_USER_ID = 100;
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
index 539a79c..c67b860 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootActivityContainerTests.java
@@ -69,6 +69,7 @@
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Arrays;
@@ -82,6 +83,7 @@
*/
@MediumTest
@Presubmit
+@RunWith(WindowTestRunner.class)
public class RootActivityContainerTests extends ActivityTestsBase {
private ActivityStack mFullscreenStack;
@@ -575,7 +577,7 @@
@Test
public void testStartSecondaryHomeOnDisplayWithUserKeyLocked() {
// Create secondary displays.
- final TestActivityDisplay secondDisplay = spy(createNewActivityDisplay());
+ final TestActivityDisplay secondDisplay = createNewActivityDisplay();
mRootActivityContainer.addChild(secondDisplay, POSITION_TOP);
doReturn(true).when(secondDisplay).supportsSystemDecorations();
@@ -601,7 +603,7 @@
@Test
public void testStartSecondaryHomeOnDisplayWithoutSysDecorations() {
// Create secondary displays.
- final TestActivityDisplay secondDisplay = spy(createNewActivityDisplay());
+ final TestActivityDisplay secondDisplay = createNewActivityDisplay();
mRootActivityContainer.addChild(secondDisplay, POSITION_TOP);
doReturn(false).when(secondDisplay).supportsSystemDecorations();
diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
index 1ad0e00..21ed285 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
@@ -56,6 +56,7 @@
import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
+import android.os.StrictMode;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.view.InputChannel;
@@ -253,6 +254,8 @@
mPowerManagerWrapper = mock(WindowState.PowerManagerWrapper.class);
mWMPolicy = new TestWindowManagerPolicy(this::getWindowManagerService,
mPowerManagerWrapper);
+ // Suppress StrictMode violation (DisplayWindowSettings) to avoid log flood.
+ DisplayThread.getHandler().post(StrictMode::allowThreadDiskWritesMask);
mWmService = WindowManagerService.main(
mContext, mImService, false, false, mWMPolicy, mAtmService, StubTransaction::new);
spyOn(mWmService);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerGlobalLockRule.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerGlobalLockRule.java
new file mode 100644
index 0000000..e0c314f
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerGlobalLockRule.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2019 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 android.os.AsyncTask;
+import android.os.Handler;
+
+import org.junit.runner.Description;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.Statement;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Holds {@link WindowManagerGlobalLock} for test methods (including before and after) to prevent
+ * the race condition with other threads (e.g. {@link com.android.server.DisplayThread},
+ * {@link com.android.server.AnimationThread}, {@link com.android.server.UiThread}).
+ */
+class WindowManagerGlobalLockRule implements WindowTestRunner.MethodWrapper {
+
+ private final SystemServicesTestRule mSystemServicesTestRule;
+ private volatile boolean mIsLocked;
+
+ WindowManagerGlobalLockRule(SystemServicesTestRule systemServiceTestRule) {
+ mSystemServicesTestRule = systemServiceTestRule;
+ }
+
+ @Override
+ public Statement apply(Statement base, Description description) {
+ if (description.getAnnotation(NoGlobalLock.class) == null) {
+ return new StatementWrapper(base);
+ }
+ return base;
+ }
+
+ @Override
+ public FrameworkMethod apply(FrameworkMethod base) {
+ if (base.getAnnotation(NoGlobalLock.class) == null) {
+ return new FrameworkMethodWrapper(base);
+ }
+ return base;
+ }
+
+ void waitUntilHandlersIdle() {
+ if (!mIsLocked) {
+ mSystemServicesTestRule.waitUntilWindowManagerHandlersIdle();
+ return;
+ }
+
+ waitForLocked(mSystemServicesTestRule::waitUntilWindowManagerHandlersIdle);
+ }
+
+ void runWithScissors(Handler handler, Runnable r, long timeout) {
+ if (!mIsLocked) {
+ handler.runWithScissors(r, timeout);
+ return;
+ }
+
+ waitForLocked(() -> handler.runWithScissors(r, timeout));
+ }
+
+ /**
+ * If the test holds the lock, we need to invoke {@link Object#wait} to release it so other
+ * threads won't be blocked when we are waiting.
+ */
+ private void waitForLocked(Runnable r) {
+ final Object lock = mSystemServicesTestRule.getWindowManagerService().mGlobalLock;
+ final AtomicBoolean done = new AtomicBoolean(false);
+
+ AsyncTask.SERIAL_EXECUTOR.execute(() -> {
+ r.run();
+ synchronized (lock) {
+ lock.notifyAll();
+ done.set(true);
+ }
+ });
+
+ synchronized (lock) {
+ if (!done.get()) {
+ try {
+ lock.wait();
+ } catch (InterruptedException impossible) {
+ }
+ }
+ }
+ }
+
+ /** Wraps methods annotated with {@link org.junit.Test}. */
+ private class StatementWrapper extends Statement {
+ final Statement mBase;
+
+ StatementWrapper(Statement base) {
+ mBase = base;
+ }
+
+ @Override
+ public void evaluate() throws Throwable {
+ try {
+ synchronized (mSystemServicesTestRule.getWindowManagerService().mGlobalLock) {
+ mIsLocked = true;
+ mBase.evaluate();
+ }
+ } finally {
+ mIsLocked = false;
+ }
+ }
+ }
+
+ /** Wraps methods annotated with {@link org.junit.Before} or {@link org.junit.After}. */
+ private class FrameworkMethodWrapper extends FrameworkMethod {
+
+ FrameworkMethodWrapper(FrameworkMethod base) {
+ super(base.getMethod());
+ }
+
+ @Override
+ public Object invokeExplosively(Object target, Object... params) throws Throwable {
+ try {
+ synchronized (mSystemServicesTestRule.getWindowManagerService().mGlobalLock) {
+ mIsLocked = true;
+ return super.invokeExplosively(target, params);
+ }
+ } finally {
+ mIsLocked = false;
+ }
+ }
+ }
+
+ /**
+ * If the test method is annotated with {@link NoGlobalLock}, the rule
+ * {@link WindowManagerGlobalLockRule} won't apply to the method.
+ */
+ @Target(ElementType.METHOD)
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface NoGlobalLock {
+ String reason() default "";
+ }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java
new file mode 100644
index 0000000..86f0f8b
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerSettingsTests.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2019 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.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
+import static android.provider.Settings.Global.DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
+import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
+
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.ContentResolver;
+import android.net.Uri;
+import android.provider.Settings;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+
+/**
+ * Test for {@link WindowManagerService.SettingsObserver}.
+ *
+ * Build/Install/Run:
+ * atest WmTests:WindowManagerSettingsTests
+ */
+@SmallTest
+public class WindowManagerSettingsTests extends WindowTestsBase {
+
+ @Test
+ public void testForceDesktopModeOnExternalDisplays() {
+ try (SettingsSession forceDesktopModeSession = new
+ SettingsSession(DEVELOPMENT_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS)) {
+ final boolean forceDesktopMode = !forceDesktopModeSession.getSetting();
+ final Uri forceDesktopModeUri = forceDesktopModeSession.setSetting(forceDesktopMode);
+ mWm.mSettingsObserver.onChange(false, forceDesktopModeUri);
+
+ assertEquals(mWm.mForceDesktopModeOnExternalDisplays, forceDesktopMode);
+ }
+ }
+
+ @Test
+ public void testFreeformWindow() {
+ try (SettingsSession freeformWindowSession = new
+ SettingsSession(DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT)) {
+ final boolean freeformWindow = !freeformWindowSession.getSetting();
+ final Uri freeformWindowUri = freeformWindowSession.setSetting(freeformWindow);
+ mWm.mSettingsObserver.onChange(false, freeformWindowUri);
+
+ assertEquals(mWm.mAtmService.mSupportsFreeformWindowManagement, freeformWindow);
+ }
+ }
+
+ @Test
+ public void testForceResizableMode() {
+ try (SettingsSession forceResizableSession = new
+ SettingsSession(DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES)) {
+ final boolean forceResizableMode = !forceResizableSession.getSetting();
+ final Uri forceResizableUri = forceResizableSession.setSetting(forceResizableMode);
+ mWm.mSettingsObserver.onChange(false, forceResizableUri);
+
+ assertEquals(mWm.mAtmService.mForceResizableActivities, forceResizableMode);
+ }
+ }
+
+ private class SettingsSession implements AutoCloseable {
+
+ private static final int SETTING_VALUE_OFF = 0;
+ private static final int SETTING_VALUE_ON = 1;
+ private final String mSettingName;
+ private final int mInitialValue;
+
+ SettingsSession(String name) {
+ mSettingName = name;
+ mInitialValue = getSetting() ? SETTING_VALUE_ON : SETTING_VALUE_OFF;
+ }
+
+ boolean getSetting() {
+ return Settings.Global.getInt(getContentResolver(), mSettingName, 0) != 0;
+ }
+
+ Uri setSetting(boolean enable) {
+ Settings.Global.putInt(getContentResolver(), mSettingName,
+ enable ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
+ return Settings.Global.getUriFor(mSettingName);
+ }
+
+ private ContentResolver getContentResolver() {
+ return getInstrumentation().getTargetContext().getContentResolver();
+ }
+
+ @Override
+ public void close() {
+ setSetting(mInitialValue == SETTING_VALUE_ON);
+ }
+ }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index b731628..d5e8440 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -78,6 +78,7 @@
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.junit.runner.RunWith;
import java.util.LinkedList;
@@ -89,6 +90,7 @@
*/
@SmallTest
@Presubmit
+@RunWith(WindowTestRunner.class)
public class WindowStateTests extends WindowTestsBase {
private static int sPreviousNewInsetsMode;
@@ -111,11 +113,8 @@
// TODO: Let the insets source with new mode keep the visibility control, and remove this
// setup code. Now mTopFullscreenOpaqueWindowState will take back the control of insets
// visibility.
- // Hold the lock to protect the mock from accesssing by other threads.
- synchronized (mWm.mGlobalLock) {
- spyOn(mDisplayContent);
- doNothing().when(mDisplayContent).layoutAndAssignWindowLayersIfNeeded();
- }
+ spyOn(mDisplayContent);
+ doNothing().when(mDisplayContent).layoutAndAssignWindowLayersIfNeeded();
}
@Test
@@ -527,27 +526,25 @@
final float OFFSET_SUM =
PARENT_WINDOW_OFFSET + DISPLAY_IN_PARENT_WINDOW_OFFSET + WINDOW_OFFSET;
- synchronized (mWm.mGlobalLock) {
- final WindowState win0 = createWindow(null, TYPE_APPLICATION, "win0");
+ final WindowState win0 = createWindow(null, TYPE_APPLICATION, "win0");
- final DisplayContent dc = createNewDisplay();
- win0.getFrameLw().offsetTo(PARENT_WINDOW_OFFSET, 0);
- dc.reparentDisplayContent(win0, win0.getSurfaceControl());
- dc.updateLocation(win0, DISPLAY_IN_PARENT_WINDOW_OFFSET, 0);
+ final DisplayContent dc = createNewDisplay();
+ win0.getFrameLw().offsetTo(PARENT_WINDOW_OFFSET, 0);
+ dc.reparentDisplayContent(win0, win0.getSurfaceControl());
+ dc.updateLocation(win0, DISPLAY_IN_PARENT_WINDOW_OFFSET, 0);
- final float[] values = new float[9];
- final Matrix matrix = new Matrix();
- final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
- final WindowState win1 = createWindow(null, TYPE_APPLICATION, dc, "win1");
- win1.mHasSurface = true;
- win1.mSurfaceControl = mock(SurfaceControl.class);
- win1.getFrameLw().offsetTo(WINDOW_OFFSET, 0);
- win1.updateSurfacePosition(t);
- win1.getTransformationMatrix(values, matrix);
+ final float[] values = new float[9];
+ final Matrix matrix = new Matrix();
+ final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class);
+ final WindowState win1 = createWindow(null, TYPE_APPLICATION, dc, "win1");
+ win1.mHasSurface = true;
+ win1.mSurfaceControl = mock(SurfaceControl.class);
+ win1.getFrameLw().offsetTo(WINDOW_OFFSET, 0);
+ win1.updateSurfacePosition(t);
+ win1.getTransformationMatrix(values, matrix);
- matrix.getValues(values);
- assertEquals(OFFSET_SUM, values[Matrix.MTRANS_X], 0f);
- assertEquals(0f, values[Matrix.MTRANS_Y], 0f);
- }
+ matrix.getValues(values);
+ assertEquals(OFFSET_SUM, values[Matrix.MTRANS_X], 0f);
+ assertEquals(0f, values[Matrix.MTRANS_Y], 0f);
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestRunner.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestRunner.java
new file mode 100644
index 0000000..2b801e2
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestRunner.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2019 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 androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.internal.runners.statements.RunAfters;
+import org.junit.internal.runners.statements.RunBefores;
+import org.junit.rules.TestRule;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A runner with support to bind additional operations with test method tightly.
+ *
+ * @see MethodWrapperRule
+ */
+public class WindowTestRunner extends AndroidJUnit4ClassRunner {
+ private final List<FrameworkMethod> mBefores;
+ private final List<FrameworkMethod> mAfters;
+
+ public WindowTestRunner(Class<?> klass) throws InitializationError {
+ super(klass);
+ mBefores = getTestClass().getAnnotatedMethods(Before.class);
+ mAfters = getTestClass().getAnnotatedMethods(After.class);
+ }
+
+ @Override
+ protected Statement methodInvoker(FrameworkMethod method, Object test) {
+ return wrapStatement(super.methodInvoker(method, test), method, test);
+ }
+
+ private Statement wrapStatement(Statement statement, FrameworkMethod method, Object target) {
+ for (MethodWrapper wrapper : getMethodWrappers(target)) {
+ statement = wrapper.apply(statement, describeChild(method));
+ }
+ return statement;
+ }
+
+ /**
+ * Constructs the test statement with {@link Before}.
+ *
+ * @param method The test method.
+ * @param target The instance of test class.
+ * @param statement The next statement. It is usually the test method.
+ */
+ @Override
+ protected Statement withBefores(FrameworkMethod method, Object target, Statement statement) {
+ if (mBefores.isEmpty()) {
+ return statement;
+ }
+
+ final List<FrameworkMethod> befores = new ArrayList<>(mBefores.size());
+ for (FrameworkMethod before : mBefores) {
+ befores.add(wrapMethod(before, target));
+ }
+ return new RunBefores(statement, befores, target);
+ }
+
+ /**
+ * Constructs the test statement with {@link After}.
+ *
+ * @param method The test method.
+ * @param target The instance of test class.
+ * @param statement The next statement. If there are "before" methods, then it is the
+ * before-statement for the next test.
+ */
+ @Override
+ protected Statement withAfters(FrameworkMethod method, Object target, Statement statement) {
+ if (mAfters.isEmpty()) {
+ return statement;
+ }
+
+ final List<FrameworkMethod> afters = new ArrayList<>(mAfters.size());
+ for (FrameworkMethod after : mAfters) {
+ afters.add(wrapMethod(after, target));
+ }
+ return new RunAfters(statement, afters, target);
+ }
+
+ private FrameworkMethod wrapMethod(FrameworkMethod method, Object target) {
+ for (MethodWrapper wrapper : getMethodWrappers(target)) {
+ method = wrapper.apply(method);
+ }
+ return method;
+ }
+
+ private List<MethodWrapper> getMethodWrappers(Object target) {
+ return getTestClass().getAnnotatedFieldValues(
+ target, MethodWrapperRule.class, MethodWrapper.class);
+ }
+
+ /**
+ * If a {@link TestRule} is annotated with this, it can ensure the operation of the rule runs
+ * with the test method on the same path and thread.
+ * <p>
+ * The traditional {@link org.junit.Rule} may run on another thread if timeout is set. And if
+ * the rule will hold a lock which will be used in test method, it will cause deadlock such as
+ * "Instr: androidx.test.runner.AndroidJUnitRunner" and "Time-limited test" wait for each other.
+ * <p>
+ * This annotation only takes effect if the test runner is {@link WindowTestRunner}.
+ *
+ * @see org.junit.internal.runners.statements.FailOnTimeout
+ * @see org.junit.runners.BlockJUnit4ClassRunner#methodBlock
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target({ ElementType.FIELD, ElementType.METHOD })
+ @interface MethodWrapperRule {}
+
+ /**
+ * The interface to support wrapping test method, including {@link Before} and {@link After}.
+ */
+ interface MethodWrapper extends TestRule {
+ FrameworkMethod apply(FrameworkMethod base);
+ }
+}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
index d1cf1c3..8930e5a 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java
@@ -98,6 +98,10 @@
@Rule
public final SystemServicesTestRule mSystemServicesTestRule = new SystemServicesTestRule();
+ @WindowTestRunner.MethodWrapperRule
+ public final WindowManagerGlobalLockRule mLockRule =
+ new WindowManagerGlobalLockRule(mSystemServicesTestRule);
+
@BeforeClass
public static void setUpOnceBase() {
AttributeCache.init(getInstrumentation().getTargetContext());
@@ -205,7 +209,7 @@
* Waits until the main handler for WM has processed all messages.
*/
void waitUntilHandlersIdle() {
- mSystemServicesTestRule.waitUntilWindowManagerHandlersIdle();
+ mLockRule.waitUntilHandlersIdle();
}
private WindowToken createWindowToken(
diff --git a/services/usage/java/com/android/server/usage/UsageStatsProto.java b/services/usage/java/com/android/server/usage/UsageStatsProto.java
index 3e88d93..6d3f416 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsProto.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsProto.java
@@ -606,4 +606,37 @@
proto.flush();
}
+
+ // TODO: move to UsageStatsProtoV2
+ static void readPendingEvents(InputStream in, List<UsageEvents.Event> events)
+ throws IOException {
+ final ProtoInputStream proto = new ProtoInputStream(in);
+ final List<String> stringPool = new ArrayList<>();
+ final IntervalStats tmpStatsObj = new IntervalStats();
+ while (true) {
+ switch (proto.nextField()) {
+ case (int) IntervalStatsProto.PENDING_EVENTS:
+ loadEvent(proto, IntervalStatsProto.PENDING_EVENTS, tmpStatsObj, stringPool);
+ break;
+ case ProtoInputStream.NO_MORE_FIELDS:
+ final int eventCount = tmpStatsObj.events.size();
+ for (int i = 0; i < eventCount; i++) {
+ events.add(tmpStatsObj.events.get(i));
+ }
+ return;
+ }
+ }
+ }
+
+ // TODO: move to UsageStatsProtoV2
+ static void writePendingEvents(OutputStream out, List<UsageEvents.Event> events)
+ throws IOException {
+ final ProtoOutputStream proto = new ProtoOutputStream(out);
+ final IntervalStats tmpStatsObj = new IntervalStats();
+ final int eventCount = events.size();
+ for (int i = 0; i < eventCount; i++) {
+ writeEvent(proto, IntervalStatsProto.PENDING_EVENTS, tmpStatsObj, events.get(i));
+ }
+ proto.flush();
+ }
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 2bdeddf..fc464a1 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -18,14 +18,18 @@
import static android.app.usage.UsageEvents.Event.CHOOSER_ACTION;
import static android.app.usage.UsageEvents.Event.CONFIGURATION_CHANGE;
+import static android.app.usage.UsageEvents.Event.DEVICE_EVENT_PACKAGE_NAME;
import static android.app.usage.UsageEvents.Event.DEVICE_SHUTDOWN;
import static android.app.usage.UsageEvents.Event.FLUSH_TO_DISK;
import static android.app.usage.UsageEvents.Event.NOTIFICATION_INTERRUPTION;
import static android.app.usage.UsageEvents.Event.SHORTCUT_INVOCATION;
+import static android.app.usage.UsageEvents.Event.USER_STOPPED;
+import static android.app.usage.UsageEvents.Event.USER_UNLOCKED;
import static android.app.usage.UsageStatsManager.USAGE_SOURCE_CURRENT_ACTIVITY;
import static android.app.usage.UsageStatsManager.USAGE_SOURCE_TASK_ROOT_ACTIVITY;
import android.Manifest;
+import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.IUidObserver;
@@ -70,8 +74,10 @@
import android.os.UserManager;
import android.provider.Settings;
import android.util.ArraySet;
+import android.util.AtomicFile;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import com.android.internal.content.PackageMonitor;
@@ -81,11 +87,20 @@
import com.android.server.LocalServices;
import com.android.server.SystemService;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.File;
import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
import java.util.Arrays;
+import java.util.LinkedList;
import java.util.List;
import java.util.Set;
@@ -111,6 +126,12 @@
private static final boolean ENABLE_KERNEL_UPDATES = true;
private static final File KERNEL_COUNTER_FILE = new File("/proc/uid_procstat/set");
+ private static final File USAGE_STATS_LEGACY_DIR = new File(
+ Environment.getDataSystemDirectory(), "usagestats");
+ // For migration purposes, indicates whether to keep the legacy usage stats directory or not
+ // STOPSHIP: b/138323140 this should be false on launch
+ private static final boolean KEEP_LEGACY_DIR = true;
+
private static final char TOKEN_DELIMITER = '/';
// Handler message types.
@@ -119,6 +140,7 @@
static final int MSG_REMOVE_USER = 2;
static final int MSG_UID_STATE_CHANGED = 3;
static final int MSG_REPORT_EVENT_TO_ALL_USERID = 4;
+ static final int MSG_UNLOCKED_USER = 5;
private final Object mLock = new Object();
Handler mHandler;
@@ -132,8 +154,8 @@
DevicePolicyManagerInternal mDpmInternal;
private final SparseArray<UserUsageStatsService> mUserState = new SparseArray<>();
+ private final SparseBooleanArray mUserUnlockedStates = new SparseBooleanArray();
private final SparseIntArray mUidToKernelCounter = new SparseIntArray();
- private File mUsageStatsDir;
long mRealTimeSnapshot;
long mSystemTimeSnapshot;
int mUsageSource;
@@ -144,6 +166,8 @@
/** Manages app time limit observers */
AppTimeLimitController mAppTimeLimit;
+ // A map maintaining a queue of events to be reported per user.
+ private final SparseArray<LinkedList<Event>> mReportedEvents = new SparseArray<>();
final SparseArray<ArraySet<String>> mUsageReporters = new SparseArray();
final SparseArray<ActivityData> mVisibleActivities = new SparseArray();
@@ -165,7 +189,7 @@
SystemClock.elapsedRealtime());
event.mBucketAndReason = (bucket << 16) | (reason & 0xFFFF);
event.mPackage = packageName;
- mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget();
+ reportEventOrAddToQueue(userId, event);
}
@Override
@@ -223,30 +247,17 @@
}, mHandler.getLooper());
mAppStandby.addListener(mStandbyChangeListener);
- File systemDataDir = new File(Environment.getDataDirectory(), "system");
- mUsageStatsDir = new File(systemDataDir, "usagestats");
- mUsageStatsDir.mkdirs();
- if (!mUsageStatsDir.exists()) {
- throw new IllegalStateException("Usage stats directory does not exist: "
- + mUsageStatsDir.getAbsolutePath());
- }
IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
filter.addAction(Intent.ACTION_USER_STARTED);
getContext().registerReceiverAsUser(new UserActionsReceiver(), UserHandle.ALL, filter,
null, mHandler);
- synchronized (mLock) {
- cleanUpRemovedUsersLocked();
- }
-
mRealTimeSnapshot = SystemClock.elapsedRealtime();
mSystemTimeSnapshot = System.currentTimeMillis();
publishLocalService(UsageStatsManagerInternal.class, new LocalService());
publishBinderService(Context.USAGE_STATS_SERVICE, new BinderService());
- // Make sure we initialize the data, in case job scheduler needs it early.
- getUserDataAndInitializeIfNeededLocked(UserHandle.USER_SYSTEM, mSystemTimeSnapshot);
}
@Override
@@ -275,6 +286,85 @@
}
}
+ @Override
+ public void onStartUser(UserInfo userInfo) {
+ // Create an entry in the user state map to indicate that the user has been started but
+ // not necessarily unlocked. This will ensure that reported events are flushed to disk
+ // event if the user is never unlocked (following the logic in #flushToDiskLocked)
+ mUserState.put(userInfo.id, null);
+ super.onStartUser(userInfo);
+ }
+
+ @Override
+ public void onUnlockUser(@NonNull UserInfo userInfo) {
+ mHandler.obtainMessage(MSG_UNLOCKED_USER, userInfo.id, 0).sendToTarget();
+ super.onUnlockUser(userInfo);
+ }
+
+ @Override
+ public void onStopUser(@NonNull UserInfo userInfo) {
+ synchronized (mLock) {
+ // User was started but never unlocked so no need to report a user stopped event
+ if (!mUserUnlockedStates.get(userInfo.id)) {
+ persistPendingEventsLocked(userInfo.id);
+ super.onStopUser(userInfo);
+ return;
+ }
+
+ // Report a user stopped event before persisting all stats to disk via the user service
+ final Event event = new Event(USER_STOPPED, SystemClock.elapsedRealtime());
+ event.mPackage = Event.DEVICE_EVENT_PACKAGE_NAME;
+ reportEvent(event, userInfo.id);
+ final UserUsageStatsService userService = mUserState.get(userInfo.id);
+ if (userService != null) {
+ userService.userStopped();
+ }
+ mUserUnlockedStates.put(userInfo.id, false);
+ mUserState.put(userInfo.id, null); // release the service (mainly for GC)
+ }
+ super.onStopUser(userInfo);
+ }
+
+ private void onUserUnlocked(int userId) {
+ synchronized (mLock) {
+ // Create a user unlocked event to report
+ final Event unlockEvent = new Event(USER_UNLOCKED, SystemClock.elapsedRealtime());
+ unlockEvent.mPackage = Event.DEVICE_EVENT_PACKAGE_NAME;
+
+ migrateStatsToSystemCeIfNeededLocked(userId);
+
+ // Read pending reported events from disk and merge them with those stored in memory
+ final LinkedList<Event> pendingEvents = new LinkedList<>();
+ loadPendingEventsLocked(userId, pendingEvents);
+ final LinkedList<Event> eventsInMem = mReportedEvents.get(userId);
+ if (eventsInMem != null) {
+ pendingEvents.addAll(eventsInMem);
+ }
+ boolean needToFlush = !pendingEvents.isEmpty();
+
+ mUserUnlockedStates.put(userId, true);
+ final UserUsageStatsService userService = getUserDataAndInitializeIfNeededLocked(
+ userId, System.currentTimeMillis());
+ userService.userUnlocked(checkAndGetTimeLocked());
+ // Process all the pending reported events
+ while (pendingEvents.peek() != null) {
+ reportEvent(pendingEvents.poll(), userId);
+ }
+ reportEvent(unlockEvent, userId);
+
+ // Remove all the stats stored in memory and in system DE.
+ mReportedEvents.remove(userId);
+ deleteRecursively(new File(Environment.getDataSystemDeDirectory(userId), "usagestats"));
+ // Force a flush to disk for the current user to ensure important events are persisted.
+ // Note: there is a very very small chance that the system crashes between deleting
+ // the stats above from DE and persisting them to CE here in which case we will lose
+ // those events that were in memory and deleted from DE. (b/139836090)
+ if (needToFlush) {
+ userService.persistActiveStats();
+ }
+ }
+ }
+
private DevicePolicyManagerInternal getDpmInternal() {
if (mDpmInternal == null) {
mDpmInternal = LocalServices.getService(DevicePolicyManagerInternal.class);
@@ -350,33 +440,6 @@
return !mPackageManagerInternal.canAccessInstantApps(callingUid, userId);
}
- private void cleanUpRemovedUsersLocked() {
- final List<UserInfo> users = mUserManager.getUsers(true);
- if (users == null || users.size() == 0) {
- throw new IllegalStateException("There can't be no users");
- }
-
- ArraySet<String> toDelete = new ArraySet<>();
- String[] fileNames = mUsageStatsDir.list();
- if (fileNames == null) {
- // No users to delete.
- return;
- }
-
- toDelete.addAll(Arrays.asList(fileNames));
-
- final int userCount = users.size();
- for (int i = 0; i < userCount; i++) {
- final UserInfo userInfo = users.get(i);
- toDelete.remove(Integer.toString(userInfo.id));
- }
-
- final int deleteCount = toDelete.size();
- for (int i = 0; i < deleteCount; i++) {
- deleteRecursively(new File(mUsageStatsDir, toDelete.valueAt(i)));
- }
- }
-
private static void deleteRecursively(File f) {
File[] files = f.listFiles();
if (files != null) {
@@ -385,7 +448,7 @@
}
}
- if (!f.delete()) {
+ if (f.exists() && !f.delete()) {
Slog.e(TAG, "Failed to delete " + f);
}
}
@@ -394,14 +457,117 @@
long currentTimeMillis) {
UserUsageStatsService service = mUserState.get(userId);
if (service == null) {
- service = new UserUsageStatsService(getContext(), userId,
- new File(mUsageStatsDir, Integer.toString(userId)), this);
- service.init(currentTimeMillis);
+ final File usageStatsDir = new File(Environment.getDataSystemCeDirectory(userId),
+ "usagestats");
+ service = new UserUsageStatsService(getContext(), userId, usageStatsDir, this);
+ if (mUserUnlockedStates.get(userId)) {
+ service.init(currentTimeMillis);
+ }
mUserState.put(userId, service);
}
return service;
}
+ private void migrateStatsToSystemCeIfNeededLocked(int userId) {
+ final File usageStatsDir = new File(Environment.getDataSystemCeDirectory(userId),
+ "usagestats");
+ if (!usageStatsDir.mkdirs() && !usageStatsDir.exists()) {
+ throw new IllegalStateException("Usage stats directory does not exist: "
+ + usageStatsDir.getAbsolutePath());
+ }
+ // Check if the migrated status file exists - if not, migrate usage stats.
+ final File migrated = new File(usageStatsDir, "migrated");
+ if (migrated.exists()) {
+ try (BufferedReader reader = new BufferedReader(new FileReader(migrated))) {
+ final int previousVersion = Integer.parseInt(reader.readLine());
+ // UsageStatsDatabase.BACKUP_VERSION was 4 when usage stats were migrated to CE.
+ if (previousVersion >= 4) {
+ deleteLegacyDir(userId);
+ return;
+ }
+ // If migration logic needs to be changed in a future version, do it here.
+ } catch (NumberFormatException | IOException e) {
+ Slog.e(TAG, "Failed to read migration status file, possibly corrupted.");
+ deleteRecursively(usageStatsDir);
+ if (usageStatsDir.exists()) {
+ Slog.e(TAG, "Unable to delete usage stats CE directory.");
+ throw new RuntimeException(e);
+ } else {
+ // Make the directory again since previous migration was not complete
+ if (!usageStatsDir.mkdirs() && !usageStatsDir.exists()) {
+ throw new IllegalStateException("Usage stats directory does not exist: "
+ + usageStatsDir.getAbsolutePath());
+ }
+ }
+ }
+ }
+
+ Slog.i(TAG, "Starting migration to system CE for user " + userId);
+ final File legacyUserDir = new File(USAGE_STATS_LEGACY_DIR, Integer.toString(userId));
+ if (legacyUserDir.exists()) {
+ copyRecursively(usageStatsDir, legacyUserDir);
+ }
+ // Create a status file to indicate that the migration to CE has been completed.
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(migrated))) {
+ writer.write(Integer.toString(UsageStatsDatabase.BACKUP_VERSION));
+ writer.write("\n");
+ writer.flush();
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to write migrated status file");
+ throw new RuntimeException(e);
+ }
+ Slog.i(TAG, "Finished migration to system CE for user " + userId);
+
+ // Migration was successful - delete the legacy directory
+ deleteLegacyDir(userId);
+ }
+
+ private static void copyRecursively(final File parent, File f) {
+ final File[] files = f.listFiles();
+ if (files == null) {
+ try {
+ Files.copy(f.toPath(), new File(parent, f.getName()).toPath(),
+ StandardCopyOption.REPLACE_EXISTING);
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to move usage stats file : " + f.toString());
+ throw new RuntimeException(e);
+ }
+ return;
+ }
+
+ for (int i = files.length - 1; i >= 0; i--) {
+ File newParent = parent;
+ if (files[i].isDirectory()) {
+ newParent = new File(parent, files[i].getName());
+ final boolean mkdirSuccess = newParent.mkdirs();
+ if (!mkdirSuccess && !newParent.exists()) {
+ throw new IllegalStateException(
+ "Failed to create usage stats directory during migration: "
+ + newParent.getAbsolutePath());
+ }
+ }
+ copyRecursively(newParent, files[i]);
+ }
+ }
+
+ private void deleteLegacyDir(int userId) {
+ final File legacyUserDir = new File(USAGE_STATS_LEGACY_DIR, Integer.toString(userId));
+ if (!KEEP_LEGACY_DIR) {
+ deleteRecursively(legacyUserDir);
+ if (legacyUserDir.exists()) {
+ Slog.w(TAG, "Error occurred while attempting to delete legacy usage stats "
+ + "dir for user " + userId);
+ }
+ // If all users have been migrated, delete the parent legacy usage stats directory
+ if (USAGE_STATS_LEGACY_DIR.list() != null
+ && USAGE_STATS_LEGACY_DIR.list().length == 0) {
+ if (!USAGE_STATS_LEGACY_DIR.delete()) {
+ Slog.w(TAG, "Error occurred while attempting to delete legacy usage stats dir");
+ }
+ }
+ }
+ }
+
/**
* This should be the only way to get the time from the system.
*/
@@ -463,11 +629,95 @@
mHandler.sendEmptyMessage(MSG_FLUSH_TO_DISK);
}
+ private void loadPendingEventsLocked(int userId, LinkedList<Event> pendingEvents) {
+ final File usageStatsDeDir = new File(Environment.getDataSystemDeDirectory(userId),
+ "usagestats");
+ final File[] pendingEventsFiles = usageStatsDeDir.listFiles();
+ if (pendingEventsFiles == null || pendingEventsFiles.length == 0) {
+ return;
+ }
+ Arrays.sort(pendingEventsFiles);
+
+ for (int i = 0; i < pendingEventsFiles.length; i++) {
+ final AtomicFile af = new AtomicFile(pendingEventsFiles[i]);
+ try {
+ try (FileInputStream in = af.openRead()) {
+ UsageStatsProto.readPendingEvents(in, pendingEvents);
+ }
+ } catch (IOException e) {
+ // Even if one file read fails, exit here to keep all events in order on disk -
+ // they will be read and processed the next time user is unlocked.
+ Slog.e(TAG, "Could not read " + pendingEventsFiles[i] + " for user " + userId);
+ pendingEvents.clear();
+ return;
+ }
+ }
+ }
+
+ private void persistPendingEventsLocked(int userId) {
+ final LinkedList<Event> pendingEvents = mReportedEvents.get(userId);
+ if (pendingEvents == null || pendingEvents.isEmpty()) {
+ return;
+ }
+
+ final File usageStatsDeDir = new File(Environment.getDataSystemDeDirectory(userId),
+ "usagestats");
+ if (!usageStatsDeDir.mkdirs() && !usageStatsDeDir.exists()) {
+ throw new IllegalStateException("Usage stats DE directory does not exist: "
+ + usageStatsDeDir.getAbsolutePath());
+ }
+ final File pendingEventsFile = new File(usageStatsDeDir,
+ "pendingevents_" + System.currentTimeMillis());
+ final AtomicFile af = new AtomicFile(pendingEventsFile);
+ FileOutputStream fos = null;
+ try {
+ fos = af.startWrite();
+ UsageStatsProto.writePendingEvents(fos, pendingEvents);
+ af.finishWrite(fos);
+ fos = null;
+ pendingEvents.clear();
+ } catch (IOException e) {
+ Slog.e(TAG, "Failed to write " + pendingEventsFile.getAbsolutePath()
+ + " for user " + userId);
+ } finally {
+ af.failWrite(fos); // when fos is null (successful write), this will no-op
+ }
+ }
+
+ private void reportEventOrAddToQueue(int userId, Event event) {
+ synchronized (mLock) {
+ if (mUserUnlockedStates.get(userId)) {
+ mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget();
+ return;
+ }
+
+ final LinkedList<Event> events = mReportedEvents.get(userId, new LinkedList<>());
+ events.add(event);
+ if (mReportedEvents.get(userId) == null) {
+ mReportedEvents.put(userId, events);
+ }
+ if (events.size() == 1) {
+ // Every time a file is persisted to disk, mReportedEvents is cleared for this user
+ // so trigger a flush to disk every time the first event has been added.
+ mHandler.sendEmptyMessageDelayed(MSG_FLUSH_TO_DISK, FLUSH_INTERVAL);
+ }
+ }
+ }
+
/**
* Called by the Binder stub.
*/
void reportEvent(Event event, int userId) {
synchronized (mLock) {
+ // This should never be called directly when the user is locked
+ if (!mUserUnlockedStates.get(userId)) {
+ Slog.wtf(TAG, "Failed to report event for locked user " + userId
+ + " (" + event.mPackage + "/" + event.mClass
+ + " eventType:" + event.mEventType
+ + " instanceId:" + event.mInstanceId + ")");
+ return;
+ }
+
final long timeNow = checkAndGetTimeLocked();
final long elapsedRealtime = SystemClock.elapsedRealtime();
convertToSystemTimeLocked(event);
@@ -581,7 +831,7 @@
final int userCount = mUserState.size();
for (int i = 0; i < userCount; i++) {
Event copy = new Event(event);
- reportEvent(copy, mUserState.keyAt(i));
+ reportEventOrAddToQueue(mUserState.keyAt(i), copy);
}
}
}
@@ -597,6 +847,7 @@
// The FLUSH_TO_DISK event is an internal event, it will not show up in IntervalStats'
// EventList.
Event event = new Event(FLUSH_TO_DISK, SystemClock.elapsedRealtime());
+ event.mPackage = DEVICE_EVENT_PACKAGE_NAME;
reportEventToAllUserId(event);
flushToDiskLocked();
}
@@ -611,7 +862,6 @@
mUserState.remove(userId);
mAppStandby.onUserRemoved(userId);
mAppTimeLimit.onUserRemoved(userId);
- cleanUpRemovedUsersLocked();
}
}
@@ -621,6 +871,11 @@
List<UsageStats> queryUsageStats(int userId, int bucketType, long beginTime, long endTime,
boolean obfuscateInstantApps) {
synchronized (mLock) {
+ if (!mUserUnlockedStates.get(userId)) {
+ Slog.w(TAG, "Failed to query usage stats for locked user " + userId);
+ return null;
+ }
+
final long timeNow = checkAndGetTimeLocked();
if (!validRange(timeNow, beginTime, endTime)) {
return null;
@@ -643,7 +898,6 @@
}
}
}
-
return list;
}
}
@@ -654,6 +908,11 @@
List<ConfigurationStats> queryConfigurationStats(int userId, int bucketType, long beginTime,
long endTime) {
synchronized (mLock) {
+ if (!mUserUnlockedStates.get(userId)) {
+ Slog.w(TAG, "Failed to query configuration stats for locked user " + userId);
+ return null;
+ }
+
final long timeNow = checkAndGetTimeLocked();
if (!validRange(timeNow, beginTime, endTime)) {
return null;
@@ -671,6 +930,11 @@
List<EventStats> queryEventStats(int userId, int bucketType, long beginTime,
long endTime) {
synchronized (mLock) {
+ if (!mUserUnlockedStates.get(userId)) {
+ Slog.w(TAG, "Failed to query event stats for locked user " + userId);
+ return null;
+ }
+
final long timeNow = checkAndGetTimeLocked();
if (!validRange(timeNow, beginTime, endTime)) {
return null;
@@ -688,6 +952,11 @@
UsageEvents queryEvents(int userId, long beginTime, long endTime,
boolean shouldObfuscateInstantApps) {
synchronized (mLock) {
+ if (!mUserUnlockedStates.get(userId)) {
+ Slog.w(TAG, "Failed to query events for locked user " + userId);
+ return null;
+ }
+
final long timeNow = checkAndGetTimeLocked();
if (!validRange(timeNow, beginTime, endTime)) {
return null;
@@ -705,6 +974,11 @@
UsageEvents queryEventsForPackage(int userId, long beginTime, long endTime,
String packageName, boolean includeTaskRoot) {
synchronized (mLock) {
+ if (!mUserUnlockedStates.get(userId)) {
+ Slog.w(TAG, "Failed to query package events for locked user " + userId);
+ return null;
+ }
+
final long timeNow = checkAndGetTimeLocked();
if (!validRange(timeNow, beginTime, endTime)) {
return null;
@@ -731,9 +1005,14 @@
private void flushToDiskLocked() {
final int userCount = mUserState.size();
for (int i = 0; i < userCount; i++) {
- UserUsageStatsService service = mUserState.valueAt(i);
+ final int userId = mUserState.keyAt(i);
+ if (!mUserUnlockedStates.get(userId)) {
+ persistPendingEventsLocked(userId);
+ continue;
+ }
+ UserUsageStatsService service = mUserState.get(userId);
service.persistActiveStats();
- mAppStandby.flushToDisk(mUserState.keyAt(i));
+ mAppStandby.flushToDisk(userId);
}
mAppStandby.flushDurationsToDisk();
@@ -833,6 +1112,18 @@
} else if ("appstandby".equals(arg)) {
mAppStandby.dumpState(args, pw);
return;
+ } else if ("stats-directory".equals(arg)) {
+ final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
+ final int userId;
+ try {
+ userId = Integer.valueOf(args[i + 1]);
+ } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
+ ipw.println("invalid user specified.");
+ return;
+ }
+ ipw.println(new File(Environment.getDataSystemCeDirectory(userId),
+ "usagestats").getAbsolutePath());
+ return;
} else if (arg != null && !arg.startsWith("-")) {
// Anything else that doesn't start with '-' is a pkg to filter
pkg = arg;
@@ -887,7 +1178,9 @@
case MSG_FLUSH_TO_DISK:
flushToDisk();
break;
-
+ case MSG_UNLOCKED_USER:
+ onUserUnlocked(msg.arg1);
+ break;
case MSG_REMOVE_USER:
onUserRemoved(msg.arg1);
break;
@@ -1368,7 +1661,7 @@
event.mAction = action;
event.mContentType = contentType;
event.mContentAnnotations = annotations;
- mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget();
+ reportEventOrAddToQueue(userId, event);
}
@Override
@@ -1640,7 +1933,7 @@
event.mTaskRootPackage = taskRoot.getPackageName();
event.mTaskRootClass = taskRoot.getClassName();
}
- mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget();
+ reportEventOrAddToQueue(userId, event);
}
@Override
@@ -1652,7 +1945,7 @@
Event event = new Event(eventType, SystemClock.elapsedRealtime());
event.mPackage = packageName;
- mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget();
+ reportEventOrAddToQueue(userId, event);
}
@Override
@@ -1665,7 +1958,7 @@
Event event = new Event(CONFIGURATION_CHANGE, SystemClock.elapsedRealtime());
event.mPackage = "android";
event.mConfiguration = new Configuration(config);
- mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget();
+ reportEventOrAddToQueue(userId, event);
}
@Override
@@ -1679,7 +1972,7 @@
Event event = new Event(NOTIFICATION_INTERRUPTION, SystemClock.elapsedRealtime());
event.mPackage = packageName.intern();
event.mNotificationChannelId = channelId.intern();
- mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget();
+ reportEventOrAddToQueue(userId, event);
}
@Override
@@ -1692,7 +1985,7 @@
Event event = new Event(SHORTCUT_INVOCATION, SystemClock.elapsedRealtime());
event.mPackage = packageName.intern();
event.mShortcutId = shortcutId.intern();
- mHandler.obtainMessage(MSG_REPORT_EVENT, userId, 0, event).sendToTarget();
+ reportEventOrAddToQueue(userId, event);
}
@Override
@@ -1749,8 +2042,13 @@
@Override
public byte[] getBackupPayload(int user, String key) {
- // Check to ensure that only user 0's data is b/r for now
synchronized (mLock) {
+ if (!mUserUnlockedStates.get(user)) {
+ Slog.w(TAG, "Failed to get backup payload for locked user " + user);
+ return null;
+ }
+
+ // Check to ensure that only user 0's data is b/r for now
if (user == UserHandle.USER_SYSTEM) {
final UserUsageStatsService userStats =
getUserDataAndInitializeIfNeededLocked(user, checkAndGetTimeLocked());
@@ -1764,6 +2062,11 @@
@Override
public void applyRestoredPayload(int user, String key, byte[] payload) {
synchronized (mLock) {
+ if (!mUserUnlockedStates.get(user)) {
+ Slog.w(TAG, "Failed to apply restored payload for locked user " + user);
+ return;
+ }
+
if (user == UserHandle.USER_SYSTEM) {
final UserUsageStatsService userStats =
getUserDataAndInitializeIfNeededLocked(user, checkAndGetTimeLocked());
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index 11c0e4a..6fbd882 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -156,6 +156,15 @@
}
}
+ void userUnlocked(long currentTimeMillis) {
+ init(currentTimeMillis);
+ }
+
+ void userStopped() {
+ // Flush events to disk immediately to guarantee persistence.
+ persistActiveStats();
+ }
+
void onTimeChanged(long oldTime, long newTime) {
persistActiveStats();
mDatabase.onTimeChanged(newTime - oldTime);
diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java
index 61f425e..c1b8479 100644
--- a/telephony/java/android/provider/Telephony.java
+++ b/telephony/java/android/provider/Telephony.java
@@ -3943,9 +3943,10 @@
}
/**
- * Contains received SMS cell broadcast messages.
+ * Contains received SMS cell broadcast messages. More details are available in 3GPP TS 23.041.
* @hide
*/
+ @SystemApi
public static final class CellBroadcasts implements BaseColumns {
/**
@@ -3957,30 +3958,52 @@
/**
* The {@code content://} URI for this table.
*/
+ @NonNull
public static final Uri CONTENT_URI = Uri.parse("content://cellbroadcasts");
/**
- * Message geographical scope.
+ * Message geographical scope. Valid values are:
+ * <ul>
+ * <li>{@link android.telephony.SmsCbMessage#GEOGRAPHICAL_SCOPE_CELL_WIDE}. meaning the
+ * message is for the radio service cell</li>
+ * <li>{@link android.telephony.SmsCbMessage#GEOGRAPHICAL_SCOPE_CELL_WIDE_IMMEDIATE},
+ * meaning the message is for the radio service cell and immediately displayed</li>
+ * <li>{@link android.telephony.SmsCbMessage#GEOGRAPHICAL_SCOPE_PLMN_WIDE}, meaning the
+ * message is for the PLMN (i.e. MCC/MNC)</li>
+ * <li>{@link android.telephony.SmsCbMessage#GEOGRAPHICAL_SCOPE_LOCATION_AREA_WIDE},
+ * meaning the message is for the location area (in GSM) or service area (in UMTS)</li>
+ * </ul>
+ *
+ * <p>A message meant for a particular scope is automatically dismissed when the device
+ * exits that scope.</p>
* <P>Type: INTEGER</P>
*/
public static final String GEOGRAPHICAL_SCOPE = "geo_scope";
/**
* Message serial number.
+ * <p>
+ * A 16-bit integer which identifies a particular CBS (cell
+ * broadcast short message service) message. The core network is responsible for
+ * allocating this value, and the value may be managed cyclically (3GPP TS 23.041 section
+ * 9.2.1) once the serial message has been incremented a sufficient number of times.
+ * </p>
* <P>Type: INTEGER</P>
*/
public static final String SERIAL_NUMBER = "serial_number";
/**
- * PLMN of broadcast sender. {@code SERIAL_NUMBER + PLMN + LAC + CID} uniquely identifies
- * a broadcast for duplicate detection purposes.
+ * PLMN (i.e. MCC/MNC) of broadcast sender. {@code SERIAL_NUMBER + PLMN + LAC + CID}
+ * uniquely identifies a broadcast for duplicate detection purposes.
* <P>Type: TEXT</P>
*/
public static final String PLMN = "plmn";
/**
- * Location Area (GSM) or Service Area (UMTS) of broadcast sender. Unused for CDMA.
- * Only included if Geographical Scope of message is not PLMN wide (01).
+ * Location area code (LAC).
+ * <p>Code representing location area (GSM) or service area (UMTS) of broadcast sender.
+ * Unused for CDMA. Only included if Geographical Scope of message is not PLMN wide (01).
+ * This value is sent by the network based on the cell tower.
* <P>Type: INTEGER</P>
*/
public static final String LAC = "lac";
@@ -3995,23 +4018,29 @@
/**
* Message code. <em>OBSOLETE: merged into SERIAL_NUMBER.</em>
* <P>Type: INTEGER</P>
+ * @hide
*/
public static final String V1_MESSAGE_CODE = "message_code";
/**
* Message identifier. <em>OBSOLETE: renamed to SERVICE_CATEGORY.</em>
* <P>Type: INTEGER</P>
+ * @hide
*/
public static final String V1_MESSAGE_IDENTIFIER = "message_id";
/**
- * Service category (GSM/UMTS: message identifier; CDMA: service category).
+ * Service category which represents the general topic of the message.
+ * <p>
+ * For GSM/UMTS: message identifier (see 3GPP TS 23.041 section 9.4.1.2.2)
+ * For CDMA: a 16-bit CDMA service category (see 3GPP2 C.R1001-D section 9.3)
+ * </p>
* <P>Type: INTEGER</P>
*/
public static final String SERVICE_CATEGORY = "service_category";
/**
- * Message language code.
+ * Message language code. (See 3GPP TS 23.041 section 9.4.1.2.3 for details).
* <P>Type: TEXT</P>
*/
public static final String LANGUAGE_CODE = "language";
@@ -4024,6 +4053,7 @@
/**
* Message delivery time.
+ * <p>This value is a system timestamp using {@link System#currentTimeMillis}</p>
* <P>Type: INTEGER (long)</P>
*/
public static final String DELIVERY_TIME = "date";
@@ -4035,25 +4065,36 @@
public static final String MESSAGE_READ = "read";
/**
- * Message format (3GPP or 3GPP2).
+ * Message format ({@link android.telephony.SmsCbMessage#MESSAGE_FORMAT_3GPP} or
+ * {@link android.telephony.SmsCbMessage#MESSAGE_FORMAT_3GPP2}).
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_FORMAT = "format";
/**
- * Message priority (including emergency).
+ * Message priority.
+ * <p>This includes
+ * <ul>
+ * <li>{@link android.telephony.SmsCbMessage#MESSAGE_PRIORITY_NORMAL}</li>
+ * <li>{@link android.telephony.SmsCbMessage#MESSAGE_PRIORITY_INTERACTIVE}</li>
+ * <li>{@link android.telephony.SmsCbMessage#MESSAGE_PRIORITY_URGENT}</li>
+ * <li>{@link android.telephony.SmsCbMessage#MESSAGE_PRIORITY_EMERGENCY}</li>
+ * </p>
+ * </ul>
* <P>Type: INTEGER</P>
*/
public static final String MESSAGE_PRIORITY = "priority";
/**
- * ETWS warning type (ETWS alerts only).
+ * ETWS (Earthquake and Tsunami Warning System) warning type (ETWS alerts only).
+ * <p>See {@link android.telephony.SmsCbEtwsInfo}</p>
* <P>Type: INTEGER</P>
*/
public static final String ETWS_WARNING_TYPE = "etws_warning_type";
/**
- * CMAS message class (CMAS alerts only).
+ * CMAS (Commercial Mobile Alert System) message class (CMAS alerts only).
+ * <p>See {@link android.telephony.SmsCbCmasInfo}</p>
* <P>Type: INTEGER</P>
*/
public static final String CMAS_MESSAGE_CLASS = "cmas_message_class";
@@ -4094,12 +4135,14 @@
/**
* The timestamp in millisecond of when the device received the message.
* <P>Type: BIGINT</P>
+ * @hide
*/
public static final String RECEIVED_TIME = "received_time";
/**
* Indicates that whether the message has been broadcasted to the application.
* <P>Type: BOOLEAN</P>
+ * @hide
*/
public static final String MESSAGE_BROADCASTED = "message_broadcasted";
@@ -4135,12 +4178,15 @@
* "circle|0,0|100;polygon|0,0|0,1.5|1,1|1,0;circle|100.123,100|200.123"
*
* <P>Type: TEXT</P>
+ * @hide
*/
public static final String GEOMETRIES = "geometries";
/**
* Query columns for instantiating {@link android.telephony.CellBroadcastMessage} objects.
+ * @hide
*/
+ @NonNull
public static final String[] QUERY_COLUMNS = {
_ID,
GEOGRAPHICAL_SCOPE,
@@ -4166,6 +4212,7 @@
/**
* Query columns for instantiating {@link android.telephony.SmsCbMessage} objects.
+ * @hide
*/
public static final String[] QUERY_COLUMNS_FWK = {
_ID,
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 2651346..a985a6b 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -369,15 +369,16 @@
/**
* Create a new ServiceState from a intent notifier Bundle
*
- * This method is used by PhoneStateIntentReceiver and maybe by
+ * This method is used by PhoneStateIntentReceiver, CellBroadcastReceiver, and maybe by
* external applications.
*
* @param m Bundle from intent notifier
* @return newly created ServiceState
* @hide
*/
+ @NonNull
@UnsupportedAppUsage
- public static ServiceState newFromBundle(Bundle m) {
+ public static ServiceState newFromBundle(@NonNull Bundle m) {
ServiceState ret;
ret = new ServiceState();
ret.setFromNotifierBundle(m);
diff --git a/telephony/java/com/android/internal/telephony/SmsCbCmasInfo.java b/telephony/java/android/telephony/SmsCbCmasInfo.java
similarity index 72%
rename from telephony/java/com/android/internal/telephony/SmsCbCmasInfo.java
rename to telephony/java/android/telephony/SmsCbCmasInfo.java
index c912924..2c10a09 100644
--- a/telephony/java/com/android/internal/telephony/SmsCbCmasInfo.java
+++ b/telephony/java/android/telephony/SmsCbCmasInfo.java
@@ -16,17 +16,25 @@
package android.telephony;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
- * Contains CMAS warning notification Type 1 elements for a {@link SmsCbMessage}.
+ * Contains CMAS (Commercial Mobile Alert System) warning notification Type 1 elements for a
+ * {@link SmsCbMessage}.
* Supported values for each element are defined in TIA-1149-0-1 (CMAS over CDMA) and
* 3GPP TS 23.041 (for GSM/UMTS).
*
* {@hide}
*/
-public class SmsCbCmasInfo implements Parcelable {
+@SystemApi
+public final class SmsCbCmasInfo implements Parcelable {
// CMAS message class (in GSM/UMTS message identifier or CDMA service category).
@@ -54,6 +62,21 @@
/** CMAS category for warning types that are reserved for future extension. */
public static final int CMAS_CLASS_UNKNOWN = -1;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"CMAS_CLASS_"},
+ value = {
+ CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT,
+ CMAS_CLASS_EXTREME_THREAT,
+ CMAS_CLASS_SEVERE_THREAT,
+ CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY,
+ CMAS_CLASS_REQUIRED_MONTHLY_TEST,
+ CMAS_CLASS_CMAS_EXERCISE,
+ CMAS_CLASS_OPERATOR_DEFINED_USE,
+ CMAS_CLASS_UNKNOWN,
+ })
+ public @interface Class {}
+
// CMAS alert category (in CDMA type 1 elements record).
/** CMAS alert category: Geophysical including landslide. */
@@ -98,6 +121,26 @@
*/
public static final int CMAS_CATEGORY_UNKNOWN = -1;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"CMAS_CATEORY_"},
+ value = {
+ CMAS_CATEGORY_GEO,
+ CMAS_CATEGORY_MET,
+ CMAS_CATEGORY_SAFETY,
+ CMAS_CATEGORY_SECURITY,
+ CMAS_CATEGORY_RESCUE,
+ CMAS_CATEGORY_FIRE,
+ CMAS_CATEGORY_HEALTH,
+ CMAS_CATEGORY_ENV,
+ CMAS_CATEGORY_TRANSPORT,
+ CMAS_CATEGORY_INFRA,
+ CMAS_CATEGORY_CBRNE,
+ CMAS_CATEGORY_OTHER,
+ CMAS_CATEGORY_UNKNOWN,
+ })
+ public @interface Category {}
+
// CMAS response type (in CDMA type 1 elements record).
/** CMAS response type: Take shelter in place. */
@@ -130,6 +173,22 @@
*/
public static final int CMAS_RESPONSE_TYPE_UNKNOWN = -1;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"CMAS_RESPONSE_TYPE_"},
+ value = {
+ CMAS_RESPONSE_TYPE_SHELTER,
+ CMAS_RESPONSE_TYPE_EVACUATE,
+ CMAS_RESPONSE_TYPE_PREPARE,
+ CMAS_RESPONSE_TYPE_EXECUTE,
+ CMAS_RESPONSE_TYPE_MONITOR,
+ CMAS_RESPONSE_TYPE_AVOID,
+ CMAS_RESPONSE_TYPE_ASSESS,
+ CMAS_RESPONSE_TYPE_NONE,
+ CMAS_RESPONSE_TYPE_UNKNOWN,
+ })
+ public @interface ResponseType {}
+
// 4-bit CMAS severity (in GSM/UMTS message identifier or CDMA type 1 elements record).
/** CMAS severity type: Extraordinary threat to life or property. */
@@ -145,6 +204,16 @@
*/
public static final int CMAS_SEVERITY_UNKNOWN = -1;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"CMAS_SEVERITY_"},
+ value = {
+ CMAS_SEVERITY_EXTREME,
+ CMAS_SEVERITY_SEVERE,
+ CMAS_SEVERITY_UNKNOWN,
+ })
+ public @interface Severity {}
+
// CMAS urgency (in GSM/UMTS message identifier or CDMA type 1 elements record).
/** CMAS urgency type: Responsive action should be taken immediately. */
@@ -160,6 +229,16 @@
*/
public static final int CMAS_URGENCY_UNKNOWN = -1;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"CMAS_URGENCY_"},
+ value = {
+ CMAS_URGENCY_IMMEDIATE,
+ CMAS_URGENCY_EXPECTED,
+ CMAS_URGENCY_UNKNOWN,
+ })
+ public @interface Urgency {}
+
// CMAS certainty (in GSM/UMTS message identifier or CDMA type 1 elements record).
/** CMAS certainty type: Determined to have occurred or to be ongoing. */
@@ -175,27 +254,38 @@
*/
public static final int CMAS_CERTAINTY_UNKNOWN = -1;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"CMAS_CERTAINTY_"},
+ value = {
+ CMAS_CERTAINTY_OBSERVED,
+ CMAS_CERTAINTY_LIKELY,
+ CMAS_CERTAINTY_UNKNOWN,
+ })
+ public @interface Certainty {}
+
/** CMAS message class. */
- private final int mMessageClass;
+ private final @Class int mMessageClass;
/** CMAS category. */
- private final int mCategory;
+ private final @Category int mCategory;
/** CMAS response type. */
- private final int mResponseType;
+ private final @ResponseType int mResponseType;
/** CMAS severity. */
- private final int mSeverity;
+ private final @Severity int mSeverity;
/** CMAS urgency. */
- private final int mUrgency;
+ private final @Urgency int mUrgency;
/** CMAS certainty. */
- private final int mCertainty;
+ private final @Certainty int mCertainty;
/** Create a new SmsCbCmasInfo object with the specified values. */
- public SmsCbCmasInfo(int messageClass, int category, int responseType, int severity,
- int urgency, int certainty) {
+ public SmsCbCmasInfo(@Class int messageClass, @Category int category,
+ @ResponseType int responseType,
+ @Severity int severity, @Urgency int urgency, @Certainty int certainty) {
mMessageClass = messageClass;
mCategory = category;
mResponseType = responseType;
@@ -234,7 +324,7 @@
* Returns the CMAS message class, e.g. {@link #CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT}.
* @return one of the {@code CMAS_CLASS} values
*/
- public int getMessageClass() {
+ public @Class int getMessageClass() {
return mMessageClass;
}
@@ -242,7 +332,7 @@
* Returns the CMAS category, e.g. {@link #CMAS_CATEGORY_GEO}.
* @return one of the {@code CMAS_CATEGORY} values
*/
- public int getCategory() {
+ public @Category int getCategory() {
return mCategory;
}
@@ -250,7 +340,7 @@
* Returns the CMAS response type, e.g. {@link #CMAS_RESPONSE_TYPE_SHELTER}.
* @return one of the {@code CMAS_RESPONSE_TYPE} values
*/
- public int getResponseType() {
+ public @ResponseType int getResponseType() {
return mResponseType;
}
@@ -258,7 +348,7 @@
* Returns the CMAS severity, e.g. {@link #CMAS_SEVERITY_EXTREME}.
* @return one of the {@code CMAS_SEVERITY} values
*/
- public int getSeverity() {
+ public @Severity int getSeverity() {
return mSeverity;
}
@@ -266,15 +356,16 @@
* Returns the CMAS urgency, e.g. {@link #CMAS_URGENCY_IMMEDIATE}.
* @return one of the {@code CMAS_URGENCY} values
*/
- public int getUrgency() {
+ public @Urgency int getUrgency() {
return mUrgency;
}
/**
* Returns the CMAS certainty, e.g. {@link #CMAS_CERTAINTY_OBSERVED}.
+ *
* @return one of the {@code CMAS_CERTAINTY} values
*/
- public int getCertainty() {
+ public @Certainty int getCertainty() {
return mCertainty;
}
@@ -287,6 +378,7 @@
/**
* Describe the kinds of special objects contained in the marshalled representation.
+ *
* @return a bitmask indicating this Parcelable contains no special objects
*/
@Override
@@ -295,8 +387,9 @@
}
/** Creator for unparcelling objects. */
- public static final Parcelable.Creator<SmsCbCmasInfo>
- CREATOR = new Parcelable.Creator<SmsCbCmasInfo>() {
+ @NonNull
+ public static final Parcelable.Creator<SmsCbCmasInfo> CREATOR =
+ new Parcelable.Creator<SmsCbCmasInfo>() {
@Override
public SmsCbCmasInfo createFromParcel(Parcel in) {
return new SmsCbCmasInfo(in);
diff --git a/telephony/java/com/android/internal/telephony/SmsCbEtwsInfo.java b/telephony/java/android/telephony/SmsCbEtwsInfo.java
similarity index 71%
rename from telephony/java/com/android/internal/telephony/SmsCbEtwsInfo.java
rename to telephony/java/android/telephony/SmsCbEtwsInfo.java
index 15fbc40..2a7f7ad 100644
--- a/telephony/java/com/android/internal/telephony/SmsCbEtwsInfo.java
+++ b/telephony/java/android/telephony/SmsCbEtwsInfo.java
@@ -16,22 +16,29 @@
package android.telephony;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.telephony.uicc.IccUtils;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Arrays;
/**
- * Contains information elements for a GSM or UMTS ETWS warning notification.
- * Supported values for each element are defined in 3GPP TS 23.041.
+ * Contains information elements for a GSM or UMTS ETWS (Earthquake and Tsunami Warning
+ * System) warning notification. Supported values for each element are defined in 3GPP TS 23.041.
*
* {@hide}
*/
-public class SmsCbEtwsInfo implements Parcelable {
+@SystemApi
+public final class SmsCbEtwsInfo implements Parcelable {
/** ETWS warning type for earthquake. */
public static final int ETWS_WARNING_TYPE_EARTHQUAKE = 0x00;
@@ -51,17 +58,30 @@
/** Unknown ETWS warning type. */
public static final int ETWS_WARNING_TYPE_UNKNOWN = -1;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(prefix = {"ETWS_WARNING_TYPE_"},
+ value = {
+ ETWS_WARNING_TYPE_EARTHQUAKE,
+ ETWS_WARNING_TYPE_TSUNAMI,
+ ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI,
+ ETWS_WARNING_TYPE_TEST_MESSAGE,
+ ETWS_WARNING_TYPE_OTHER_EMERGENCY,
+ ETWS_WARNING_TYPE_UNKNOWN,
+ })
+ public @interface WarningType {}
+
/** One of the ETWS warning type constants defined in this class. */
- private final int mWarningType;
+ private final @WarningType int mWarningType;
/** Whether or not to activate the emergency user alert tone and vibration. */
- private final boolean mEmergencyUserAlert;
+ private final boolean mIsEmergencyUserAlert;
/** Whether or not to activate a popup alert. */
- private final boolean mActivatePopup;
+ private final boolean mIsPopupAlert;
/** Whether ETWS primary message or not/ */
- private final boolean mPrimary;
+ private final boolean mIsPrimary;
/**
* 50-byte security information (ETWS primary notification for GSM only). As of Release 10,
@@ -70,24 +90,35 @@
* parceled with the broadcast intent if present, but the timestamp is only computed if an
* application asks for the individual components.
*/
+ @Nullable
private final byte[] mWarningSecurityInformation;
- /** Create a new SmsCbEtwsInfo object with the specified values. */
- public SmsCbEtwsInfo(int warningType, boolean emergencyUserAlert, boolean activatePopup,
- boolean primary, byte[] warningSecurityInformation) {
+ /**
+ * Create a new SmsCbEtwsInfo object with the specified values.
+ * @param warningType the type of ETWS warning
+ * @param isEmergencyUserAlert whether the warning is an emergency alert, which will activate
+ * the user alert tone and vibration
+ * @param isPopupAlert whether the warning will activate a popup alert
+ * @param isPrimary whether this is an ETWS primary message
+ * @param warningSecurityInformation 50-byte security information (for primary notifications
+ * on GSM only).
+ */
+ public SmsCbEtwsInfo(@WarningType int warningType, boolean isEmergencyUserAlert,
+ boolean isPopupAlert,
+ boolean isPrimary, @Nullable byte[] warningSecurityInformation) {
mWarningType = warningType;
- mEmergencyUserAlert = emergencyUserAlert;
- mActivatePopup = activatePopup;
- mPrimary = primary;
+ mIsEmergencyUserAlert = isEmergencyUserAlert;
+ mIsPopupAlert = isPopupAlert;
+ mIsPrimary = isPrimary;
mWarningSecurityInformation = warningSecurityInformation;
}
/** Create a new SmsCbEtwsInfo object from a Parcel. */
SmsCbEtwsInfo(Parcel in) {
mWarningType = in.readInt();
- mEmergencyUserAlert = (in.readInt() != 0);
- mActivatePopup = (in.readInt() != 0);
- mPrimary = (in.readInt() != 0);
+ mIsEmergencyUserAlert = (in.readInt() != 0);
+ mIsPopupAlert = (in.readInt() != 0);
+ mIsPrimary = (in.readInt() != 0);
mWarningSecurityInformation = in.createByteArray();
}
@@ -100,9 +131,9 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mWarningType);
- dest.writeInt(mEmergencyUserAlert ? 1 : 0);
- dest.writeInt(mActivatePopup ? 1 : 0);
- dest.writeInt(mPrimary ? 1 : 0);
+ dest.writeInt(mIsEmergencyUserAlert ? 1 : 0);
+ dest.writeInt(mIsPopupAlert ? 1 : 0);
+ dest.writeInt(mIsPrimary ? 1 : 0);
dest.writeByteArray(mWarningSecurityInformation);
}
@@ -110,16 +141,17 @@
* Returns the ETWS warning type.
* @return a warning type such as {@link #ETWS_WARNING_TYPE_EARTHQUAKE}
*/
- public int getWarningType() {
+ public @WarningType int getWarningType() {
return mWarningType;
}
/**
- * Returns the ETWS emergency user alert flag.
+ * Returns the ETWS emergency user alert flag. If the ETWS message is an emergency alert, it
+ * will activate an alert tone and vibration.
* @return true to notify terminal to activate emergency user alert; false otherwise
*/
public boolean isEmergencyUserAlert() {
- return mEmergencyUserAlert;
+ return mIsEmergencyUserAlert;
}
/**
@@ -127,7 +159,7 @@
* @return true to notify terminal to activate display popup; false otherwise
*/
public boolean isPopupAlert() {
- return mActivatePopup;
+ return mIsPopupAlert;
}
/**
@@ -135,7 +167,7 @@
* @return true if the message is primary message, otherwise secondary message
*/
public boolean isPrimary() {
- return mPrimary;
+ return mIsPrimary;
}
/**
@@ -188,6 +220,7 @@
* 3GPP TS 23.041 states that the UE shall ignore this value if received.
* @return a byte array containing a copy of the primary notification digital signature
*/
+ @Nullable
public byte[] getPrimaryNotificationSignature() {
if (mWarningSecurityInformation == null || mWarningSecurityInformation.length < 50) {
return null;
@@ -198,7 +231,7 @@
@Override
public String toString() {
return "SmsCbEtwsInfo{warningType=" + mWarningType + ", emergencyUserAlert="
- + mEmergencyUserAlert + ", activatePopup=" + mActivatePopup + '}';
+ + mIsEmergencyUserAlert + ", activatePopup=" + mIsPopupAlert + '}';
}
/**
@@ -211,6 +244,7 @@
}
/** Creator for unparcelling objects. */
+ @NonNull
public static final Creator<SmsCbEtwsInfo> CREATOR = new Creator<SmsCbEtwsInfo>() {
@Override
public SmsCbEtwsInfo createFromParcel(Parcel in) {
diff --git a/telephony/java/com/android/internal/telephony/SmsCbLocation.java b/telephony/java/android/telephony/SmsCbLocation.java
similarity index 90%
rename from telephony/java/com/android/internal/telephony/SmsCbLocation.java
rename to telephony/java/android/telephony/SmsCbLocation.java
index 6eb72a86..adf7154 100644
--- a/telephony/java/com/android/internal/telephony/SmsCbLocation.java
+++ b/telephony/java/android/telephony/SmsCbLocation.java
@@ -16,6 +16,9 @@
package android.telephony;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -27,9 +30,11 @@
*
* @hide
*/
-public class SmsCbLocation implements Parcelable {
+@SystemApi
+public final class SmsCbLocation implements Parcelable {
- /** The PLMN. Note that this field may be an empty string, but isn't allowed to be null. */
+ /** The PLMN. Note that this field may be an empty string. */
+ @NonNull
private final String mPlmn;
private final int mLac;
@@ -38,6 +43,7 @@
/**
* Construct an empty location object. This is used for some test cases, and for
* cell broadcasts saved in older versions of the database without location info.
+ * @hide
*/
public SmsCbLocation() {
mPlmn = "";
@@ -48,6 +54,7 @@
/**
* Construct a location object for the PLMN. This class is immutable, so
* the same object can be reused for multiple broadcasts.
+ * @hide
*/
public SmsCbLocation(String plmn) {
mPlmn = plmn;
@@ -58,6 +65,7 @@
/**
* Construct a location object for the PLMN, LAC, and Cell ID. This class is immutable, so
* the same object can be reused for multiple broadcasts.
+ * @hide
*/
public SmsCbLocation(String plmn, int lac, int cid) {
mPlmn = plmn;
@@ -67,6 +75,7 @@
/**
* Initialize the object from a Parcel.
+ * @hide
*/
public SmsCbLocation(Parcel in) {
mPlmn = in.readString();
@@ -78,6 +87,7 @@
* Returns the MCC/MNC of the network as a String.
* @return the PLMN identifier (MCC+MNC) as a String
*/
+ @NonNull
public String getPlmn() {
return mPlmn;
}
@@ -129,7 +139,7 @@
* @param area the location area to compare with this location
* @return true if this location is contained within the specified location area
*/
- public boolean isInLocationArea(SmsCbLocation area) {
+ public boolean isInLocationArea(@NonNull SmsCbLocation area) {
if (mCid != -1 && mCid != area.mCid) {
return false;
}
@@ -147,7 +157,7 @@
* @param cid the Cell ID to compare with
* @return true if this location is contained within the specified PLMN, LAC, and Cell ID
*/
- public boolean isInLocationArea(String plmn, int lac, int cid) {
+ public boolean isInLocationArea(@Nullable String plmn, int lac, int cid) {
if (!mPlmn.equals(plmn)) {
return false;
}
@@ -176,8 +186,9 @@
dest.writeInt(mCid);
}
- public static final Parcelable.Creator<SmsCbLocation> CREATOR
- = new Parcelable.Creator<SmsCbLocation>() {
+ @NonNull
+ public static final Parcelable.Creator<SmsCbLocation> CREATOR =
+ new Parcelable.Creator<SmsCbLocation>() {
@Override
public SmsCbLocation createFromParcel(Parcel in) {
return new SmsCbLocation(in);
diff --git a/telephony/java/com/android/internal/telephony/SmsCbMessage.java b/telephony/java/android/telephony/SmsCbMessage.java
similarity index 91%
rename from telephony/java/com/android/internal/telephony/SmsCbMessage.java
rename to telephony/java/android/telephony/SmsCbMessage.java
index b9edb9f..77231d1 100644
--- a/telephony/java/com/android/internal/telephony/SmsCbMessage.java
+++ b/telephony/java/android/telephony/SmsCbMessage.java
@@ -16,7 +16,10 @@
package android.telephony;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Parcel;
@@ -26,6 +29,8 @@
import com.android.internal.telephony.CbGeoUtils;
import com.android.internal.telephony.CbGeoUtils.Geometry;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
@@ -70,9 +75,11 @@
*
* @hide
*/
-public class SmsCbMessage implements Parcelable {
+@SystemApi
+public final class SmsCbMessage implements Parcelable {
- protected static final String LOG_TAG = "SMSCB";
+ /** @hide */
+ public static final String LOG_TAG = "SMSCB";
/** Cell wide geographical scope with immediate display (GSM/UMTS only). */
public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE_IMMEDIATE = 0;
@@ -81,17 +88,35 @@
public static final int GEOGRAPHICAL_SCOPE_PLMN_WIDE = 1;
/** Location / service area wide geographical scope (GSM/UMTS only). */
- public static final int GEOGRAPHICAL_SCOPE_LA_WIDE = 2;
+ public static final int GEOGRAPHICAL_SCOPE_LOCATION_AREA_WIDE = 2;
/** Cell wide geographical scope (GSM/UMTS only). */
public static final int GEOGRAPHICAL_SCOPE_CELL_WIDE = 3;
+ /** @hide */
+ @IntDef(prefix = { "GEOGRAPHICAL_SCOPE_" }, value = {
+ GEOGRAPHICAL_SCOPE_CELL_WIDE_IMMEDIATE,
+ GEOGRAPHICAL_SCOPE_PLMN_WIDE,
+ GEOGRAPHICAL_SCOPE_LOCATION_AREA_WIDE,
+ GEOGRAPHICAL_SCOPE_CELL_WIDE,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface GeographicalScope {}
+
/** GSM or UMTS format cell broadcast. */
public static final int MESSAGE_FORMAT_3GPP = 1;
/** CDMA format cell broadcast. */
public static final int MESSAGE_FORMAT_3GPP2 = 2;
+ /** @hide */
+ @IntDef(prefix = { "MESSAGE_FORMAT_" }, value = {
+ MESSAGE_FORMAT_3GPP,
+ MESSAGE_FORMAT_3GPP2
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface MessageFormat {}
+
/** Normal message priority. */
public static final int MESSAGE_PRIORITY_NORMAL = 0;
@@ -104,6 +129,16 @@
/** Emergency message priority. */
public static final int MESSAGE_PRIORITY_EMERGENCY = 3;
+ /** @hide */
+ @IntDef(prefix = { "MESSAGE_PRIORITY_" }, value = {
+ MESSAGE_PRIORITY_NORMAL,
+ MESSAGE_PRIORITY_INTERACTIVE,
+ MESSAGE_PRIORITY_URGENT,
+ MESSAGE_PRIORITY_EMERGENCY,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface MessagePriority {}
+
/** Format of this message (for interpretation of service category values). */
private final int mMessageFormat;
@@ -123,6 +158,7 @@
* message is not binary 01, the Location Area is included for comparison. If the GS is
* 00 or 11, the Cell ID is also included. LAC and Cell ID are -1 if not specified.
*/
+ @NonNull
private final SmsCbLocation mLocation;
/**
@@ -133,18 +169,22 @@
private final int mServiceCategory;
/** Message language, as a two-character string, e.g. "en". */
+ @Nullable
private final String mLanguage;
/** Message body, as a String. */
+ @Nullable
private final String mBody;
/** Message priority (including emergency priority). */
private final int mPriority;
/** ETWS warning notification information (ETWS warnings only). */
+ @Nullable
private final SmsCbEtwsInfo mEtwsWarningInfo;
/** CMAS warning notification information (CMAS warnings only). */
+ @Nullable
private final SmsCbCmasInfo mCmasWarningInfo;
/** UNIX timestamp of when the message was received. */
@@ -157,8 +197,9 @@
* Create a new SmsCbMessage with the specified data.
*/
public SmsCbMessage(int messageFormat, int geographicalScope, int serialNumber,
- SmsCbLocation location, int serviceCategory, String language, String body,
- int priority, SmsCbEtwsInfo etwsWarningInfo, SmsCbCmasInfo cmasWarningInfo) {
+ @NonNull SmsCbLocation location, int serviceCategory, @Nullable String language,
+ @Nullable String body, int priority, @Nullable SmsCbEtwsInfo etwsWarningInfo,
+ @Nullable SmsCbCmasInfo cmasWarningInfo) {
this(messageFormat, geographicalScope, serialNumber, location, serviceCategory, language,
body, priority, etwsWarningInfo, cmasWarningInfo, null /* geometries */,
@@ -167,6 +208,7 @@
/**
* Create a new {@link SmsCbMessage} with the warning area coordinates information.
+ * @hide
*/
public SmsCbMessage(int messageFormat, int geographicalScope, int serialNumber,
SmsCbLocation location, int serviceCategory, String language, String body,
@@ -186,8 +228,11 @@
mGeometries = geometries;
}
- /** Create a new SmsCbMessage object from a Parcel. */
- public SmsCbMessage(Parcel in) {
+ /**
+ * Create a new SmsCbMessage object from a Parcel.
+ * @hide
+ */
+ public SmsCbMessage(@NonNull Parcel in) {
mMessageFormat = in.readInt();
mGeographicalScope = in.readInt();
mSerialNumber = in.readInt();
@@ -252,8 +297,9 @@
mGeometries != null ? CbGeoUtils.encodeGeometriesToString(mGeometries) : null);
}
- public static final Parcelable.Creator<SmsCbMessage> CREATOR
- = new Parcelable.Creator<SmsCbMessage>() {
+ @NonNull
+ public static final Parcelable.Creator<SmsCbMessage> CREATOR =
+ new Parcelable.Creator<SmsCbMessage>() {
@Override
public SmsCbMessage createFromParcel(Parcel in) {
return new SmsCbMessage(in);
@@ -270,7 +316,7 @@
*
* @return Geographical scope
*/
- public int getGeographicalScope() {
+ public @GeographicalScope int getGeographicalScope() {
return mGeographicalScope;
}
@@ -294,7 +340,8 @@
*
* @return the geographical location code for duplicate message detection
*/
- public SmsCbLocation getLocation() {
+ @NonNull
+ public android.telephony.SmsCbLocation getLocation() {
return mLocation;
}
@@ -315,6 +362,7 @@
*
* @return Language code
*/
+ @Nullable
public String getLanguageCode() {
return mLanguage;
}
@@ -324,6 +372,7 @@
*
* @return Body, or null
*/
+ @Nullable
public String getMessageBody() {
return mBody;
}
@@ -332,6 +381,7 @@
* Get the warning area coordinates information represent by polygons and circles.
* @return a list of geometries, {@link Nullable} means there is no coordinate information
* associated to this message.
+ * @hide
*/
@Nullable
public List<Geometry> getGeometries() {
@@ -350,7 +400,7 @@
* Get the message format ({@link #MESSAGE_FORMAT_3GPP} or {@link #MESSAGE_FORMAT_3GPP2}).
* @return an integer representing 3GPP or 3GPP2 message format
*/
- public int getMessageFormat() {
+ public @MessageFormat int getMessageFormat() {
return mMessageFormat;
}
@@ -360,7 +410,7 @@
* {@link #MESSAGE_PRIORITY_INTERACTIVE} or {@link #MESSAGE_PRIORITY_URGENT}.
* @return an integer representing the message priority
*/
- public int getMessagePriority() {
+ public @MessagePriority int getMessagePriority() {
return mPriority;
}
@@ -373,6 +423,7 @@
*
* @return an SmsCbEtwsInfo object, or null if this is not an ETWS warning notification
*/
+ @Nullable
public SmsCbEtwsInfo getEtwsWarningInfo() {
return mEtwsWarningInfo;
}
@@ -387,13 +438,14 @@
*
* @return an SmsCbCmasInfo object, or null if this is not a CMAS warning notification
*/
+ @Nullable
public SmsCbCmasInfo getCmasWarningInfo() {
return mCmasWarningInfo;
}
/**
* Return whether this message is an emergency (PWS) message type.
- * @return true if the message is a public warning notification; false otherwise
+ * @return true if the message is an emergency notification; false otherwise
*/
public boolean isEmergencyMessage() {
return mPriority == MESSAGE_PRIORITY_EMERGENCY;
@@ -440,6 +492,7 @@
/**
* @return the {@link ContentValues} instance that includes the cell broadcast data.
*/
+ @NonNull
public ContentValues getContentValues() {
ContentValues cv = new ContentValues(16);
cv.put(CellBroadcasts.GEOGRAPHICAL_SCOPE, mGeographicalScope);
@@ -491,7 +544,8 @@
* @return a {@link SmsCbMessage} instance.
* @throws IllegalArgumentException if one of the required columns is missing
*/
- public static SmsCbMessage createFromCursor(Cursor cursor) {
+ @NonNull
+ public static SmsCbMessage createFromCursor(@NonNull Cursor cursor) {
int geoScope = cursor.getInt(
cursor.getColumnIndexOrThrow(CellBroadcasts.GEOGRAPHICAL_SCOPE));
int serialNum = cursor.getInt(cursor.getColumnIndexOrThrow(CellBroadcasts.SERIAL_NUMBER));
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index cd0f57e..8c14cb4 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -1670,15 +1670,14 @@
*
* @param messageIdentifier Message identifier as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
- * @param ranType as defined in class SmsManager, the value can be one of these:
- * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM
- * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA
+ * @param ranType the message format as defined in {@link SmsCbMessage]
* @return true if successful, false otherwise
* @see #disableCellBroadcast(int, int)
*
* {@hide}
*/
- public boolean enableCellBroadcast(int messageIdentifier, int ranType) {
+ public boolean enableCellBroadcast(int messageIdentifier,
+ @android.telephony.SmsCbMessage.MessageFormat int ranType) {
boolean success = false;
try {
@@ -1717,16 +1716,15 @@
*
* @param messageIdentifier Message identifier as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
- * @param ranType as defined in class SmsManager, the value can be one of these:
- * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM
- * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA
+ * @param ranType the message format as defined in {@link SmsCbMessage}
* @return true if successful, false otherwise
*
* @see #enableCellBroadcast(int, int)
*
* {@hide}
*/
- public boolean disableCellBroadcast(int messageIdentifier, int ranType) {
+ public boolean disableCellBroadcast(int messageIdentifier,
+ @android.telephony.SmsCbMessage.MessageFormat int ranType) {
boolean success = false;
try {
@@ -1746,8 +1744,8 @@
/**
* Enable reception of cell broadcast (SMS-CB) messages with the given
- * message identifier range and RAN type. The RAN type specify this message ID
- * belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients enable
+ * message identifier range and RAN type. The RAN type specifies if this message ID
+ * belongs to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients enable
* the same message identifier, they must both disable it for the device to stop
* receiving those messages. All received messages will be broadcast in an
* intent with the action "android.provider.Telephony.SMS_CB_RECEIVED".
@@ -1759,26 +1757,29 @@
* dialog. If this method is called on a device that has multiple active subscriptions, this
* {@link SmsManager} instance has been created with {@link #getDefault()}, and no user-defined
* default subscription is defined, the subscription ID associated with this message will be
- * INVALID, which will result in the operation being completed on the subscription associated
- * with logical slot 0. Use {@link #getSmsManagerForSubscriptionId(int)} to ensure the
- * operation is performed on the correct subscription.
+ * {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID}, which will result in the operation
+ * being completed on the subscription associated with logical slot 0. Use
+ * {@link #getSmsManagerForSubscriptionId(int)} to ensure the operation is performed on the
+ * correct subscription.
* </p>
*
+ * <p>Requires {@link android.Manifest.permission#RECEIVE_EMERGENCY_BROADCAST}</p>
+ *
* @param startMessageId first message identifier as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
* @param endMessageId last message identifier as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
- * @param ranType as defined in class SmsManager, the value can be one of these:
- * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM
- * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA
- * @return true if successful, false otherwise
+ * @param ranType the message format as defined in {@link SmsCbMessage}
+ * @return true if successful, false if the modem reports a failure (e.g. the given range or
+ * RAN type is invalid).
* @see #disableCellBroadcastRange(int, int, int)
*
* @throws IllegalArgumentException if endMessageId < startMessageId
* {@hide}
*/
- @UnsupportedAppUsage
- public boolean enableCellBroadcastRange(int startMessageId, int endMessageId, int ranType) {
+ @SystemApi
+ public boolean enableCellBroadcastRange(int startMessageId, int endMessageId,
+ @android.telephony.SmsCbMessage.MessageFormat int ranType) {
boolean success = false;
if (endMessageId < startMessageId) {
@@ -1818,22 +1819,24 @@
* operation is performed on the correct subscription.
* </p>
*
+ * <p>Requires {@link android.Manifest.permission#RECEIVE_EMERGENCY_BROADCAST}</p>
+ *
* @param startMessageId first message identifier as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
* @param endMessageId last message identifier as specified in TS 23.041 (3GPP)
* or C.R1001-G (3GPP2)
- * @param ranType as defined in class SmsManager, the value can be one of these:
- * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM
- * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA
- * @return true if successful, false otherwise
+ * @param ranType the message format as defined in {@link SmsCbMessage}
+ * @return true if successful, false if the modem reports a failure (e.g. the given range or
+ * RAN type is invalid).
*
* @see #enableCellBroadcastRange(int, int, int)
*
* @throws IllegalArgumentException if endMessageId < startMessageId
* {@hide}
*/
- @UnsupportedAppUsage
- public boolean disableCellBroadcastRange(int startMessageId, int endMessageId, int ranType) {
+ @SystemApi
+ public boolean disableCellBroadcastRange(int startMessageId, int endMessageId,
+ @android.telephony.SmsCbMessage.MessageFormat int ranType) {
boolean success = false;
if (endMessageId < startMessageId) {
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index d702cf1..d3cba2e 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -2291,14 +2291,19 @@
}
/**
- * Returns the resources associated with Subscription.
+ * Returns the {@link Resources} from the given {@link Context} for the MCC/MNC associated with
+ * the subscription. If the subscription ID is invalid, the base resources are returned instead.
+ *
+ * Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ *
* @param context Context object
- * @param subId Subscription Id of Subscription who's resources are required
+ * @param subId Subscription Id of Subscription whose resources are required
* @return Resources associated with Subscription.
* @hide
*/
- @UnsupportedAppUsage
- public static Resources getResourcesForSubId(Context context, int subId) {
+ @NonNull
+ @SystemApi
+ public static Resources getResourcesForSubId(@NonNull Context context, int subId) {
return getResourcesForSubId(context, subId, false);
}
diff --git a/telephony/java/android/telephony/cdma/CdmaSmsCbProgramData.java b/telephony/java/android/telephony/cdma/CdmaSmsCbProgramData.java
index 010ad2b..5f2f75d 100644
--- a/telephony/java/android/telephony/cdma/CdmaSmsCbProgramData.java
+++ b/telephony/java/android/telephony/cdma/CdmaSmsCbProgramData.java
@@ -16,6 +16,7 @@
package android.telephony.cdma;
+import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
@@ -28,7 +29,7 @@
*
* {@hide}
*/
-public class CdmaSmsCbProgramData implements Parcelable {
+public final class CdmaSmsCbProgramData implements Parcelable {
/** Delete the specified service category from the list of enabled categories. */
public static final int OPERATION_DELETE_CATEGORY = 0;
@@ -95,7 +96,7 @@
/** Create a new CdmaSmsCbProgramData object with the specified values. */
public CdmaSmsCbProgramData(int operation, int category, int language, int maxMessages,
- int alertOption, String categoryName) {
+ int alertOption, @NonNull String categoryName) {
mOperation = operation;
mCategory = category;
mLanguage = language;
@@ -174,6 +175,7 @@
* Returns the service category name, in the language specified by {@link #getLanguage()}.
* @return an optional service category name
*/
+ @NonNull
public String getCategoryName() {
return mCategoryName;
}
diff --git a/tests/permission/src/com/android/framework/permission/tests/SmsManagerPermissionTest.java b/tests/permission/src/com/android/framework/permission/tests/SmsManagerPermissionTest.java
index 273943f..4172743 100644
--- a/tests/permission/src/com/android/framework/permission/tests/SmsManagerPermissionTest.java
+++ b/tests/permission/src/com/android/framework/permission/tests/SmsManagerPermissionTest.java
@@ -16,12 +16,12 @@
package com.android.framework.permission.tests;
-import java.util.ArrayList;
-
import android.telephony.SmsManager;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
+import java.util.ArrayList;
+
/**
* Verify that SmsManager apis cannot be called without required permissions.
*/
@@ -32,6 +32,10 @@
private static final String DEST_NUMBER = "4567";
private static final String SRC_NUMBER = "1234";
+ private static final int CELL_BROADCAST_MESSAGE_ID_START = 10;
+ private static final int CELL_BROADCAST_MESSAGE_ID_END = 20;
+ private static final int CELL_BROADCAST_GSM_RAN_TYPE = 0;
+
/**
* Verify that SmsManager.sendTextMessage requires permissions.
* <p>Tests Permission:
@@ -82,4 +86,34 @@
// expected
}
}
+
+ /**
+ * Verify that SmsManager.enableCellBroadcastRange requires permissions.
+ * <p>Tests system permission: android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST
+ */
+ @SmallTest
+ public void testEnableCellBroadcastRange() {
+ try {
+ SmsManager.getDefault().enableCellBroadcastRange(CELL_BROADCAST_MESSAGE_ID_START,
+ CELL_BROADCAST_MESSAGE_ID_END, CELL_BROADCAST_GSM_RAN_TYPE);
+ fail("SmsManager.sendDataMessage did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
+
+ /**
+ * Verify that SmsManager.disableCellBroadcastRange requires permissions.
+ * <p>Tests system permission: android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST
+ */
+ @SmallTest
+ public void testDisableCellBroadcastRange() {
+ try {
+ SmsManager.getDefault().disableCellBroadcastRange(CELL_BROADCAST_MESSAGE_ID_START,
+ CELL_BROADCAST_MESSAGE_ID_END, CELL_BROADCAST_GSM_RAN_TYPE);
+ fail("SmsManager.sendDataMessage did not throw SecurityException as expected");
+ } catch (SecurityException e) {
+ // expected
+ }
+ }
}