Merge "Remove obsolete methods from DumpstateListener implementations"
diff --git a/api/current.txt b/api/current.txt
index afacaa8..fe78138 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6794,6 +6794,7 @@
method @WorkerThread public int setGlobalPrivateDnsModeSpecifiedHost(@NonNull android.content.ComponentName, @NonNull String);
method public void setGlobalSetting(@NonNull android.content.ComponentName, String, String);
method public void setKeepUninstalledPackages(@Nullable android.content.ComponentName, @NonNull java.util.List<java.lang.String>);
+ method public boolean setKeyGrantForApp(@Nullable android.content.ComponentName, @NonNull String, @NonNull String, boolean);
method public boolean setKeyPairCertificate(@Nullable android.content.ComponentName, @NonNull String, @NonNull java.util.List<java.security.cert.Certificate>, boolean);
method public boolean setKeyguardDisabled(@NonNull android.content.ComponentName, boolean);
method public void setKeyguardDisabledFeatures(@NonNull android.content.ComponentName, int);
diff --git a/api/test-current.txt b/api/test-current.txt
index 8e6ff30..46a0e1b 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -2869,6 +2869,11 @@
method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setTransportType(int);
}
+ public class PhoneNumberUtils {
+ method public static int getMinMatchForTest();
+ method public static void setMinMatchForTest(int);
+ }
+
public class ServiceState implements android.os.Parcelable {
method public void addNetworkRegistrationInfo(android.telephony.NetworkRegistrationInfo);
method public void setCdmaSystemAndNetworkId(int, int);
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index bfbf667..35c4ceb 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -328,7 +328,8 @@
221 [(log_from_module) = "textclassifier"];
LanguageDetectionEvent language_detection_event =
222 [(log_from_module) = "textclassifier"];
-
+ ExclusionRectStateChanged exclusion_rect_state_changed = 223;
+ BackGesture back_gesture_reported_reported = 224;
}
// Pulled events will start at field 10000.
@@ -2510,6 +2511,41 @@
optional State state = 1;
}
+message BackGesture {
+ enum BackType {
+ DEFAULT_BACK_TYPE = 0;
+ COMPLETED = 1;
+ COMPLETED_REJECTED = 2; // successful because coming from rejected area
+ INCOMPLETE_EXCLUDED = 3; // would have been successful but in the exclusion area
+ INCOMPLETE = 4;
+ }
+ optional BackType type = 1;
+
+ optional int32 y_coordinate = 2; // y coordinate for ACTION_DOWN event
+ enum WindowHorizontalLocation {
+ DEFAULT_LOCATION = 0;
+ LEFT = 1;
+ RIGHT = 2;
+ }
+ optional WindowHorizontalLocation x_location = 3;
+}
+
+message ExclusionRectStateChanged {
+ optional string component_name = 1; // if not available, simply packageName
+ optional int32 requested_height = 2; // px
+ optional int32 rejected_height = 3; // px
+
+ enum WindowHorizontalLocation {
+ DEFAULT_LOCATION = 0;
+ LEFT = 1;
+ RIGHT = 2;
+ }
+ optional WindowHorizontalLocation x_location = 4;
+ optional bool landscape = 5;
+ optional bool splitscreen = 6;
+ optional int32 duration_millis = 7;
+}
+
message LauncherUIChanged {
optional android.stats.launcher.LauncherAction action = 1;
optional android.stats.launcher.LauncherState src_state = 2;
diff --git a/config/boot-profile.txt b/config/boot-profile.txt
index e69de29..f8600a7 100644
--- a/config/boot-profile.txt
+++ b/config/boot-profile.txt
@@ -0,0 +1,425 @@
+Landroid/util/SparseArray;->get(I)Ljava/lang/Object;
+Landroid/util/SparseArray;->get(ILjava/lang/Object;)Ljava/lang/Object;
+Landroid/util/ContainerHelpers;->binarySearch([III)I
+Landroid/util/ArrayMap;->indexOfKey(Ljava/lang/Object;)I
+Landroid/util/ArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+Landroid/util/ArrayMap;->putAll(Landroid/util/ArrayMap;)V
+Landroid/util/ArrayMap;->putAll(Ljava/util/Map;)V
+Landroid/util/ArrayMap;->indexOf(Ljava/lang/Object;I)I
+Landroid/util/ArrayMap;->indexOfNull()I
+Landroid/util/ArrayMap;->indexOfValue(Ljava/lang/Object;)I
+Landroid/content/pm/Signature;-><init>(Ljava/lang/String;)V
+Landroid/content/pm/Signature;-><init>([B)V
+Landroid/content/pm/Signature;-><init>([Ljava/security/cert/Certificate;)V
+Lcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;II)V
+Lcom/android/internal/util/FastXmlSerializer;->escapeAndAppendString(Ljava/lang/String;)V
+Landroid/util/ArraySet;->add(Ljava/lang/Object;)Z
+Landroid/util/ArraySet;->addAll(Landroid/util/ArraySet;)V
+Landroid/util/ArraySet;->addAll(Ljava/util/Collection;)Z
+Landroid/util/SparseArray;->put(ILjava/lang/Object;)V
+Landroid/util/ArrayMap;->binarySearchHashes([III)I
+Landroid/util/ArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
+Lcom/android/internal/util/GrowingArrayUtils;->insert([IIII)[I
+Lcom/android/internal/util/GrowingArrayUtils;->insert([JIIJ)[J
+Lcom/android/internal/util/GrowingArrayUtils;->insert([Ljava/lang/Object;IILjava/lang/Object;)[Ljava/lang/Object;
+Lcom/android/internal/util/GrowingArrayUtils;->insert([ZIIZ)[Z
+Landroid/util/SparseArray;-><init>()V
+Landroid/util/SparseArray;-><init>(I)V
+Lcom/android/internal/util/ArrayUtils;->newUnpaddedObjectArray(I)[Ljava/lang/Object;
+Landroid/util/MapCollections$MapIterator;->next()Ljava/lang/Object;
+Lcom/android/internal/util/FastXmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
+Landroid/util/SparseArray;->size()I
+Lcom/android/internal/os/BatteryStatsImpl;->readSummaryFromParcel(Landroid/os/Parcel;)V
+Landroid/util/ArraySet;->indexOf(Ljava/lang/Object;)I
+Landroid/util/ArraySet;->indexOf(Ljava/lang/Object;I)I
+Landroid/util/ArraySet;->indexOfNull()I
+Landroid/util/ArrayMap;-><init>()V
+Landroid/util/ArrayMap;-><init>(I)V
+Landroid/util/ArrayMap;-><init>(IZ)V
+Landroid/util/ArrayMap;-><init>(Landroid/util/ArrayMap;)V
+Landroid/util/MapCollections$ArrayIterator;->next()Ljava/lang/Object;
+Landroid/util/ArrayMap;->allocArrays(I)V
+Landroid/util/ArrayMap;->valueAt(I)Ljava/lang/Object;
+Landroid/util/MapCollections$MapIterator;->getValue()Ljava/lang/Object;
+Landroid/content/pm/Signature;->parseHexDigit(I)I
+Landroid/util/MapCollections$MapIterator;->getKey()Ljava/lang/Object;
+Landroid/util/ArrayMap;->keyAt(I)Ljava/lang/Object;
+Landroid/util/ArraySet;->equals(Ljava/lang/Object;)Z
+Landroid/util/ArraySet;-><init>()V
+Landroid/util/ArraySet;-><init>(I)V
+Landroid/util/ArraySet;-><init>(Landroid/util/ArraySet;)V
+Landroid/util/ArraySet;-><init>(Ljava/util/Collection;)V
+Landroid/os/Parcel;->readInt()I
+Landroid/os/Parcel;->readIntArray([I)V
+Landroid/util/SparseArray;->valueAt(I)Ljava/lang/Object;
+Landroid/os/Parcel;->readLong()J
+Landroid/os/Parcel;->readLongArray([J)V
+Landroid/util/MapCollections$MapIterator;->hasNext()Z
+Landroid/content/pm/Signature;->getPublicKey()Ljava/security/PublicKey;
+Landroid/util/TimingsTraceLog;->traceEnd()V
+Landroid/util/TimingsTraceLog;->logDuration(Ljava/lang/String;J)V
+Lcom/android/internal/os/BatteryStatsImpl;->writeSummaryToParcel(Landroid/os/Parcel;Z)V
+Lcom/android/internal/os/KernelCpuProcStringReader;->asLongs(Ljava/nio/CharBuffer;[J)I
+Lcom/android/internal/os/BatteryStatsImpl$Timer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
+Lcom/android/server/SystemConfig;->readPermissionsFromXml(Ljava/io/File;I)V
+Landroid/os/Looper;->loop()V
+Lcom/android/internal/os/BatteryStatsImpl;->updateKernelWakelocksLocked()V
+Lcom/android/internal/os/KernelWakelockReader;->parseProcWakelocks([BIZLcom/android/internal/os/KernelWakelockStats;)Lcom/android/internal/os/KernelWakelockStats;
+Lcom/android/internal/os/BatteryStatsImpl$Timer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Landroid/os/IInstalld$Stub$Proxy;->createAppData(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)J
+Landroid/os/Parcel;->writeInt(I)V
+Landroid/os/Parcel;->writeIntArray([I)V
+Landroid/os/Parcel;->writeInterfaceToken(Ljava/lang/String;)V
+Landroid/os/Parcel;->writeLong(J)V
+Landroid/os/Parcel;->writeLongArray([J)V
+Landroid/os/Parcel$ReadWriteHelper;->readString(Landroid/os/Parcel;)Ljava/lang/String;
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
+Lcom/android/server/SystemConfig;->readPrivAppPermissions(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V
+Lcom/android/internal/os/BatteryStatsImpl;->getKernelWakelockTimerLocked(Ljava/lang/String;)Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->add(Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
+Landroid/util/ArraySet;->allocArrays(I)V
+Landroid/os/BatteryStats$Timer;-><init>()V
+Lcom/android/internal/os/ProcStatsUtil;->readTerminatedProcFile(Ljava/lang/String;B)Ljava/lang/String;
+Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
+Lcom/android/internal/os/ProcessCpuTracker$Stats;-><init>(IIZ)V
+Lcom/android/internal/os/BatteryStatsImpl$Timer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;ILcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+Lcom/android/internal/os/BatteryStatsImpl$Timer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;ILcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
+Lcom/android/internal/os/BatteryStatsImpl$Uid;-><init>(Lcom/android/internal/os/BatteryStatsImpl;I)V
+Lcom/android/internal/util/RingBuffer;->createNewItem()Ljava/lang/Object;
+Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;->nextLine()Ljava/nio/CharBuffer;
+Landroid/os/Parcel;->readParcelableCreator(Ljava/lang/ClassLoader;)Landroid/os/Parcelable$Creator;
+Landroid/util/TimingsTraceLog;->assertSameThread()V
+Lcom/android/internal/os/KernelWakelockReader;->readKernelWakelockStats(Lcom/android/internal/os/KernelWakelockStats;)Lcom/android/internal/os/KernelWakelockStats;
+Landroid/os/ServiceManager;->rawGetService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/Parcel;->readString()Ljava/lang/String;
+Landroid/os/Parcel;->readStringArray()[Ljava/lang/String;
+Landroid/os/Parcel;->readStringList(Ljava/util/List;)V
+Landroid/os/Parcel$ReadWriteHelper;->writeString(Landroid/os/Parcel;Ljava/lang/String;)V
+Landroid/provider/Settings$NameValueCache;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/util/proto/ProtoInputStream;->incOffset(I)V
+Landroid/util/proto/ProtoInputStream;->nextField()I
+Landroid/util/proto/ProtoInputStream;->readVarint()J
+Landroid/net/UriCodec;->appendDecoded(Ljava/lang/StringBuilder;Ljava/lang/String;ZLjava/nio/charset/Charset;Z)V
+Landroid/content/pm/PackageParserCacheHelper$WriteHelper;->writeString(Landroid/os/Parcel;Ljava/lang/String;)V
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->endSample()V
+Landroid/app/NotificationChannel;->writeXml(Lorg/xmlpull/v1/XmlSerializer;)V
+Landroid/app/NotificationChannel;->writeXml(Lorg/xmlpull/v1/XmlSerializer;ZLandroid/content/Context;)V
+HPLandroid/app/NotificationChannel;->writeXmlForBackup(Lorg/xmlpull/v1/XmlSerializer;Landroid/content/Context;)V
+Landroid/content/pm/PackageParser;->parseActivity(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;Landroid/content/pm/PackageParser$CachedComponentArgs;ZZ)Landroid/content/pm/PackageParser$Activity;
+Landroid/content/pm/PackageParser;->parseActivityAlias(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;Landroid/content/pm/PackageParser$CachedComponentArgs;)Landroid/content/pm/PackageParser$Activity;
+Landroid/content/pm/PackageParser;->parseApkLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$ApkLite;
+Landroid/content/pm/PackageParser;->parseApkLite(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/pm/PackageParser$SigningDetails;)Landroid/content/pm/PackageParser$ApkLite;
+Landroid/content/pm/PackageParser;->parseApkLiteInner(Ljava/io/File;Ljava/io/FileDescriptor;Ljava/lang/String;I)Landroid/content/pm/PackageParser$ApkLite;
+Landroid/util/proto/ProtoInputStream;->start(J)J
+Landroid/content/pm/PackageParser;->parseIntent(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;ZZLandroid/content/pm/PackageParser$IntentInfo;[Ljava/lang/String;)Z
+Landroid/net/UriCodec;->flushDecodingByteAccumulator(Ljava/lang/StringBuilder;Ljava/nio/charset/CharsetDecoder;Ljava/nio/ByteBuffer;Z)V
+Landroid/util/proto/ProtoInputStream;->readTag()V
+Landroid/content/res/TypedArray;->getNonConfigurationString(II)Ljava/lang/String;
+Landroid/util/proto/ProtoInputStream;->end(J)V
+Landroid/util/proto/ProtoInputStream;->readInt(J)I
+Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;I)Landroid/content/pm/PackageInfo;
+HPLandroid/content/pm/PackageParser;->generatePackageInfoFromApex(Ljava/io/File;Z)Landroid/content/pm/PackageInfo;
+Landroid/content/pm/PackageParser;->generatePackageInfo(Landroid/content/pm/PackageParser$Package;[IIJJLjava/util/Set;Landroid/content/pm/PackageUserState;)Landroid/content/pm/PackageInfo;
+Landroid/util/proto/ProtoInputStream;->fillBuffer()V
+Landroid/util/ArrayMap$1;->colGetEntry(II)Ljava/lang/Object;
+Landroid/content/pm/PackageParser;->parseBaseApplication(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Z
+Landroid/os/Parcel;->writeString(Ljava/lang/String;)V
+Landroid/os/Parcel;->writeStringArray([Ljava/lang/String;)V
+Landroid/os/Parcel;->writeStringList(Ljava/util/List;)V
+Landroid/content/pm/ActivityInfo;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/content/res/AssetManager;->retrieveAttributes(Landroid/content/res/XmlBlock$Parser;[I[I[I)Z
+Landroid/util/ArrayMap;->freeArrays([I[Ljava/lang/Object;I)V
+Landroid/content/pm/PackageParser;->parseBaseApkCommon(Landroid/content/pm/PackageParser$Package;Ljava/util/Set;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+Lcom/android/internal/os/ProcessCpuTracker;->collectStats(Ljava/lang/String;IZ[ILjava/util/ArrayList;)[I
+Landroid/content/pm/PackageParser$Component;-><init>(Landroid/content/pm/PackageParser$Package;)V
+Landroid/content/pm/PackageParser$Component;-><init>(Landroid/content/pm/PackageParser$ParseComponentArgs;Landroid/content/pm/ComponentInfo;)V
+Landroid/content/pm/PackageParser$Component;-><init>(Landroid/content/pm/PackageParser$ParsePackageItemArgs;Landroid/content/pm/PackageItemInfo;)V
+Landroid/app/usage/EventList;->insert(Landroid/app/usage/UsageEvents$Event;)V
+Landroid/content/pm/Signature;->toChars()[C
+Landroid/content/pm/Signature;->toChars([C[I)[C
+Landroid/content/pm/Signature;->toCharsString()Ljava/lang/String;
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->getUpdateVersion()I
+Landroid/content/pm/PackageParser;->parseService(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;Landroid/content/pm/PackageParser$CachedComponentArgs;)Landroid/content/pm/PackageParser$Service;
+Landroid/util/proto/ProtoInputStream;->readLong(J)J
+Landroid/content/pm/PackageParser;->parsePackageItemInfo(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageItemInfo;[Ljava/lang/String;Ljava/lang/String;Landroid/content/res/TypedArray;ZIIIIII)Z
+Landroid/content/pm/PackageParser;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;ILandroid/content/pm/PackageUserState;)V
+Landroid/content/res/TypedArray;->obtain(Landroid/content/res/Resources;I)Landroid/content/res/TypedArray;
+Landroid/content/pm/PackageItemInfo;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/content/IntentFilter;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/content/pm/Signature;->equals(Ljava/lang/Object;)Z
+Landroid/content/ComponentName;->hashCode()I
+Landroid/content/pm/PackageParser;->validateName(Ljava/lang/String;ZZ)Ljava/lang/String;
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->computeRunTimeLocked(J)J
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->computeCurrentCountLocked()I
+Landroid/content/res/Resources;->obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
+Landroid/content/res/Resources;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
+Landroid/content/pm/ComponentInfo;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/content/pm/PackageParser$IntentInfo;->writeIntentInfoToParcel(Landroid/os/Parcel;I)V
+Lcom/android/internal/util/FastXmlSerializer;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
+Landroid/util/ArraySet;->contains(Ljava/lang/Object;)Z
+Landroid/os/Parcel;->writeParcelableCreator(Landroid/os/Parcelable;)V
+Landroid/content/pm/PackageParser$SigningDetails;->hasCertificateInternal(Landroid/content/pm/Signature;I)Z
+Lcom/android/internal/util/XmlUtils;->skipCurrentTag(Lorg/xmlpull/v1/XmlPullParser;)V
+Landroid/util/SparseArray;->keyAt(I)I
+Landroid/util/proto/ProtoInputStream;->assertFreshData()V
+Landroid/content/pm/PackageParser;->buildClassName(Ljava/lang/String;Ljava/lang/CharSequence;[Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/Parcel;->writeParcelable(Landroid/os/Parcelable;I)V
+Landroid/os/Parcel;->writeParcelableArray([Landroid/os/Parcelable;I)V
+Landroid/os/Parcel;->writeParcelableList(Ljava/util/List;I)V
+Lcom/android/internal/os/ProcessCpuTracker;->getName(Lcom/android/internal/os/ProcessCpuTracker$Stats;Ljava/lang/String;)V
+Landroid/content/res/Configuration;->readFromProto(Landroid/util/proto/ProtoInputStream;J)V
+Landroid/content/pm/PackageParser$Component;->writeIntentsList(Ljava/util/ArrayList;Landroid/os/Parcel;I)V
+Landroid/content/ContentProvider$Transport;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
+Landroid/content/pm/PackageParser;->parseMetaData(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/os/Bundle;[Ljava/lang/String;)Landroid/os/Bundle;
+Landroid/content/pm/PackageParser;->parseUsesPermission(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Z
+Landroid/content/pm/PackageParser;->generateApplicationInfo(Landroid/content/pm/PackageParser$Package;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ApplicationInfo;
+Landroid/util/ArrayMap;->containsKey(Ljava/lang/Object;)Z
+Landroid/net/Uri$PathPart;->getPathSegments()Landroid/net/Uri$PathSegments;
+Landroid/os/Binder;-><init>()V
+Landroid/os/Binder;-><init>(Ljava/lang/String;)V
+Landroid/os/BinderProxy;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Landroid/app/ResourcesManager;->getOrCreateResourcesLocked(Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;
+Landroid/content/pm/ApplicationInfo;->initForUser(I)V
+Landroid/content/res/XmlBlock$Parser;->getAttributeValue(I)Ljava/lang/String;
+Landroid/content/res/XmlBlock$Parser;->getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+Landroid/content/pm/PackageParser;->parseProvider(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;Landroid/content/pm/PackageParser$CachedComponentArgs;)Landroid/content/pm/PackageParser$Provider;
+Landroid/content/pm/PackageParser;->parseProviderTags(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;ZLandroid/content/pm/PackageParser$Provider;[Ljava/lang/String;)Z
+Landroid/content/res/AssetManager;->getResourceValue(IILandroid/util/TypedValue;Z)Z
+Landroid/content/IntentFilter;->addDataAuthority(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/os/Environment;->getDataUserDeDirectory(Ljava/lang/String;)Ljava/io/File;
+Landroid/os/Environment;->getDataUserDeDirectory(Ljava/lang/String;I)Ljava/io/File;
+Lcom/android/internal/util/FastXmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
+Landroid/app/ContextImpl;->checkPermission(Ljava/lang/String;II)I
+Landroid/app/ContextImpl;->checkPermission(Ljava/lang/String;IILandroid/os/IBinder;)I
+Landroid/app/ActivityManager;->getService()Landroid/app/IActivityManager;
+Landroid/content/pm/PackageParser;->buildCompoundName(Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;
+Landroid/content/res/TypedArray;->resize(I)V
+Lcom/android/internal/util/ArrayUtils;->unstableRemoveIf(Ljava/util/ArrayList;Ljava/util/function/Predicate;)I
+Landroid/net/Uri$PathPart;->appendEncodedSegment(Landroid/net/Uri$PathPart;Ljava/lang/String;)Landroid/net/Uri$PathPart;
+Landroid/text/TextUtils;->writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V
+Landroid/content/res/TypedArray;->getValueAt(ILandroid/util/TypedValue;)Z
+Landroid/content/res/Configuration;->compareTo(Landroid/content/res/Configuration;)I
+Lcom/android/internal/util/ArrayUtils;->newUnpaddedIntArray(I)[I
+Lcom/android/internal/util/XmlUtils;->readThisValueXml(Lorg/xmlpull/v1/XmlPullParser;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;Z)Ljava/lang/Object;
+Landroid/util/ArraySet;->valueAt(I)Ljava/lang/Object;
+Landroid/util/ArraySet;->valueAtUnchecked(I)Ljava/lang/Object;
+Landroid/content/res/ApkAssets;->getStringFromPool(I)Ljava/lang/CharSequence;
+Landroid/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z
+Lcom/android/internal/util/ArrayUtils;->appendInt([II)[I
+Lcom/android/internal/util/ArrayUtils;->appendInt([IIZ)[I
+Landroid/content/pm/PackageUserState;->equals(Ljava/lang/Object;)Z
+Landroid/content/pm/PackageParser;->copyNeeded(ILandroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageUserState;Landroid/os/Bundle;I)Z
+Landroid/util/proto/ProtoInputStream;->assertWireType(I)V
+Landroid/util/proto/ProtoInputStream;->checkPacked(J)V
+Landroid/app/usage/UsageEvents$Event;-><init>(Landroid/app/usage/UsageEvents$Event;)V
+Landroid/app/usage/UsageEvents$Event;-><init>()V
+Landroid/util/proto/EncodedBuffer;->getRawFixed32At(I)I
+Landroid/util/proto/EncodedBuffer;->writeRawByte(B)V
+Landroid/os/MessageQueue;->enqueueMessage(Landroid/os/Message;J)Z
+Lcom/android/server/SystemConfig;->addFeature(Ljava/lang/String;I)V
+Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;IZ)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/PackageParser;->parsePackageList(Ljava/lang/String;)Ljava/util/Set;
+Landroid/content/pm/PackageParser;->parsePackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
+Landroid/content/pm/PackageParser;->parsePackageSplitNames(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/util/Pair;
+Landroid/content/pm/PackageParser;->parseBaseApk(Ljava/io/File;Landroid/content/res/AssetManager;I)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/PackageParser;->parseBaseApk(Ljava/lang/String;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/RegisteredServicesCache;->generateServicesMap([II)V
+Landroid/content/pm/RegisteredServicesCache;->parseServiceInfo(Landroid/content/pm/ResolveInfo;)Landroid/content/pm/RegisteredServicesCache$ServiceInfo;
+Landroid/content/pm/PackageParser$Activity;->writeToParcel(Landroid/os/Parcel;I)V
+Lcom/android/server/SystemConfig;->readPermissions(Ljava/io/File;I)V
+Landroid/content/pm/PackageParser$Package;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/app/ResourcesManager;->getResources(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;)Landroid/content/res/Resources;
+Landroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;)V
+Landroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
+Landroid/content/res/AssetManager;->setApkAssets([Landroid/content/res/ApkAssets;Z)V
+Landroid/content/res/ResourcesKey;-><init>(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;)V
+Landroid/app/ResourcesManager;->getOrCreateResources(Landroid/os/IBinder;Landroid/content/res/ResourcesKey;Ljava/lang/ClassLoader;)Landroid/content/res/Resources;
+Landroid/app/ResourcesManager;->getOrCreateResourcesForActivityLocked(Landroid/os/IBinder;Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;
+Landroid/content/pm/PackageItemInfo;->loadXmlMetaData(Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/res/XmlResourceParser;
+Landroid/content/SyncAdaptersCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/content/SyncAdapterType;
+Landroid/content/SyncAdaptersCache;->parseServiceAttributes(Landroid/content/res/Resources;Ljava/lang/String;Landroid/util/AttributeSet;)Ljava/lang/Object;
+Landroid/app/ContextImpl;->registerReceiverInternal(Landroid/content/BroadcastReceiver;ILandroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;Landroid/content/Context;I)Landroid/content/Intent;
+Landroid/content/pm/PackageParser;->parseClusterPackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
+Landroid/content/res/ResourcesImpl;->updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V
+Landroid/content/res/ResourcesImpl;-><init>(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;Landroid/view/DisplayAdjustments;)V
+Landroid/app/LoadedApk;->getReceiverDispatcher(Landroid/content/BroadcastReceiver;Landroid/content/Context;Landroid/os/Handler;Landroid/app/Instrumentation;Z)Landroid/content/IIntentReceiver;
+Landroid/content/pm/PackageParser$Activity;-><init>(Landroid/content/pm/PackageParser$ParseComponentArgs;Landroid/content/pm/ActivityInfo;)V
+Landroid/content/pm/PackageParser$Activity;-><init>(Landroid/os/Parcel;)V
+Landroid/os/FileUtils;->bytesToFile(Ljava/lang/String;[B)V
+Landroid/content/res/TypedArray;->loadStringValueAt(I)Ljava/lang/CharSequence;
+Lcom/android/internal/util/XmlUtils;->nextElement(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/internal/util/XmlUtils;->nextElementWithin(Lorg/xmlpull/v1/XmlPullParser;I)Z
+Landroid/os/Binder;->execTransactInternal(IJJII)Z
+Landroid/content/pm/PackageParser;->parsePermission(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;[Ljava/lang/String;)Z
+Landroid/content/pm/PackageParser;->parsePermissionGroup(Landroid/content/pm/PackageParser$Package;ILandroid/content/res/Resources;Landroid/content/res/XmlResourceParser;[Ljava/lang/String;)Z
+Landroid/content/pm/PackageParser;->parsePermissionTree(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;[Ljava/lang/String;)Z
+Landroid/content/pm/PackageParser$SigningDetails;->hasCertificate(Landroid/content/pm/Signature;)Z
+Landroid/net/Uri$StringUri;->buildUpon()Landroid/net/Uri$Builder;
+Landroid/content/res/TypedArray;->peekValue(I)Landroid/util/TypedValue;
+Landroid/content/pm/PackageParser;->buildProcessName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/CharSequence;I[Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;
+Landroid/util/proto/ProtoOutputStream;->write(JF)V
+Landroid/util/proto/ProtoOutputStream;->write(JI)V
+Landroid/util/proto/ProtoOutputStream;->write(JJ)V
+Landroid/util/proto/ProtoOutputStream;->write(JLjava/lang/String;)V
+Landroid/util/proto/ProtoOutputStream;->write(JZ)V
+Landroid/util/proto/ProtoOutputStream;->writeUtf8String(ILjava/lang/String;)V
+Landroid/util/proto/ProtoInputStream;->readString(J)Ljava/lang/String;
+Lcom/android/internal/util/ArrayUtils;->contains(Ljava/util/Collection;Ljava/lang/Object;)Z
+Lcom/android/internal/util/ArrayUtils;->contains([II)Z
+Lcom/android/internal/util/ArrayUtils;->contains([Ljava/lang/Object;Ljava/lang/Object;)Z
+Lcom/android/internal/util/ArrayUtils;->containsAll([Ljava/lang/Object;[Ljava/lang/Object;)Z
+Landroid/content/pm/Signature;->areExactMatch([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)Z
+Landroid/app/LoadedApk$ReceiverDispatcher;-><init>(Landroid/content/BroadcastReceiver;Landroid/content/Context;Landroid/os/Handler;Landroid/app/Instrumentation;Z)V
+Landroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;)V
+Landroid/content/res/Configuration;->setToDefaults()V
+Lcom/android/internal/util/ArrayUtils;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I
+Landroid/content/IntentFilter;-><init>()V
+Landroid/content/IntentFilter;-><init>(Landroid/content/IntentFilter;)V
+Landroid/content/IntentFilter;-><init>(Landroid/os/Parcel;)V
+Landroid/content/IntentFilter;-><init>(Ljava/lang/String;)V
+Landroid/app/usage/UsageStats;-><init>()V
+Landroid/app/usage/UsageStats;-><init>(Landroid/app/usage/UsageStats;)V
+Landroid/app/ContextImpl;->checkCallingOrSelfPermission(Ljava/lang/String;)I
+Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
+Landroid/content/res/TypedArray;->recycle()V
+Landroid/content/pm/PermissionInfo;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/app/NotificationChannel;->populateFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
+Landroid/app/NotificationChannel;->populateFromXml(Lorg/xmlpull/v1/XmlPullParser;ZLandroid/content/Context;)V
+Landroid/view/inputmethod/InputMethodInfo;-><init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;Ljava/util/List;)V
+Landroid/view/inputmethod/InputMethodInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/app/SystemServiceRegistry$CachedServiceFetcher;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+Landroid/content/pm/PackageBackwardCompatibility;->updatePackage(Landroid/content/pm/PackageParser$Package;)V
+Landroid/net/Uri$HierarchicalUri;->getAuthority()Ljava/lang/String;
+Landroid/app/job/JobInfo$Builder;->build()Landroid/app/job/JobInfo;
+Landroid/os/BaseBundle;->writeToParcelInner(Landroid/os/Parcel;I)V
+Landroid/os/Parcel;->writeBundle(Landroid/os/Bundle;)V
+Landroid/util/proto/ProtoOutputStream;->endObjectImpl(JZ)V
+Landroid/app/ApplicationPackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/internal/os/BatteryStatsImpl$DualTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
+Landroid/app/IActivityManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Landroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/ServiceManager;->getServiceOrThrow(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/Parcel;->recycle()V
+Landroid/util/ArraySet;->iterator()Ljava/util/Iterator;
+Landroid/util/SparseIntArray;-><init>()V
+Landroid/util/SparseIntArray;-><init>(I)V
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->readWakeSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
+Landroid/os/Environment;->getDataUserDePackageDirectory(Ljava/lang/String;ILjava/lang/String;)Ljava/io/File;
+Landroid/net/Uri$HierarchicalUri;-><init>(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$PathPart;Landroid/net/Uri$Part;Landroid/net/Uri$Part;)V
+Landroid/net/Uri$HierarchicalUri;-><init>(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$PathPart;Landroid/net/Uri$Part;Landroid/net/Uri$Part;Landroid/net/Uri$1;)V
+Landroid/provider/DeviceConfig;->incrementNamespace(Ljava/lang/String;)V
+Lcom/android/internal/util/MessageUtils;->findMessageNames([Ljava/lang/Class;)Landroid/util/SparseArray;
+Lcom/android/internal/util/MessageUtils;->findMessageNames([Ljava/lang/Class;[Ljava/lang/String;)Landroid/util/SparseArray;
+Landroid/app/job/JobInfo;-><init>(Landroid/app/job/JobInfo$Builder;)V
+Landroid/app/job/JobInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/os/Parcel;->writeArrayMapInternal(Landroid/util/ArrayMap;)V
+Landroid/content/res/Configuration;->equals(Landroid/content/res/Configuration;)Z
+Landroid/content/res/Configuration;->equals(Ljava/lang/Object;)Z
+Landroid/content/res/Resources;->getString(I)Ljava/lang/String;
+Landroid/content/res/Resources;->getString(I[Ljava/lang/Object;)Ljava/lang/String;
+Landroid/content/res/Resources;->getStringArray(I)[Ljava/lang/String;
+Landroid/text/TextUtils;->getLayoutDirectionFromLocale(Ljava/util/Locale;)I
+Landroid/os/BaseBundle;-><init>(Ljava/lang/ClassLoader;I)V
+Landroid/os/BaseBundle;-><init>(Landroid/os/Parcel;I)V
+Landroid/util/proto/ProtoInputStream;->readRawString(I)Ljava/lang/String;
+Landroid/app/WindowConfiguration;->setToDefaults()V
+Landroid/content/ContentProvider;->getAuthorityWithoutUserId(Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/BaseBundle;->copyInternal(Landroid/os/BaseBundle;Z)V
+Landroid/content/pm/PackageParser;->setMaxAspectRatio(Landroid/content/pm/PackageParser$Package;)V
+Landroid/content/IntentFilter;->addCategory(Ljava/lang/String;)V
+Landroid/os/FileUtils;->buildValidExtFilename(Ljava/lang/String;)Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/util/proto/ProtoOutputStream;->startObjectImpl(IZ)J
+Landroid/content/res/ResourcesImpl;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser;
+Landroid/os/PatternMatcher;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/net/NetworkScoreManager;->getActiveScorerPackage()Ljava/lang/String;
+Landroid/content/res/ApkAssets;->close()V
+Landroid/util/TimingsTraceLog;->traceBegin(Ljava/lang/String;)V
+Landroid/app/WindowConfiguration;-><init>()V
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Landroid/app/AppOpsManager;->permissionToOpCode(Ljava/lang/String;)I
+Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z
+Landroid/content/pm/PackageParser$SigningDetails;-><init>(Landroid/content/pm/PackageParser$SigningDetails;)V
+Landroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;I)V
+Landroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;ILandroid/util/ArraySet;[Landroid/content/pm/Signature;)V
+Landroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;I[Landroid/content/pm/Signature;)V
+Landroid/net/Uri$PathPart;->makeAbsolute(Landroid/net/Uri$PathPart;)Landroid/net/Uri$PathPart;
+Lcom/android/server/LocalServices;->getService(Ljava/lang/Class;)Ljava/lang/Object;
+Landroid/content/pm/FallbackCategoryProvider;->loadFallbacks()V
+Landroid/os/Handler;-><init>()V
+Landroid/os/Handler;-><init>(Landroid/os/Handler$Callback;)V
+Landroid/os/Handler;-><init>(Landroid/os/Handler$Callback;Z)V
+Landroid/os/Handler;-><init>(Landroid/os/Looper;)V
+Landroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V
+Landroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
+Landroid/os/Handler;-><init>(Z)V
+Landroid/net/Uri$AbstractPart;->getDecoded()Ljava/lang/String;
+Landroid/util/LongSparseArray;->get(J)Ljava/lang/Object;
+Landroid/util/LongSparseArray;->get(JLjava/lang/Object;)Ljava/lang/Object;
+Landroid/os/Environment;->getDataUserCeDirectory(Ljava/lang/String;)Ljava/io/File;
+Landroid/os/Environment;->getDataUserCeDirectory(Ljava/lang/String;I)Ljava/io/File;
+Landroid/content/pm/PackageParser$Package;->setApplicationVolumeUuid(Ljava/lang/String;)V
+Landroid/content/pm/PackageParser$Component;->getComponentName()Landroid/content/ComponentName;
+Landroid/os/LocaleList;-><init>(Ljava/util/Locale;Landroid/os/LocaleList;)V
+Landroid/os/LocaleList;-><init>([Ljava/util/Locale;)V
+Landroid/content/pm/PackageParser;->checkUseInstalledOrHidden(ILandroid/content/pm/PackageUserState;Landroid/content/pm/ApplicationInfo;)Z
+Landroid/util/SparseIntArray;->get(I)I
+Landroid/util/SparseIntArray;->get(II)I
+Landroid/os/UserHandle;->getCallingUserId()I
+Landroid/os/Binder;->allowBlocking(Landroid/os/IBinder;)Landroid/os/IBinder;
+Landroid/app/ContextImpl;->enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/content/pm/PackageParser;->setMinAspectRatio(Landroid/content/pm/PackageParser$Package;)V
+Landroid/content/res/Resources;->getAssets()Landroid/content/res/AssetManager;
+Landroid/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object;
+Landroid/content/res/TypedArray;->getNonResourceString(I)Ljava/lang/String;
+Landroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics;
+Landroid/util/proto/EncodedBuffer;->editRawFixed32(II)V
+Landroid/app/ResourcesManager;->findResourcesImplForKeyLocked(Landroid/content/res/ResourcesKey;)Landroid/content/res/ResourcesImpl;
+Landroid/app/-$$Lambda$ResourcesManager$QJ7UiVk_XS90KuXAsIjIEym1DnM;->test(Ljava/lang/Object;)Z
+Landroid/util/proto/EncodedBuffer;->writeRawBuffer([BII)V
+Landroid/content/IntentFilter;->addDataPath(Ljava/lang/String;I)V
+Landroid/os/MessageQueue;->next()Landroid/os/Message;
+Landroid/util/SparseIntArray;->put(II)V
+Landroid/os/StrictMode;->setBlockGuardPolicy(I)V
+Landroid/util/Xml;->newPullParser()Lorg/xmlpull/v1/XmlPullParser;
+Landroid/os/HandlerThread;->getLooper()Landroid/os/Looper;
+Landroid/os/BaseBundle;->deepCopyValue(Ljava/lang/Object;)Ljava/lang/Object;
+Landroid/util/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V
+Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
+Lcom/android/internal/util/XmlUtils;->readIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)I
+Lcom/android/internal/util/XmlUtils;->readIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
+Landroid/util/LongSparseArray;->put(JLjava/lang/Object;)V
+Landroid/util/Base64$Decoder;->process([BIIZ)Z
+Landroid/util/ArraySet;->ensureCapacity(I)V
+Landroid/content/pm/ApplicationInfo;-><init>()V
+Landroid/content/pm/ApplicationInfo;-><init>(Landroid/content/pm/ApplicationInfo;)V
+Landroid/content/pm/ApplicationInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/os/storage/StorageManager;->convert(Ljava/lang/String;)Ljava/util/UUID;
+Landroid/os/storage/StorageManager;->convert(Ljava/util/UUID;)Ljava/lang/String;
+Landroid/util/MapCollections$ArrayIterator;->hasNext()Z
+Landroid/content/pm/PackageSharedLibraryUpdater;->prefixImplicitDependency(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Ljava/lang/String;)V
+Landroid/content/pm/PackageSharedLibraryUpdater;->prefixRequiredLibrary(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)V
+Landroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/Class;)V
+Landroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/String;)V
+Landroid/content/ComponentName;-><init>(Landroid/os/Parcel;)V
+Landroid/content/ComponentName;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/content/ComponentName;-><init>(Ljava/lang/String;Landroid/os/Parcel;)V
+Landroid/content/pm/PackageUserState;->isMatch(Landroid/content/pm/ComponentInfo;I)Z
+Landroid/util/proto/ProtoInputStream;->assertFieldNumber(J)V
+Landroid/util/Pools$SimplePool;->release(Ljava/lang/Object;)Z
+Landroid/content/res/TypedArray;->getBoolean(IZ)Z
+Landroid/content/res/XmlBlock$Parser;->getDepth()I
+Landroid/content/res/TypedArray;->getResourceId(II)I
+Landroid/content/pm/ActivityInfo;-><init>()V
+Landroid/content/pm/ActivityInfo;-><init>(Landroid/content/pm/ActivityInfo;)V
+Landroid/content/pm/ActivityInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/os/Parcel;->writeValue(Ljava/lang/Object;)V
+Landroid/content/res/Configuration;->fixUpLocaleList()V
+Landroid/content/res/ApkAssets;->isUpToDate()Z
+Landroid/content/res/ResourcesKey;->equals(Ljava/lang/Object;)Z
+Landroid/content/res/Configuration;->hashCode()I
+Landroid/content/IntentFilter$AuthorityEntry;-><init>(Landroid/os/Parcel;)V
+Landroid/content/IntentFilter$AuthorityEntry;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/app/NotificationChannelGroup;->writeXml(Lorg/xmlpull/v1/XmlSerializer;)V
diff --git a/config/hiddenapi-greylist-max-p.txt b/config/hiddenapi-greylist-max-p.txt
index 25d45b0..351e71d 100644
--- a/config/hiddenapi-greylist-max-p.txt
+++ b/config/hiddenapi-greylist-max-p.txt
@@ -1,57 +1,14 @@
Landroid/app/IInstrumentationWatcher$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IInstrumentationWatcher;
Landroid/app/ISearchManager$Stub;-><init>()V
Landroid/app/IUiModeManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IUiModeManager;
-Landroid/app/IUiModeManager;->disableCarMode(I)V
Landroid/bluetooth/IBluetooth$Stub;-><init>()V
Landroid/bluetooth/IBluetoothA2dp$Stub;-><init>()V
Landroid/content/IIntentReceiver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentReceiver;
Landroid/content/IIntentSender$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentSender;
-Landroid/net/IConnectivityManager;->getNetworkInfo(I)Landroid/net/NetworkInfo;
-Landroid/net/IConnectivityManager;->reportInetCondition(II)V
-Landroid/os/BatteryStats$Counter;-><init>()V
-Landroid/os/BatteryStats$HistoryItem;->clear()V
-Landroid/os/BatteryStats$HistoryItem;->next:Landroid/os/BatteryStats$HistoryItem;
-Landroid/os/BatteryStats$HistoryItem;->same(Landroid/os/BatteryStats$HistoryItem;)Z
-Landroid/os/BatteryStats$HistoryItem;->setTo(JBLandroid/os/BatteryStats$HistoryItem;)V
-Landroid/os/BatteryStats$HistoryItem;->setTo(Landroid/os/BatteryStats$HistoryItem;)V
-Landroid/os/BatteryStats$Timer;-><init>()V
-Landroid/os/BatteryStats$Uid$Pkg;-><init>()V
-Landroid/os/BatteryStats$Uid$Proc;-><init>()V
-Landroid/os/BatteryStats$Uid$Sensor;-><init>()V
-Landroid/os/BatteryStats$Uid$Wakelock;-><init>()V
-Landroid/os/BatteryStats;-><init>()V
-Landroid/os/BatteryStats;->getMobileRadioActiveTime(JI)J
-Landroid/os/BatteryStats;->getNetworkActivityBytes(II)J
-Landroid/os/CancellationSignal;->mCancelInProgress:Z
-Landroid/os/CancellationSignal;->mIsCanceled:Z
-Landroid/os/CancellationSignal;->mOnCancelListener:Landroid/os/CancellationSignal$OnCancelListener;
-Landroid/os/CancellationSignal;->mRemote:Landroid/os/ICancellationSignal;
-Landroid/os/CancellationSignal;->waitForCancelFinishedLocked()V
-Landroid/os/IPowerManager;->nap(J)V
-Landroid/os/Parcel;->mCreators:Ljava/util/HashMap;
-Landroid/os/PowerManager;->mHandler:Landroid/os/Handler;
-Landroid/os/Process;->sendSignalQuiet(II)V
-Landroid/os/Registrant;->getHandler()Landroid/os/Handler;
-Landroid/os/RegistrantList;->get(I)Ljava/lang/Object;
-Landroid/os/RemoteCallback;->mHandler:Landroid/os/Handler;
Landroid/os/storage/IObbActionListener$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/storage/IObbActionListener;
-Landroid/os/SystemProperties;->native_add_change_callback()V
-Landroid/os/SystemProperties;->native_get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/os/SystemProperties;->native_get_boolean(Ljava/lang/String;Z)Z
-Landroid/os/SystemProperties;->native_get_int(Ljava/lang/String;I)I
-Landroid/os/SystemProperties;->native_set(Ljava/lang/String;Ljava/lang/String;)V
-Landroid/os/UserHandle;->formatUid(Ljava/io/PrintWriter;I)V
-Landroid/os/WorkSource;->sGoneWork:Landroid/os/WorkSource;
-Landroid/os/WorkSource;->sNewbWork:Landroid/os/WorkSource;
-Landroid/os/WorkSource;->sTmpWorkSource:Landroid/os/WorkSource;
-Landroid/os/WorkSource;->updateLocked(Landroid/os/WorkSource;ZZ)Z
Landroid/service/carrier/ICarrierMessagingCallback$Stub;-><init>()V
-Landroid/service/carrier/ICarrierMessagingService;->filterSms(Landroid/service/carrier/MessagePdu;Ljava/lang/String;IILandroid/service/carrier/ICarrierMessagingCallback;)V
-Landroid/telephony/CarrierMessagingServiceManager;-><init>()V
Landroid/view/IGraphicsStats$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/view/IGraphicsStats$Stub;->asInterface(Landroid/os/IBinder;)Landroid/view/IGraphicsStats;
-Landroid/view/IWindowManager;->setInTouchMode(Z)V
-Landroid/view/IWindowManager;->showStrictModeViolation(Z)V
Lcom/android/internal/R$styleable;->AndroidManifestActivityAlias:[I
Lcom/android/internal/R$styleable;->AndroidManifestGrantUriPermission:[I
Lcom/android/internal/R$styleable;->AndroidManifestInstrumentation:[I
@@ -70,10 +27,3 @@
Lcom/android/internal/R$styleable;->Searchable:[I
Lcom/android/internal/R$styleable;->SearchableActionKey:[I
Lcom/android/internal/telephony/IPhoneSubInfo$Stub;-><init>()V
-Lcom/android/internal/telephony/ITelephony;->getDataActivity()I
-Lcom/android/internal/telephony/ITelephony;->getDataState()I
-Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallForwardingChanged(Z)V
-Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCellLocation(Landroid/os/Bundle;)V
-Lcom/android/internal/telephony/ITelephonyRegistry;->notifyDataActivity(I)V
-Lcom/android/internal/telephony/ITelephonyRegistry;->notifyOtaspChanged(II)V
-Lcom/android/internal/view/BaseIWindow;-><init>()V
diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt
index c30a6f4..eb53b7c 100644
--- a/config/hiddenapi-greylist.txt
+++ b/config/hiddenapi-greylist.txt
@@ -121,8 +121,6 @@
Landroid/bluetooth/IBluetoothPbap$Stub;->asInterface(Landroid/os/IBinder;)Landroid/bluetooth/IBluetoothPbap;
Landroid/bluetooth/IBluetoothStateChangeCallback$Stub;-><init>()V
Landroid/companion/ICompanionDeviceDiscoveryService$Stub;-><init>()V
-Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelected(Ljava/lang/String;ILjava/lang/String;)V
-Landroid/companion/ICompanionDeviceDiscoveryServiceCallback;->onDeviceSelectionCancel()V
Landroid/content/IClipboard$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/content/IClipboard$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IClipboard;
Landroid/content/IContentService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
@@ -194,7 +192,6 @@
Landroid/content/UndoManager;-><init>()V
Landroid/database/IContentObserver$Stub;-><init>()V
Landroid/database/IContentObserver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/database/IContentObserver;
-Landroid/database/IContentObserver;->onChange(ZLandroid/net/Uri;I)V
Landroid/database/sqlite/SQLiteConnectionPool;->$assertionsDisabled:Z
Landroid/database/sqlite/SQLiteDatabase;->$assertionsDisabled:Z
Landroid/hardware/display/IDisplayManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/display/IDisplayManager;
@@ -723,9 +720,6 @@
Lcom/android/internal/location/GpsNetInitiatedHandler;->mIsHexInput:Z
Lcom/android/internal/location/ILocationProvider$Stub;-><init>()V
Lcom/android/internal/location/ILocationProvider$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProvider;
-Lcom/android/internal/location/ILocationProvider;->sendExtraCommand(Ljava/lang/String;Landroid/os/Bundle;)V
-Lcom/android/internal/location/ILocationProvider;->setLocationProviderManager(Lcom/android/internal/location/ILocationProviderManager;)V
-Lcom/android/internal/location/ILocationProvider;->setRequest(Lcom/android/internal/location/ProviderRequest;Landroid/os/WorkSource;)V
Lcom/android/internal/location/ILocationProviderManager$Stub;-><init>()V
Lcom/android/internal/location/ILocationProviderManager$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/location/ILocationProviderManager;
Lcom/android/internal/logging/MetricsLogger;-><init>()V
@@ -736,7 +730,6 @@
Lcom/android/internal/os/IDropBoxManagerService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/os/IDropBoxManagerService;
Lcom/android/internal/policy/IKeyguardService$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/policy/IKeyguardService;
Lcom/android/internal/policy/IKeyguardStateCallback$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/policy/IKeyguardStateCallback;
-Lcom/android/internal/preference/YesNoPreference;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
Lcom/android/internal/R$anim;->fade_in:I
Lcom/android/internal/R$array;->config_autoBrightnessLcdBacklightValues:I
Lcom/android/internal/R$array;->config_autoBrightnessLevels:I
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 69e7118..1fd7e52 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -127,17 +127,6 @@
public abstract void setHasOverlayUi(int pid, boolean hasOverlayUi);
/**
- * Sets if the given pid is currently running a remote animation, which is taken a signal for
- * determining oom adjustment and scheduling behavior.
- *
- * @param pid The pid we are setting overlay UI for.
- * @param runningRemoteAnimation True if the process is running a remote animation, false
- * otherwise.
- * @see RemoteAnimationAdapter
- */
- public abstract void setRunningRemoteAnimation(int pid, boolean runningRemoteAnimation);
-
- /**
* Called after the network policy rules are updated by
* {@link com.android.server.net.NetworkPolicyManagerService} for a specific {@param uid} and
* {@param procStateSeq}.
diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java
index 1166cb5..80c9ba2 100644
--- a/core/java/android/app/DownloadManager.java
+++ b/core/java/android/app/DownloadManager.java
@@ -132,6 +132,9 @@
*/
public final static String COLUMN_STATUS = Downloads.Impl.COLUMN_STATUS;
+ /** {@hide} */
+ public final static String COLUMN_FILE_NAME_HINT = Downloads.Impl.COLUMN_FILE_NAME_HINT;
+
/**
* Provides more detail on the status of the download. Its meaning depends on the value of
* {@link #COLUMN_STATUS}.
@@ -169,6 +172,9 @@
*/
public static final String COLUMN_MEDIAPROVIDER_URI = Downloads.Impl.COLUMN_MEDIAPROVIDER_URI;
+ /** {@hide} */
+ public static final String COLUMN_DESTINATION = Downloads.Impl.COLUMN_DESTINATION;
+
/** @hide */
@TestApi
public static final String COLUMN_MEDIASTORE_URI = Downloads.Impl.COLUMN_MEDIASTORE_URI;
@@ -340,26 +346,22 @@
*/
@UnsupportedAppUsage
public static final String[] UNDERLYING_COLUMNS = new String[] {
- Downloads.Impl._ID,
- Downloads.Impl._DATA + " AS " + COLUMN_LOCAL_FILENAME,
- Downloads.Impl.COLUMN_MEDIAPROVIDER_URI,
- Downloads.Impl.COLUMN_DESTINATION,
- Downloads.Impl.COLUMN_TITLE,
- Downloads.Impl.COLUMN_DESCRIPTION,
- Downloads.Impl.COLUMN_URI,
- Downloads.Impl.COLUMN_STATUS,
- Downloads.Impl.COLUMN_FILE_NAME_HINT,
- Downloads.Impl.COLUMN_MIME_TYPE + " AS " + COLUMN_MEDIA_TYPE,
- Downloads.Impl.COLUMN_TOTAL_BYTES + " AS " + COLUMN_TOTAL_SIZE_BYTES,
- Downloads.Impl.COLUMN_LAST_MODIFICATION + " AS " + COLUMN_LAST_MODIFIED_TIMESTAMP,
- Downloads.Impl.COLUMN_CURRENT_BYTES + " AS " + COLUMN_BYTES_DOWNLOADED_SO_FAR,
- Downloads.Impl.COLUMN_ALLOW_WRITE,
- /* add the following 'computed' columns to the cursor.
- * they are not 'returned' by the database, but their inclusion
- * eliminates need to have lot of methods in CursorTranslator
- */
- "'placeholder' AS " + COLUMN_LOCAL_URI,
- "'placeholder' AS " + COLUMN_REASON
+ DownloadManager.COLUMN_ID,
+ DownloadManager.COLUMN_LOCAL_FILENAME,
+ DownloadManager.COLUMN_MEDIAPROVIDER_URI,
+ DownloadManager.COLUMN_DESTINATION,
+ DownloadManager.COLUMN_TITLE,
+ DownloadManager.COLUMN_DESCRIPTION,
+ DownloadManager.COLUMN_URI,
+ DownloadManager.COLUMN_STATUS,
+ DownloadManager.COLUMN_FILE_NAME_HINT,
+ DownloadManager.COLUMN_MEDIA_TYPE,
+ DownloadManager.COLUMN_TOTAL_SIZE_BYTES,
+ DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP,
+ DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR,
+ DownloadManager.COLUMN_ALLOW_WRITE,
+ DownloadManager.COLUMN_LOCAL_URI,
+ DownloadManager.COLUMN_REASON
};
/**
diff --git a/core/java/android/app/IUiModeManager.aidl b/core/java/android/app/IUiModeManager.aidl
index cae54b6..f2c9f61 100644
--- a/core/java/android/app/IUiModeManager.aidl
+++ b/core/java/android/app/IUiModeManager.aidl
@@ -30,6 +30,7 @@
/**
* Disables the car mode.
*/
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void disableCarMode(int flags);
/**
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 5624ba5..49cfd41 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -4981,6 +4981,42 @@
return null;
}
+
+ /**
+ * Called by a device or profile owner, or delegated certificate chooser (an app that has been
+ * delegated the {@link #DELEGATION_CERT_SELECTION} privilege), to grant an application access
+ * to an already-installed (or generated) KeyChain key.
+ * This is useful (in combination with {@link #installKeyPair} or {@link #generateKeyPair}) to
+ * let an application call {@link android.security.KeyChain#getPrivateKey} without having to
+ * call {@link android.security.KeyChain#choosePrivateKeyAlias} first.
+ *
+ * The grantee app will receive the {@link android.security.KeyChain#ACTION_KEY_ACCESS_CHANGED}
+ * broadcast when access to a key is granted or revoked.
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with, or
+ * {@code null} if calling from a delegated certificate installer.
+ * @param alias The alias of the key to grant access to.
+ * @param packageName The name of the (already installed) package to grant access to.
+ * @param hasGrant Whether to grant access to the alias or revoke it.
+ * @return {@code true} if the grant was set successfully, {@code false} otherwise.
+ *
+ * @throws SecurityException if the caller is not a device owner, a profile owner or
+ * delegated certificate chooser.
+ * @throws IllegalArgumentException if {@code packageName} or {@code alias} are empty, or if
+ * {@code packageName} is not a name of an installed package.
+ */
+ public boolean setKeyGrantForApp(@Nullable ComponentName admin, @NonNull String alias,
+ @NonNull String packageName, boolean hasGrant) {
+ throwIfParentInstance("addKeyGrant");
+ try {
+ return mService.setKeyGrantForApp(
+ admin, mContext.getPackageName(), alias, packageName, hasGrant);
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ return false;
+ }
+
/**
* Returns {@code true} if the device supports attestation of device identifiers in addition
* to key attestation.
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 2b96419..5cdef6d 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -436,4 +436,6 @@
boolean isUnattendedManagedKiosk();
boolean startViewCalendarEventInManagedProfile(String packageName, long eventId, long start, long end, boolean allDay, int flags);
+
+ boolean setKeyGrantForApp(in ComponentName admin, String callerPackage, String alias, String packageName, boolean hasGrant);
}
diff --git a/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl b/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl
index 5f73e55..c9dc019 100644
--- a/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl
+++ b/core/java/android/companion/ICompanionDeviceDiscoveryServiceCallback.aidl
@@ -18,6 +18,8 @@
/** @hide */
interface ICompanionDeviceDiscoveryServiceCallback {
+ @UnsupportedAppUsage
oneway void onDeviceSelected(String packageName, int userId, String deviceAddress);
+ @UnsupportedAppUsage
oneway void onDeviceSelectionCancel();
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 7a013f1..73bc908 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3197,6 +3197,7 @@
TELEPHONY_SERVICE,
TELEPHONY_SUBSCRIPTION_SERVICE,
CARRIER_CONFIG_SERVICE,
+ EUICC_SERVICE,
TELECOM_SERVICE,
CLIPBOARD_SERVICE,
INPUT_METHOD_SERVICE,
@@ -3387,6 +3388,8 @@
* @see android.telephony.SubscriptionManager
* @see #CARRIER_CONFIG_SERVICE
* @see android.telephony.CarrierConfigManager
+ * @see #EUICC_SERVICE
+ * @see android.telephony.euicc.EuiccManager
* @see #INPUT_METHOD_SERVICE
* @see android.view.inputmethod.InputMethodManager
* @see #UI_MODE_SERVICE
diff --git a/core/java/android/database/IContentObserver.aidl b/core/java/android/database/IContentObserver.aidl
index 22dc9fe..6235566 100644
--- a/core/java/android/database/IContentObserver.aidl
+++ b/core/java/android/database/IContentObserver.aidl
@@ -29,5 +29,6 @@
* observed. selfUpdate is true if the update was caused by a call to
* commit on the cursor that is being observed.
*/
+ @UnsupportedAppUsage
oneway void onChange(boolean selfUpdate, in Uri uri, int userId);
}
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 5ac13d8..a0170da 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -206,10 +206,16 @@
continue;
}
- if (filterTags == null || Arrays.binarySearch(filterTags,
- CameraMetadataNative.getTag(keyName, vendorId)) >= 0) {
+
+ if (filterTags != null && Arrays.binarySearch(filterTags,
+ CameraMetadataNative.getTag(keyName, vendorId)) < 0) {
+ // ignore vendor keys not in filterTags
+ continue;
+ }
+ if (instance == null || instance.getProtected(k) != null) {
keyList.add(k);
}
+
}
}
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index cc8c182..68857da9 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -2337,6 +2337,12 @@
final CaptureCallbackHolder holder =
CameraDeviceImpl.this.mCaptureCallbackMap.get(requestId);
+ if (holder == null) {
+ Log.e(TAG, String.format("Receive capture error on unknown request ID %d",
+ requestId));
+ return;
+ }
+
final CaptureRequest request = holder.getRequest(subsequenceId);
Runnable failureDispatch = null;
diff --git a/core/java/android/hardware/radio/RadioMetadata.java b/core/java/android/hardware/radio/RadioMetadata.java
index c135c8a..76304bd 100644
--- a/core/java/android/hardware/radio/RadioMetadata.java
+++ b/core/java/android/hardware/radio/RadioMetadata.java
@@ -26,6 +26,9 @@
import android.util.Log;
import android.util.SparseArray;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
import java.util.Set;
/**
@@ -257,9 +260,22 @@
private final Bundle mBundle;
+ // Lazily computed hash code based upon the contents of mBundle.
+ private Integer mHashCode;
+
@Override
public int hashCode() {
- return mBundle.hashCode();
+ if (mHashCode == null) {
+ List<String> keys = new ArrayList<String>(mBundle.keySet());
+ keys.sort(null);
+ Object[] objs = new Object[2 * keys.size()];
+ for (int i = 0; i < keys.size(); i++) {
+ objs[2 * i] = keys.get(i);
+ objs[2 * i + 1] = mBundle.get(keys.get(i));
+ }
+ mHashCode = Arrays.hashCode(objs);
+ }
+ return mHashCode;
}
@Override
@@ -626,6 +642,8 @@
String key = getKeyFromNativeKey(nativeKey);
try {
putInt(mBundle, key, value);
+ // Invalidate mHashCode to force it to be recomputed.
+ mHashCode = null;
return 0;
} catch (IllegalArgumentException ex) {
return -1;
@@ -639,6 +657,8 @@
return -1;
}
mBundle.putString(key, value);
+ // Invalidate mHashCode to force it to be recomputed.
+ mHashCode = null;
return 0;
}
@@ -653,6 +673,8 @@
bmp = BitmapFactory.decodeByteArray(value, 0, value.length);
if (bmp != null) {
mBundle.putParcelable(key, bmp);
+ // Invalidate mHashCode to force it to be recomputed.
+ mHashCode = null;
return 0;
}
} catch (Exception e) {
@@ -668,6 +690,8 @@
}
mBundle.putParcelable(key, new RadioMetadata.Clock(
utcEpochSeconds, timezoneOffsetInMinutes));
+ // Invalidate mHashCode to force it to be recomputed.
+ mHashCode = null;
return 0;
}
}
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index 61648dc..5f662f9 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -52,6 +52,7 @@
@UnsupportedAppUsage
NetworkInfo getActiveNetworkInfo();
NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked);
+ @UnsupportedAppUsage(maxTargetSdk = 28)
NetworkInfo getNetworkInfo(int networkType);
NetworkInfo getNetworkInfoForUid(in Network network, int uid, boolean ignoreBlocked);
@UnsupportedAppUsage
@@ -112,6 +113,7 @@
int setUsbTethering(boolean enable, String callerPkg);
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void reportInetCondition(int networkType, int percentage);
void reportNetworkConnectivity(in Network network, boolean hasConnectivity);
diff --git a/core/java/android/net/LinkQualityInfo.java b/core/java/android/net/LinkQualityInfo.java
index 3c5d474..2e6915f 100644
--- a/core/java/android/net/LinkQualityInfo.java
+++ b/core/java/android/net/LinkQualityInfo.java
@@ -24,8 +24,8 @@
* Class that represents useful attributes of generic network links
* such as the upload/download throughput or packet error rate.
* Generally speaking, you should be dealing with instances of
- * LinkQualityInfo subclasses, such as {@link android.net.#WifiLinkQualityInfo}
- * or {@link android.net.#MobileLinkQualityInfo} which provide additional
+ * LinkQualityInfo subclasses, such as {@link android.net.WifiLinkQualityInfo}
+ * or {@link android.net.MobileLinkQualityInfo} which provide additional
* information.
* @hide
*/
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index caa6a43..a399e83 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -64,6 +64,10 @@
* @hide
*/
public abstract class BatteryStats implements Parcelable {
+
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+ public BatteryStats() {}
+
private static final String TAG = "BatteryStats";
private static final boolean LOCAL_LOGV = false;
@@ -407,6 +411,9 @@
*/
public static abstract class Counter {
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+ public Counter() {}
+
/**
* Returns the count associated with this Counter for the
* selected type of statistics.
@@ -516,6 +523,9 @@
*/
public static abstract class Timer {
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+ public Timer() {}
+
/**
* Returns the count associated with this Timer for the
* selected type of statistics.
@@ -671,6 +681,9 @@
* The statistics associated with a particular wake lock.
*/
public static abstract class Wakelock {
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+ public Wakelock() {}
+
@UnsupportedAppUsage
public abstract Timer getWakeTime(int type);
}
@@ -948,6 +961,10 @@
public abstract void getDeferredJobsLineLocked(StringBuilder sb, int which);
public static abstract class Sensor {
+
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+ public Sensor() {}
+
/*
* FIXME: it's not correct to use this magic value because it
* could clash with a sensor handle (which are defined by
@@ -978,6 +995,9 @@
*/
public static abstract class Proc {
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+ public Proc() {}
+
public static class ExcessivePower {
public static final int TYPE_WAKE = 1;
public static final int TYPE_CPU = 2;
@@ -1053,6 +1073,9 @@
*/
public static abstract class Pkg {
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
+ public Pkg() {}
+
/**
* Returns information about all wakeup alarms that have been triggered for this
* package. The mapping keys are tag names for the alarms, the counter contains
@@ -1558,6 +1581,7 @@
* Battery history record.
*/
public static final class HistoryItem {
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public HistoryItem next;
// The time of this event in milliseconds, as per SystemClock.elapsedRealtime().
@@ -1875,6 +1899,7 @@
numReadInts += (src.dataPosition()-start)/4;
}
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public void clear() {
time = 0;
cmd = CMD_NULL;
@@ -1895,12 +1920,14 @@
eventTag = null;
}
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public void setTo(HistoryItem o) {
time = o.time;
cmd = o.cmd;
setToCommon(o);
}
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public void setTo(long time, byte cmd, HistoryItem o) {
this.time = time;
this.cmd = cmd;
@@ -1956,6 +1983,7 @@
&& currentTime == o.currentTime;
}
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public boolean same(HistoryItem o) {
if (!sameNonEvent(o) || eventCode != o.eventCode) {
return false;
@@ -2338,6 +2366,7 @@
*
* {@hide}
*/
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public abstract long getMobileRadioActiveTime(long elapsedRealtimeUs, int which);
/**
@@ -2698,6 +2727,7 @@
public static final int NETWORK_WIFI_BG_TX_DATA = 9;
public static final int NUM_NETWORK_ACTIVITY_TYPES = NETWORK_WIFI_BG_TX_DATA + 1;
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public abstract long getNetworkActivityBytes(int type, int which);
public abstract long getNetworkActivityPackets(int type, int which);
diff --git a/core/java/android/os/CancellationSignal.java b/core/java/android/os/CancellationSignal.java
index e8053d5..99fb998 100644
--- a/core/java/android/os/CancellationSignal.java
+++ b/core/java/android/os/CancellationSignal.java
@@ -18,13 +18,19 @@
import android.os.ICancellationSignal;
+import dalvik.annotation.compat.UnsupportedAppUsage;
+
/**
* Provides the ability to cancel an operation in progress.
*/
public final class CancellationSignal {
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private boolean mIsCanceled;
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private OnCancelListener mOnCancelListener;
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private ICancellationSignal mRemote;
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private boolean mCancelInProgress;
/**
@@ -152,6 +158,7 @@
}
}
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private void waitForCancelFinishedLocked() {
while (mCancelInProgress) {
try {
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index e1d605e..185693e 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -47,6 +47,7 @@
void wakeUp(long time, int reason, String details, String opPackageName);
@UnsupportedAppUsage
void goToSleep(long time, int reason, int flags);
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void nap(long time);
@UnsupportedAppUsage
boolean isInteractive();
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index dbe3c93..e1b5542 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -3148,6 +3148,7 @@
// Cache of previously looked up CREATOR.createFromParcel() methods for
// particular classes. Keys are the names of the classes, values are
// Method objects.
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private static final HashMap<ClassLoader,HashMap<String,Parcelable.Creator<?>>>
mCreators = new HashMap<>();
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 535d887..7ea2621 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -824,6 +824,7 @@
final Context mContext;
@UnsupportedAppUsage
final IPowerManager mService;
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
final Handler mHandler;
IThermalService mThermalService;
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index b535e8d..30e5959 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -999,6 +999,7 @@
* your own log, or the Android Illuminati will find you some night and
* beat you up.
*/
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public static final native void sendSignalQuiet(int pid, int signal);
/** @hide */
diff --git a/core/java/android/os/Registrant.java b/core/java/android/os/Registrant.java
index 8fb123a..572b975 100644
--- a/core/java/android/os/Registrant.java
+++ b/core/java/android/os/Registrant.java
@@ -114,6 +114,7 @@
}
}
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public Handler
getHandler()
{
diff --git a/core/java/android/os/RegistrantList.java b/core/java/android/os/RegistrantList.java
index 6e562ff..e9bc637 100644
--- a/core/java/android/os/RegistrantList.java
+++ b/core/java/android/os/RegistrantList.java
@@ -70,6 +70,7 @@
return registrants.size();
}
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public synchronized Object
get(int index)
{
diff --git a/core/java/android/os/RemoteCallback.java b/core/java/android/os/RemoteCallback.java
index 047ba1d..da58d0f 100644
--- a/core/java/android/os/RemoteCallback.java
+++ b/core/java/android/os/RemoteCallback.java
@@ -21,6 +21,8 @@
import android.annotation.SystemApi;
import android.annotation.TestApi;
+import dalvik.annotation.compat.UnsupportedAppUsage;
+
/**
* @hide
*/
@@ -33,6 +35,7 @@
}
private final OnResultListener mListener;
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private final Handler mHandler;
private final IRemoteCallback mCallback;
diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java
index b377e8d..6165146 100644
--- a/core/java/android/os/RemoteCallbackList.java
+++ b/core/java/android/os/RemoteCallbackList.java
@@ -123,6 +123,7 @@
IBinder binder = callback.asBinder();
try {
Callback cb = new Callback(callback, cookie);
+ unregister(callback);
binder.linkToDeath(cb, 0);
mCallbacks.put(binder, cb);
return true;
diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java
index a7edb5e..cdae72e 100644
--- a/core/java/android/os/SystemProperties.java
+++ b/core/java/android/os/SystemProperties.java
@@ -88,12 +88,17 @@
@UnsupportedAppUsage
private static native String native_get(String key);
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private static native String native_get(String key, String def);
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private static native int native_get_int(String key, int def);
@UnsupportedAppUsage
private static native long native_get_long(String key, long def);
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private static native boolean native_get_boolean(String key, boolean def);
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private static native void native_set(String key, String def);
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private static native void native_add_change_callback();
private static native void native_report_sysprop_change();
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index d70ba99..4e17f7e 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -354,6 +354,7 @@
* components -- user, app, isolated, etc.
* @hide
*/
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
public static void formatUid(PrintWriter pw, int uid) {
if (uid < Process.FIRST_APPLICATION_UID) {
pw.print(uid);
diff --git a/core/java/android/os/UserManagerInternal.java b/core/java/android/os/UserManagerInternal.java
index 1f6c3cc..2e3b000 100644
--- a/core/java/android/os/UserManagerInternal.java
+++ b/core/java/android/os/UserManagerInternal.java
@@ -221,4 +221,7 @@
*/
public abstract boolean isSettingRestrictedForUser(String setting, int userId, String value,
int callingUid);
+
+ /** @return a specific user restriction that's in effect currently. */
+ public abstract boolean hasUserRestriction(String restriction, int userId);
}
diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java
index 0b4a561..114de23 100644
--- a/core/java/android/os/WorkSource.java
+++ b/core/java/android/os/WorkSource.java
@@ -39,14 +39,17 @@
* The WorkSource object itself is not thread safe, but we need to
* hold sTmpWorkSource lock while working with these statics.
*/
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
static final WorkSource sTmpWorkSource = new WorkSource(0);
/**
* For returning newbie work from a modification operation.
*/
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
static WorkSource sNewbWork;
/**
* For returning gone work form a modification operation.
*/
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
static WorkSource sGoneWork;
/**
@@ -619,6 +622,7 @@
return changed;
}
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
private boolean updateLocked(WorkSource other, boolean set, boolean returnNewbs) {
if (mNames == null && other.mNames == null) {
return updateUidsLocked(other, set, returnNewbs);
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 69c1295..5b9205d 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -1987,11 +1987,31 @@
*/
public static final int FLAG_ALLOCATE_DEFY_HALF_RESERVED = 1 << 2;
+ /**
+ * Flag indicating that a disk space check should not take into account
+ * freeable cached space when determining allocatable space.
+ *
+ * Intended for use with {@link #getAllocatableBytes()}.
+ * @hide
+ */
+ public static final int FLAG_ALLOCATE_NON_CACHE_ONLY = 1 << 3;
+
+ /**
+ * Flag indicating that a disk space check should only return freeable
+ * cached space when determining allocatable space.
+ *
+ * Intended for use with {@link #getAllocatableBytes()}.
+ * @hide
+ */
+ public static final int FLAG_ALLOCATE_CACHE_ONLY = 1 << 4;
+
/** @hide */
@IntDef(flag = true, prefix = { "FLAG_ALLOCATE_" }, value = {
FLAG_ALLOCATE_AGGRESSIVE,
FLAG_ALLOCATE_DEFY_ALL_RESERVED,
FLAG_ALLOCATE_DEFY_HALF_RESERVED,
+ FLAG_ALLOCATE_NON_CACHE_ONLY,
+ FLAG_ALLOCATE_CACHE_ONLY,
})
@Retention(RetentionPolicy.SOURCE)
public @interface AllocateFlags {}
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index d0401e3..4f7c8c5 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -346,6 +346,20 @@
"system_gestures_excluded_by_pre_q_sticky_immersive";
/**
+ * The minimum duration between gesture exclusion logging for a given window in
+ * milliseconds.
+ *
+ * Events that happen in-between will be silently dropped.
+ *
+ * A non-positive value disables logging.
+ *
+ * @see android.provider.DeviceConfig#NAMESPACE_WINDOW_MANAGER
+ * @hide
+ */
+ String KEY_SYSTEM_GESTURE_EXCLUSION_LOG_DEBOUNCE_MILLIS =
+ "system_gesture_exclusion_log_debounce_millis";
+
+ /**
* Key for controlling which packages are explicitly blocked from running at refresh rates
* higher than 90hz.
*
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 5308cd3..7df1ebe 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5959,6 +5959,18 @@
public static final String DEVICE_PROVISIONED = Global.DEVICE_PROVISIONED;
/**
+ * Indicates whether a DPC has been downloaded during provisioning.
+ *
+ * <p>Type: int (0 for false, 1 for true)
+ *
+ * <p>If this is true, then any attempts to begin setup again should result in factory reset
+ *
+ * @hide
+ */
+ public static final String MANAGED_PROVISIONING_DPC_DOWNLOADED =
+ "managed_provisioning_dpc_downloaded";
+
+ /**
* Indicates whether the current user has completed setup via the setup wizard.
* <p>
* Type: int (0 for false, 1 for true)
diff --git a/core/java/android/service/carrier/ICarrierMessagingService.aidl b/core/java/android/service/carrier/ICarrierMessagingService.aidl
index 2d96c3d..c4dfb57 100644
--- a/core/java/android/service/carrier/ICarrierMessagingService.aidl
+++ b/core/java/android/service/carrier/ICarrierMessagingService.aidl
@@ -36,6 +36,7 @@
* @param subId SMS subscription ID of the SIM
* @param callback the callback to notify upon completion
*/
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void filterSms(
in MessagePdu pdu, String format, int destPort, int subId,
in ICarrierMessagingCallback callback);
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 60dbf84..e784ad3 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -196,7 +196,6 @@
final WindowManager.LayoutParams mLayout
= new WindowManager.LayoutParams();
IWindowSession mSession;
- InputChannel mInputChannel;
final Object mLock = new Object();
boolean mOffsetMessageEnqueued;
@@ -819,11 +818,11 @@
mLayout.setTitle(WallpaperService.this.getClass().getName());
mLayout.windowAnimations =
com.android.internal.R.style.Animation_Wallpaper;
- mInputChannel = new InputChannel();
+ InputChannel inputChannel = new InputChannel();
if (mSession.addToDisplay(mWindow, mWindow.mSeq, mLayout, View.VISIBLE,
mDisplay.getDisplayId(), mWinFrame, mContentInsets, mStableInsets,
- mOutsets, mDisplayCutout, mInputChannel,
+ mOutsets, mDisplayCutout, inputChannel,
mInsetsState) < 0) {
Log.w(TAG, "Failed to add window while updating wallpaper surface.");
return;
@@ -831,7 +830,7 @@
mCreated = true;
mInputEventReceiver = new WallpaperInputEventReceiver(
- mInputChannel, Looper.myLooper());
+ inputChannel, Looper.myLooper());
}
mSurfaceHolder.mSurfaceLock.lock();
@@ -1267,13 +1266,6 @@
}
mSurfaceHolder.mSurface.release();
mCreated = false;
-
- // Dispose the input channel after removing the window so the Window Manager
- // doesn't interpret the input channel being closed as an abnormal termination.
- if (mInputChannel != null) {
- mInputChannel.dispose();
- mInputChannel = null;
- }
}
}
diff --git a/core/java/android/view/ISystemGestureExclusionListener.aidl b/core/java/android/view/ISystemGestureExclusionListener.aidl
index a032625..9c2f9a6 100644
--- a/core/java/android/view/ISystemGestureExclusionListener.aidl
+++ b/core/java/android/view/ISystemGestureExclusionListener.aidl
@@ -28,7 +28,14 @@
* Called when the system gesture exclusion for the given display changed.
* @param displayId the display whose system gesture exclusion changed
* @param systemGestureExclusion a {@code Region} where the app would like priority over the
- * system gestures, in display coordinates.
+ * system gestures, in display coordinates. Certain restrictions
+ * might be applied such that apps don't get all the exclusions
+ * they request.
+ * @param systemGestureExclusionUnrestricted a {@code Region} where the app would like priority
+ * over the system gestures, in display coordinates, without
+ * any restrictions applied. Null if no restrictions have been
+ * applied.
*/
- void onSystemGestureExclusionChanged(int displayId, in Region systemGestureExclusion);
+ void onSystemGestureExclusionChanged(int displayId, in Region systemGestureExclusion,
+ in Region systemGestureExclusionUnrestricted);
}
\ No newline at end of file
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index b347a78..bb9867a 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -151,6 +151,7 @@
float getCurrentAnimatorScale();
// For testing
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void setInTouchMode(boolean showFocus);
// For StrictMode flashing a red border on violations from the UI
@@ -158,6 +159,7 @@
// Manager uses that to determine whether or not the red border should
// actually be shown. (it will be ignored that pid doesn't have windows
// on screen)
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void showStrictModeViolation(boolean on);
// Proxy to set the system property for whether the flashing
diff --git a/core/java/android/view/InputEventReceiver.java b/core/java/android/view/InputEventReceiver.java
index 7260a65..ed8492e 100644
--- a/core/java/android/view/InputEventReceiver.java
+++ b/core/java/android/view/InputEventReceiver.java
@@ -102,7 +102,11 @@
nativeDispose(mReceiverPtr);
mReceiverPtr = 0;
}
- mInputChannel = null;
+
+ if (mInputChannel != null) {
+ mInputChannel.dispose();
+ mInputChannel = null;
+ }
mMessageQueue = null;
}
diff --git a/core/java/android/view/RemoteAnimationAdapter.java b/core/java/android/view/RemoteAnimationAdapter.java
index bc2fe54..c686440 100644
--- a/core/java/android/view/RemoteAnimationAdapter.java
+++ b/core/java/android/view/RemoteAnimationAdapter.java
@@ -55,6 +55,7 @@
/** @see #getCallingPid */
private int mCallingPid;
+ private int mCallingUid;
/**
* @param runner The interface that gets notified when we actually need to start the animation.
@@ -103,10 +104,11 @@
}
/**
- * To be called by system_server to keep track which pid is running this animation.
+ * To be called by system_server to keep track which pid and uid is running this animation.
*/
- public void setCallingPid(int pid) {
+ public void setCallingPidUid(int pid, int uid) {
mCallingPid = pid;
+ mCallingUid = uid;
}
/**
@@ -116,6 +118,13 @@
return mCallingPid;
}
+ /**
+ * @return The uid of the process running the animation.
+ */
+ public int getCallingUid() {
+ return mCallingUid;
+ }
+
@Override
public int describeContents() {
return 0;
diff --git a/core/java/android/view/RemoteAnimationDefinition.java b/core/java/android/view/RemoteAnimationDefinition.java
index 884cae4..da599ef 100644
--- a/core/java/android/view/RemoteAnimationDefinition.java
+++ b/core/java/android/view/RemoteAnimationDefinition.java
@@ -118,9 +118,9 @@
* To be called by system_server to keep track which pid is running the remote animations inside
* this definition.
*/
- public void setCallingPid(int pid) {
+ public void setCallingPidUid(int pid, int uid) {
for (int i = mTransitionAnimationMap.size() - 1; i >= 0; i--) {
- mTransitionAnimationMap.valueAt(i).adapter.setCallingPid(pid);
+ mTransitionAnimationMap.valueAt(i).adapter.setCallingPidUid(pid, uid);
}
}
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 1a66898..90e69f3 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -38,6 +38,7 @@
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
+import android.view.SurfaceControl.Transaction;
import com.android.internal.view.SurfaceCallbackHelper;
@@ -118,7 +119,7 @@
boolean mDrawFinished = false;
final Rect mScreenRect = new Rect();
- SurfaceSession mSurfaceSession;
+ private final SurfaceSession mSurfaceSession = new SurfaceSession();
SurfaceControl mSurfaceControl;
// In the case of format changes we switch out the surface in-place
@@ -193,6 +194,7 @@
private SurfaceControl.Transaction mRtTransaction = new SurfaceControl.Transaction();
private SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction();
+ private int mParentSurfaceGenerationId;
public SurfaceView(Context context) {
this(context, null);
@@ -644,13 +646,12 @@
}
}
- private void updateBackgroundVisibilityInTransaction(SurfaceControl viewRoot) {
+ private void updateBackgroundVisibilityInTransaction() {
if (mBackgroundControl == null) {
return;
}
if ((mSubLayer < 0) && ((mSurfaceFlags & SurfaceControl.OPAQUE) != 0)) {
mBackgroundControl.show();
- mBackgroundControl.setRelativeLayer(viewRoot, Integer.MIN_VALUE);
} else {
mBackgroundControl.hide();
}
@@ -742,11 +743,24 @@
mScreenRect.offset(surfaceInsets.left, surfaceInsets.top);
if (creating) {
- viewRoot.createBoundsSurface(mSubLayer);
- mSurfaceSession = new SurfaceSession();
mDeferredDestroySurfaceControl = mSurfaceControl;
updateOpaqueFlag();
+ // SurfaceView hierarchy
+ // ViewRootImpl surface
+ // - bounds layer (crops all child surfaces to parent surface insets)
+ // - SurfaceView surface (drawn relative to ViewRootImpl surface)
+ // - Background color layer (drawn behind all SurfaceView surfaces)
+ //
+ // The bounds layer is used to crop the surface view so it does not draw into
+ // the parent surface inset region. Since there can be multiple surface views
+ // below or above the parent surface, one option is to create multiple bounds
+ // layer for each z order. The other option, the one implement is to create
+ // a single bounds layer and set z order for each child surface relative to the
+ // parent surface.
+ // When creating the surface view, we parent it to the bounds layer and then
+ // set the relative z order. When the parent surface changes, we have to
+ // make sure to update the relative z via ViewRootImpl.SurfaceChangedCallback.
final String name = "SurfaceView - " + viewRoot.getTitle().toString();
mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
@@ -754,7 +768,7 @@
.setOpaque((mSurfaceFlags & SurfaceControl.OPAQUE) != 0)
.setBufferSize(mSurfaceWidth, mSurfaceHeight)
.setFormat(mFormat)
- .setParent(viewRoot.getSurfaceControl())
+ .setParent(viewRoot.getBoundsLayer())
.setFlags(mSurfaceFlags)
.build();
mBackgroundControl = new SurfaceControl.Builder(mSurfaceSession)
@@ -779,14 +793,23 @@
SurfaceControl.openTransaction();
try {
- mSurfaceControl.setLayer(mSubLayer);
+ // If we are creating the surface control or the parent surface has not
+ // changed, then set relative z. Otherwise allow the parent
+ // SurfaceChangedCallback to update the relative z. This is needed so that
+ // we do not change the relative z before the server is ready to swap the
+ // parent surface.
+ if (creating || (mParentSurfaceGenerationId
+ == viewRoot.mSurface.getGenerationId())) {
+ SurfaceControl.mergeToGlobalTransaction(updateRelativeZ());
+ }
+ mParentSurfaceGenerationId = viewRoot.mSurface.getGenerationId();
if (mViewVisibility) {
mSurfaceControl.show();
} else {
mSurfaceControl.hide();
}
- updateBackgroundVisibilityInTransaction(viewRoot.getSurfaceControl());
+ updateBackgroundVisibilityInTransaction();
if (mUseAlpha) {
mSurfaceControl.setAlpha(alpha);
mSurfaceAlpha = alpha;
@@ -1369,11 +1392,22 @@
}
/**
- * Called when a valid ViewRootImpl surface is replaced by another valid surface.
+ * Called when a valid ViewRootImpl surface is replaced by another valid surface. In this
+ * case update relative z to the new parent surface.
* @hide
*/
@Override
- public void surfaceReplaced(SurfaceControl.Transaction t) {
+ public void surfaceReplaced(Transaction t) {
+ if (mSurfaceControl != null && mBackgroundControl != null) {
+ t.merge(updateRelativeZ());
+ }
+ }
+ private Transaction updateRelativeZ() {
+ Transaction t = new Transaction();
+ SurfaceControl viewRoot = getViewRootImpl().getSurfaceControl();
+ t.setRelativeLayer(mBackgroundControl, viewRoot, Integer.MIN_VALUE);
+ t.setRelativeLayer(mSurfaceControl, viewRoot, mSubLayer);
+ return t;
}
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index e198489..1779a80 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -11074,6 +11074,13 @@
*
* <p>Do not modify the provided list after this method is called.</p>
*
+ * <p>Note: the system will put a limit of <code>200dp</code> on the vertical extent of the
+ * exclusions it takes into account. The limit does not apply while the navigation
+ * bar is {@link #SYSTEM_UI_FLAG_IMMERSIVE_STICKY stickily} hidden, nor to the
+ * {@link android.inputmethodservice.InputMethodService input method} and
+ * {@link Intent#CATEGORY_HOME home activity}.
+ * </p>
+ *
* @param rects A list of precision gesture regions that this view needs to function correctly
*/
public void setSystemGestureExclusionRects(@NonNull List<Rect> rects) {
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 354cc96..3a51eaa 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -399,7 +399,6 @@
@UnsupportedAppUsage
final View.AttachInfo mAttachInfo;
- InputChannel mInputChannel;
InputQueue.Callback mInputQueueCallback;
InputQueue mInputQueue;
@UnsupportedAppUsage
@@ -484,15 +483,13 @@
*/
private final Transaction mSurfaceChangedTransaction = new Transaction();
/**
- * Child surface of {@code mSurface} with the same bounds as its parent, and crop bounds
- * are set to the parent's bounds adjusted for surface insets. This surface is created when
- * {@link ViewRootImpl#createBoundsSurface(int)} is called.
- * By parenting to this bounds surface, child surfaces can ensure they do not draw into the
- * surface inset regions set by the parent window.
+ * Child container layer of {@code mSurface} with the same bounds as its parent, and cropped to
+ * the surface insets. This surface is created only if a client requests it via {@link
+ * #getBoundsLayer()}. By parenting to this bounds surface, child surfaces can ensure they do
+ * not draw into the surface inset region set by the parent window.
*/
- public final Surface mBoundsSurface = new Surface();
- private SurfaceSession mSurfaceSession;
- private SurfaceControl mBoundsSurfaceControl;
+ private SurfaceControl mBoundsLayer;
+ private final SurfaceSession mSurfaceSession = new SurfaceSession();
private final Transaction mTransaction = new Transaction();
@UnsupportedAppUsage
@@ -884,9 +881,10 @@
// manager, to make sure we do the relayout before receiving
// any other events from the system.
requestLayout();
+ InputChannel inputChannel = null;
if ((mWindowAttributes.inputFeatures
& WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
- mInputChannel = new InputChannel();
+ inputChannel = new InputChannel();
}
mForceDecorViewVisibility = (mWindowAttributes.privateFlags
& PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY) != 0;
@@ -897,14 +895,14 @@
res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(), mTmpFrame,
mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
- mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel,
+ mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, inputChannel,
mTempInsets);
setFrame(mTmpFrame);
} catch (RemoteException e) {
mAdded = false;
mView = null;
mAttachInfo.mRootView = null;
- mInputChannel = null;
+ inputChannel = null;
mFallbackEventHandler.setView(null);
unscheduleTraversals();
setAccessibilityFocus(null, null);
@@ -980,12 +978,12 @@
mInputQueueCallback =
((RootViewSurfaceTaker)view).willYouTakeTheInputQueue();
}
- if (mInputChannel != null) {
+ if (inputChannel != null) {
if (mInputQueueCallback != null) {
mInputQueue = new InputQueue();
mInputQueueCallback.onInputQueueCreated(mInputQueue);
}
- mInputEventReceiver = new WindowInputEventReceiver(mInputChannel,
+ mInputEventReceiver = new WindowInputEventReceiver(inputChannel,
Looper.myLooper());
}
@@ -1614,66 +1612,55 @@
}
}
-
/**
- * Creates a surface as a child of {@code mSurface} with the same bounds as its parent and
- * crop bounds set to the parent's bounds adjusted for surface insets.
+ * @return child layer with the same bounds as its parent {@code mSurface} and cropped to the
+ * surface insets. If the layer does not exist, it is created.
*
- * @param zOrderLayer Z order relative to the parent surface.
+ * <p>Parenting to this layer will ensure that its children are cropped by the view's surface
+ * insets.
*/
- public void createBoundsSurface(int zOrderLayer) {
- if (mSurfaceSession == null) {
- mSurfaceSession = new SurfaceSession();
+ public SurfaceControl getBoundsLayer() {
+ if (mBoundsLayer == null) {
+ mBoundsLayer = new SurfaceControl.Builder(mSurfaceSession)
+ .setContainerLayer()
+ .setName("Bounds for - " + getTitle().toString())
+ .setParent(mSurfaceControl)
+ .build();
+ setBoundsLayerCrop();
+ mTransaction.show(mBoundsLayer).apply();
}
- if (mBoundsSurfaceControl != null && mBoundsSurface.isValid()) {
- return; // surface control for bounds surface already exists.
- }
-
- mBoundsSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
- .setName("Bounds for - " + getTitle().toString())
- .setParent(mSurfaceControl)
- .build();
-
- setBoundsSurfaceCrop();
- mTransaction.setLayer(mBoundsSurfaceControl, zOrderLayer)
- .show(mBoundsSurfaceControl)
- .apply();
- mBoundsSurface.copyFrom(mBoundsSurfaceControl);
+ return mBoundsLayer;
}
- private void setBoundsSurfaceCrop() {
+ private void setBoundsLayerCrop() {
// mWinFrame is already adjusted for surface insets. So offset it and use it as
// the cropping bounds.
mTempBoundsRect.set(mWinFrame);
mTempBoundsRect.offsetTo(mWindowAttributes.surfaceInsets.left,
mWindowAttributes.surfaceInsets.top);
- mTransaction.setWindowCrop(mBoundsSurfaceControl, mTempBoundsRect);
+ mTransaction.setWindowCrop(mBoundsLayer, mTempBoundsRect);
}
/**
- * Called after window layout to update the bounds surface. If the surface insets have
- * changed or the surface has resized, update the bounds surface.
+ * Called after window layout to update the bounds surface. If the surface insets have changed
+ * or the surface has resized, update the bounds surface.
*/
- private void updateBoundsSurface() {
- if (mBoundsSurfaceControl != null && mSurface.isValid()) {
- setBoundsSurfaceCrop();
- mTransaction.deferTransactionUntilSurface(mBoundsSurfaceControl,
+ private void updateBoundsLayer() {
+ if (mBoundsLayer != null) {
+ setBoundsLayerCrop();
+ mTransaction.deferTransactionUntilSurface(mBoundsLayer,
mSurface, mSurface.getNextFrameNumber())
.apply();
}
}
private void destroySurface() {
+ if (mBoundsLayer != null) {
+ mBoundsLayer.release();
+ mBoundsLayer = null;
+ }
mSurface.release();
mSurfaceControl.release();
-
- mSurfaceSession = null;
-
- if (mBoundsSurfaceControl != null) {
- mTransaction.remove(mBoundsSurfaceControl).apply();
- mBoundsSurface.release();
- mBoundsSurfaceControl = null;
- }
}
/**
@@ -2649,8 +2636,8 @@
maybeHandleWindowMove(frame);
}
- if (surfaceSizeChanged) {
- updateBoundsSurface();
+ if (surfaceSizeChanged || surfaceReplaced || surfaceCreated || windowAttributesChanged) {
+ updateBoundsLayer();
}
final boolean didLayout = layoutRequested && (!mStopped || mReportNextDraw);
@@ -4388,13 +4375,6 @@
} catch (RemoteException e) {
}
- // Dispose the input channel after removing the window so the Window Manager
- // doesn't interpret the input channel being closed as an abnormal termination.
- if (mInputChannel != null) {
- mInputChannel.dispose();
- mInputChannel = null;
- }
-
mDisplayManager.unregisterDisplayListener(mDisplayListener);
unscheduleTraversals();
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java
index 9340b71..bcc6a55 100644
--- a/core/java/android/view/WindowInsets.java
+++ b/core/java/android/view/WindowInsets.java
@@ -35,6 +35,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
+import android.content.Intent;
import android.graphics.Insets;
import android.graphics.Rect;
import android.util.SparseArray;
@@ -644,6 +645,14 @@
* {@link View#setSystemGestureExclusionRects} outside of the
* {@link #getMandatorySystemGestureInsets() mandatory system gesture insets}.
*
+ * <p>Note: the system will put a limit of <code>200dp</code> on the vertical extent of the
+ * exclusions it takes into account. The limit does not apply while the navigation
+ * bar is {@link View#SYSTEM_UI_FLAG_IMMERSIVE_STICKY stickily} hidden, nor to the
+ * {@link android.inputmethodservice.InputMethodService input method} and
+ * {@link Intent#CATEGORY_HOME home activity}.
+ * </p>
+ *
+ *
* <p>Simple taps are guaranteed to reach the window even within the system gesture insets,
* as long as they are outside the {@link #getTappableElementInsets() system window insets}.
*
diff --git a/core/java/android/view/textclassifier/SelectionEvent.java b/core/java/android/view/textclassifier/SelectionEvent.java
index 80c728f..12ed4b9 100644
--- a/core/java/android/view/textclassifier/SelectionEvent.java
+++ b/core/java/android/view/textclassifier/SelectionEvent.java
@@ -410,6 +410,15 @@
}
/**
+ * Sets the id of this event's user.
+ * <p>
+ * Package-private for SystemTextClassifier's use.
+ */
+ void setUserId(@UserIdInt int userId) {
+ mUserId = userId;
+ }
+
+ /**
* Returns the id of this event's user.
* @hide
*/
diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java
index b5f972a..a97c330 100644
--- a/core/java/android/view/textclassifier/SystemTextClassifier.java
+++ b/core/java/android/view/textclassifier/SystemTextClassifier.java
@@ -151,6 +151,7 @@
Utils.checkMainThread();
try {
+ event.setUserId(mUserId);
mManagerService.onSelectionEvent(mSessionId, event);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Error reporting selection event.", e);
@@ -163,6 +164,12 @@
Utils.checkMainThread();
try {
+ final TextClassificationContext tcContext = event.getEventContext() == null
+ ? new TextClassificationContext.Builder(mPackageName, WIDGET_TYPE_UNKNOWN)
+ .build()
+ : event.getEventContext();
+ tcContext.setUserId(mUserId);
+ event.setEventContext(tcContext);
mManagerService.onTextClassifierEvent(mSessionId, event);
} catch (RemoteException e) {
Log.e(LOG_TAG, "Error reporting textclassifier event.", e);
diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java
index 57da829..a041296 100644
--- a/core/java/android/view/textclassifier/TextClassifierEvent.java
+++ b/core/java/android/view/textclassifier/TextClassifierEvent.java
@@ -139,7 +139,7 @@
@Nullable
private final String[] mEntityTypes;
@Nullable
- private final TextClassificationContext mEventContext;
+ private TextClassificationContext mEventContext;
@Nullable
private final String mResultId;
private final int mEventIndex;
@@ -289,6 +289,15 @@
}
/**
+ * Sets the event context.
+ * <p>
+ * Package-private for SystemTextClassifier's use.
+ */
+ void setEventContext(@Nullable TextClassificationContext eventContext) {
+ mEventContext = eventContext;
+ }
+
+ /**
* Returns the id of the text classifier result related to this event.
*/
@Nullable
diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java
index a46580d..18d4d69 100644
--- a/core/java/android/webkit/WebSettings.java
+++ b/core/java/android/webkit/WebSettings.java
@@ -464,7 +464,9 @@
* Note that the feature will continue to be supported on older versions of
* Android as before.
*
- * This function does not have any effect.
+ * @deprecated In Android O and afterwards, this function does not have
+ * any effect, the form data will be saved to platform's autofill service
+ * if applicable.
*/
@Deprecated
public abstract void setSaveFormData(boolean save);
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index 5091eea..ad35633 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -42,6 +42,8 @@
import android.view.animation.LinearInterpolator;
import android.widget.RemoteViews.RemoteView;
+import com.android.internal.R;
+
import java.lang.ref.WeakReference;
@RemoteView
@@ -1241,14 +1243,40 @@
info.setScrollable(getChildCount() > 1);
if (isEnabled()) {
if (getDisplayedChild() < getChildCount() - 1) {
- info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD);
+ if (mStackMode == ITEMS_SLIDE_UP) {
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_PAGE_DOWN);
+ } else {
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_PAGE_UP);
+ }
}
if (getDisplayedChild() > 0) {
- info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD);
+ if (mStackMode == ITEMS_SLIDE_UP) {
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_PAGE_UP);
+ } else {
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_PAGE_DOWN);
+ }
}
}
}
+ private boolean goForward() {
+ if (getDisplayedChild() < getChildCount() - 1) {
+ showNext();
+ return true;
+ }
+ return false;
+ }
+
+ private boolean goBackward() {
+ if (getDisplayedChild() > 0) {
+ showPrevious();
+ return true;
+ }
+ return false;
+ }
+
/** @hide */
@Override
public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
@@ -1260,17 +1288,25 @@
}
switch (action) {
case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
- if (getDisplayedChild() < getChildCount() - 1) {
- showNext();
- return true;
- }
- } return false;
+ return goForward();
+ }
case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
- if (getDisplayedChild() > 0) {
- showPrevious();
- return true;
+ return goBackward();
+ }
+ case R.id.accessibilityActionPageUp: {
+ if (mStackMode == ITEMS_SLIDE_UP) {
+ return goBackward();
+ } else {
+ return goForward();
}
- } return false;
+ }
+ case R.id.accessibilityActionPageDown: {
+ if (mStackMode == ITEMS_SLIDE_UP) {
+ return goForward();
+ } else {
+ return goBackward();
+ }
+ }
}
return false;
}
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
index 8fe2316..7c50337 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
@@ -47,6 +47,13 @@
*/
public static final String NAS_MAX_SUGGESTIONS = "nas_max_suggestions";
+ // Flags related to controls
+
+ /**
+ * (boolean) Wether to have split behavior when opening QS
+ */
+ public static final String QS_SPLIT_ENABLED = "qs_split_enabled";
+
// Flags related to Smart Suggestions - these are read in SmartReplyConstants.
/** (boolean) Whether to enable smart suggestions in notifications. */
diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java
index ad1ff90..1d81c59 100644
--- a/core/java/com/android/internal/content/PackageHelper.java
+++ b/core/java/com/android/internal/content/PackageHelper.java
@@ -261,8 +261,21 @@
public static boolean fitsOnInternal(Context context, SessionParams params) throws IOException {
final StorageManager storage = context.getSystemService(StorageManager.class);
final UUID target = storage.getUuidForPath(Environment.getDataDirectory());
- return (params.sizeBytes <= storage.getAllocatableBytes(target,
- translateAllocateFlags(params.installFlags)));
+ final int flags = translateAllocateFlags(params.installFlags);
+
+ final long allocateableBytes = storage.getAllocatableBytes(target,
+ flags | StorageManager.FLAG_ALLOCATE_NON_CACHE_ONLY);
+
+ // If we fit on internal storage without including freeable cache space, don't bother
+ // checking to determine how much space is taken up by the cache.
+ if (params.sizeBytes <= allocateableBytes) {
+ return true;
+ }
+
+ final long cacheClearable = storage.getAllocatableBytes(target,
+ flags | StorageManager.FLAG_ALLOCATE_CACHE_ONLY);
+
+ return params.sizeBytes <= allocateableBytes + cacheClearable;
}
public static boolean fitsOnExternal(Context context, SessionParams params) {
diff --git a/core/java/com/android/internal/preference/YesNoPreference.java b/core/java/com/android/internal/preference/YesNoPreference.java
index 7abf416..46d14a1 100644
--- a/core/java/com/android/internal/preference/YesNoPreference.java
+++ b/core/java/com/android/internal/preference/YesNoPreference.java
@@ -16,6 +16,7 @@
package com.android.internal.preference;
+import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Parcel;
@@ -40,6 +41,7 @@
this(context, attrs, defStyleAttr, 0);
}
+ @UnsupportedAppUsage
public YesNoPreference(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.yesNoPreferenceStyle);
}
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index b73ecd1..821022f 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -320,23 +320,57 @@
return array;
}
+ /**
+ * Combine multiple arrays into a single array.
+ *
+ * @param kind The class of the array elements
+ * @param arrays The arrays to combine
+ * @param <T> The class of the array elements (inferred from kind).
+ * @return A single array containing all the elements of the parameter arrays.
+ */
@SuppressWarnings("unchecked")
- public static @NonNull <T> T[] concatElements(Class<T> kind, @Nullable T[] a, @Nullable T[] b) {
- final int an = (a != null) ? a.length : 0;
- final int bn = (b != null) ? b.length : 0;
- if (an == 0 && bn == 0) {
- if (kind == String.class) {
- return (T[]) EmptyArray.STRING;
- } else if (kind == Object.class) {
- return (T[]) EmptyArray.OBJECT;
- }
+ public static @NonNull <T> T[] concatElements(Class<T> kind, @Nullable T[]... arrays) {
+ if (arrays == null || arrays.length == 0) {
+ return createEmptyArray(kind);
}
- final T[] res = (T[]) Array.newInstance(kind, an + bn);
- if (an > 0) System.arraycopy(a, 0, res, 0, an);
- if (bn > 0) System.arraycopy(b, 0, res, an, bn);
- return res;
+
+ int totalLength = 0;
+ for (T[] item : arrays) {
+ if (item == null) {
+ continue;
+ }
+
+ totalLength += item.length;
+ }
+
+ // Optimization for entirely empty arrays.
+ if (totalLength == 0) {
+ return createEmptyArray(kind);
+ }
+
+ final T[] all = (T[]) Array.newInstance(kind, totalLength);
+ int pos = 0;
+ for (T[] item : arrays) {
+ if (item == null || item.length == 0) {
+ continue;
+ }
+ System.arraycopy(item, 0, all, pos, item.length);
+ pos += item.length;
+ }
+ return all;
}
+ private static @NonNull <T> T[] createEmptyArray(Class<T> kind) {
+ if (kind == String.class) {
+ return (T[]) EmptyArray.STRING;
+ } else if (kind == Object.class) {
+ return (T[]) EmptyArray.OBJECT;
+ }
+
+ return (T[]) Array.newInstance(kind, 0);
+ }
+
+
/**
* Adds value to given array if not already present, providing set-like
* behavior.
diff --git a/core/java/com/android/internal/util/XmlUtils.java b/core/java/com/android/internal/util/XmlUtils.java
index 344d7ef..8799e3d 100644
--- a/core/java/com/android/internal/util/XmlUtils.java
+++ b/core/java/com/android/internal/util/XmlUtils.java
@@ -26,6 +26,8 @@
import android.util.Base64;
import android.util.Xml;
+import libcore.util.HexEncoding;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -396,16 +398,7 @@
final int N = val.length;
out.attribute(null, "num", Integer.toString(N));
- StringBuilder sb = new StringBuilder(val.length*2);
- for (int i=0; i<N; i++) {
- int b = val[i];
- int h = (b >> 4) & 0x0f;
- sb.append((char)(h >= 10 ? ('a'+h-10) : ('0'+h)));
- h = b & 0x0f;
- sb.append((char)(h >= 10 ? ('a'+h-10) : ('0'+h)));
- }
-
- out.text(sb.toString());
+ out.text(HexEncoding.encodeToString(val).toLowerCase());
out.endTag(null, "byte-array");
}
@@ -1032,7 +1025,9 @@
"Not a number in num attribute in byte-array");
}
- byte[] array = new byte[num];
+ // 0 len byte array does not have a text in the XML tag. So, initialize to 0 len array.
+ // For all other array lens, HexEncoding.decode() below overrides the array.
+ byte[] array = new byte[0];
int eventType = parser.getEventType();
do {
@@ -1043,16 +1038,7 @@
throw new XmlPullParserException(
"Invalid value found in byte-array: " + values);
}
- // This is ugly, but keeping it to mirror the logic in #writeByteArrayXml.
- for (int i = 0; i < num; i ++) {
- char nibbleHighChar = values.charAt(2 * i);
- char nibbleLowChar = values.charAt(2 * i + 1);
- int nibbleHigh = nibbleHighChar > 'a' ? (nibbleHighChar - 'a' + 10)
- : (nibbleHighChar - '0');
- int nibbleLow = nibbleLowChar > 'a' ? (nibbleLowChar - 'a' + 10)
- : (nibbleLowChar - '0');
- array[i] = (byte) ((nibbleHigh & 0x0F) << 4 | (nibbleLow & 0x0F));
- }
+ array = HexEncoding.decode(values);
}
} else if (eventType == parser.END_TAG) {
if (parser.getName().equals(endTag)) {
diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java
index dfd6f95..cc468f4 100644
--- a/core/java/com/android/internal/view/BaseIWindow.java
+++ b/core/java/com/android/internal/view/BaseIWindow.java
@@ -33,7 +33,13 @@
import com.android.internal.os.IResultReceiver;
+import dalvik.annotation.compat.UnsupportedAppUsage;
+
public class BaseIWindow extends IWindow.Stub {
+
+ @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P)
+ public BaseIWindow() {}
+
private IWindowSession mSession;
public int mSeq;
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index dc45f78..32867a8 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -558,7 +558,7 @@
/**
* Returns the password history hash factor, needed to check new password against password
- * history with {@link #checkPasswordHistory(String, byte[], int)}
+ * history with {@link #checkPasswordHistory(byte[], byte[], int)}
*/
public byte[] getPasswordHistoryHashFactor(byte[] currentPassword, int userId) {
try {
@@ -1242,23 +1242,6 @@
return res;
}
- /**
- * Transform a pattern byte array to base zero form.
- * @param bytes pattern byte array.
- * @return The pattern in base zero form.
- */
- public static byte[] patternByteArrayToBaseZero(byte[] bytes) {
- if (bytes == null) {
- return new byte[0];
- }
- final int patternSize = bytes.length;
- byte[] res = new byte[patternSize];
- for (int i = 0; i < patternSize; i++) {
- res[i] = (byte) (bytes[i] - '1');
- }
- return res;
- }
-
/*
* Generate an SHA-1 hash for the pattern. Not the most secure, but it is
* at least a second level of protection. First level is that the file
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java
index 9084f62..d48034b 100644
--- a/core/java/com/android/internal/widget/PointerLocationView.java
+++ b/core/java/com/android/internal/widget/PointerLocationView.java
@@ -53,6 +53,12 @@
// to plot alongside the default one. Useful for testing and comparison purposes.
private static final String ALT_STRATEGY_PROPERY_KEY = "debug.velocitytracker.alt";
+ /**
+ * If set to a positive value between 1-255, shows an overlay with the approved (red) and
+ * rejected (blue) exclusions.
+ */
+ private static final String GESTURE_EXCLUSION_PROP = "debug.pointerlocation.showexclusion";
+
public static class PointerState {
// Trace of previous points.
private float[] mTraceX = new float[32];
@@ -138,8 +144,10 @@
private final PointerCoords mTempCoords = new PointerCoords();
private final Region mSystemGestureExclusion = new Region();
+ private final Region mSystemGestureExclusionRejected = new Region();
private final Path mSystemGestureExclusionPath = new Path();
private final Paint mSystemGestureExclusionPaint;
+ private final Paint mSystemGestureExclusionRejectedPaint;
private final VelocityTracker mVelocity;
private final VelocityTracker mAltVelocity;
@@ -190,6 +198,10 @@
mSystemGestureExclusionPaint.setARGB(25, 255, 0, 0);
mSystemGestureExclusionPaint.setStyle(Paint.Style.FILL_AND_STROKE);
+ mSystemGestureExclusionRejectedPaint = new Paint();
+ mSystemGestureExclusionRejectedPaint.setARGB(25, 0, 0, 255);
+ mSystemGestureExclusionRejectedPaint.setStyle(Paint.Style.FILL_AND_STROKE);
+
PointerState ps = new PointerState();
mPointers.add(ps);
mActivePointerId = 0;
@@ -263,6 +275,12 @@
canvas.drawPath(mSystemGestureExclusionPath, mSystemGestureExclusionPaint);
}
+ if (!mSystemGestureExclusionRejected.isEmpty()) {
+ mSystemGestureExclusionPath.reset();
+ mSystemGestureExclusionRejected.getBoundaryPath(mSystemGestureExclusionPath);
+ canvas.drawPath(mSystemGestureExclusionPath, mSystemGestureExclusionRejectedPaint);
+ }
+
// Labels
if (mActivePointerId >= 0) {
final PointerState ps = mPointers.get(mActivePointerId);
@@ -754,6 +772,9 @@
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
+ final int alpha = systemGestureExclusionOpacity();
+ mSystemGestureExclusionPaint.setAlpha(alpha);
+ mSystemGestureExclusionRejectedPaint.setAlpha(alpha);
} else {
mSystemGestureExclusion.setEmpty();
}
@@ -805,7 +826,12 @@
}
private static boolean shouldShowSystemGestureExclusion() {
- return SystemProperties.getBoolean("debug.pointerlocation.showexclusion", false);
+ return systemGestureExclusionOpacity() > 0;
+ }
+
+ private static int systemGestureExclusionOpacity() {
+ int x = SystemProperties.getInt(GESTURE_EXCLUSION_PROP, 0);
+ return x >= 0 && x <= 255 ? x : 0;
}
// HACK
@@ -928,12 +954,19 @@
private ISystemGestureExclusionListener mSystemGestureExclusionListener =
new ISystemGestureExclusionListener.Stub() {
@Override
- public void onSystemGestureExclusionChanged(int displayId, Region systemGestureExclusion) {
+ public void onSystemGestureExclusionChanged(int displayId, Region systemGestureExclusion,
+ Region systemGestureExclusionUnrestricted) {
Region exclusion = Region.obtain(systemGestureExclusion);
+ Region rejected = Region.obtain();
+ if (systemGestureExclusionUnrestricted != null) {
+ rejected.set(systemGestureExclusionUnrestricted);
+ rejected.op(exclusion, Region.Op.DIFFERENCE);
+ }
Handler handler = getHandler();
if (handler != null) {
handler.post(() -> {
mSystemGestureExclusion.set(exclusion);
+ mSystemGestureExclusionRejected.set(rejected);
exclusion.recycle();
invalidate();
});
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 73a7289..844a898 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -288,6 +288,8 @@
],
include_dirs: [
"external/vulkan-headers/include",
+ "frameworks/native/libs/nativebase/include",
+ "frameworks/native/libs/nativewindow/include"
],
shared_libs: [
"libicui18n",
@@ -297,6 +299,7 @@
"libandroidfw",
"libcompiler_rt",
"libutils",
+ "libhostgraphics",
],
},
linux_glibc: {
diff --git a/core/proto/OWNERS b/core/proto/OWNERS
index 71e3860..6ab0fc9 100644
--- a/core/proto/OWNERS
+++ b/core/proto/OWNERS
@@ -15,3 +15,6 @@
# Launcher
hyunyoungs@google.com
+
+# Graphics stats
+jreck@google.com
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 7a0d475..878cda1 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Stemboodskappe"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-oproepe"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Hoëprioriteit-SIM-status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Ander party het TTY-modus VOL versoek"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ander party het TTY-modus GOD versoek"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ander party het TTY-modus SOD versoek"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 11ab44d..f5ef6ca 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"የድምጽ መልዕክቶች"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"የWi-Fi ጥሪ"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"የሲም ሁኔታ"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ከፍተኛ ቅድሚያ ተሰጪ የሲም ኹናቴ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 6edc933..217c3cf 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -99,6 +99,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"رسائل البريد الصوتي"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"الاتصال عبر Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"حالة شريحة SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"حالة شريحة SIM ذات أولوية"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"طلب النظير وضع TTY الكامل"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"طلب النظير وضع TTY على HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"طلب النظير وضع TTY على VCO"</string>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 3660403..6ea6a52 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভইচমেইলৰ বাৰ্তাসমূহ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ৱাই-ফাই কলিং"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"ছিমৰ স্থিতি"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"উচ্চ অগ্ৰাধিকাৰযুক্ত ছিমৰ স্থিতি"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড FULLলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড HCOলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড VCO লৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index e2b3998..47572bc87 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Səsli e-poçt mesajları"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zəngi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Yüksək Prioritetli SIM statusu"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Eskpert TTY Rejimi FULL-u sorğuladı"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ekspert TTY Rejimi HCO-nu sorğuladı"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ekspert TTY Rejimi VCO-nu sorğuladı"</string>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 821b730..9bd9e93 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -96,6 +96,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Pozivanje preko Wi-Fi mreže"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Obaveštenja SIM kartice sa statusom „visok prioritet“"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Korisnik zahteva POTPUN režim TTY"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Korisnik zahteva PRENOS ZVUKA za režim TTY"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Korisnik zahteva PRENOS GLASA za režim TTY"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index d573202..2b5d8c9 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Паведамленні галасавой пошты"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-тэлефанія"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карты"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Стан SIM-карты з высокім прыярытэтам"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Аднарангавая прылада запытала рэжым TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Аднарангавая прылада запытала рэжым TTY НСО"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Аднарангавая прылада запытала рэжым TTY VCO"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index e073b7d..c9220a0 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Съобщения в гласовата поща"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Обаждания през Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Състояние на SIM картата"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Състояние на SIM картата с висок приоритет"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Отсрещният потребител заяви пълен TTY режим (FULL)"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Отсрещният потребител заяви TTY режим с пренос на слух (HCO)"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Отсрещният потребител заяви TTY режим с пренос на глас (VCО)"</string>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 368ff90..b6a9240 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভয়েসমেল মেসেজ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ওয়াই-ফাই কলিং"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"সিম কার্ডের স্টাটাস"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"উচ্চ প্রায়রিটি সিম স্ট্যাটাস"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"পির TTY মোড FULL অনুরোধ করেছে"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"পির TTY মোড HCO অনুরোধ করেছে"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"পির TTY মোড VCO অনুরোধ করেছে"</string>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index ce852b6..02d65e3 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -96,6 +96,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Pozivanje putem WiFi-ja"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status visokog prioriteta SIM-a"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Ravnopravni uređaj zatražio načina rada TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ravnopravni uređaj zatražio načina rada TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ravnopravni uređaj zatražio načina rada TTY VCO"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index bbf1736..0ec04b6 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Missatges de veu"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Trucades per Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Estat de la SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Estat de la SIM d\'alta prioritat"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"L\'altre dispositiu ha sol·licitat el mode TTY COMPLET."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"L\'altre dispositiu ha sol·licitat el mode TTY HCO."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"L\'altre dispositiu ha sol·licitat el mode TTY VCO."</string>
@@ -573,9 +574,9 @@
<string name="face_acquired_recalibrate" msgid="8077949502893707539">"Torna a registrar la teva cara."</string>
<string name="face_acquired_too_different" msgid="7663983770123789694">"Ja no es reconeix la teva cara. Torna-ho a provar."</string>
<string name="face_acquired_too_similar" msgid="1508776858407646460">"És massa semblant; canvia de postura."</string>
- <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"Inclina el cap una mica menys."</string>
- <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Inclina el cap una mica menys."</string>
- <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"No inclinis tant el cap."</string>
+ <string name="face_acquired_pan_too_extreme" msgid="4581629343077288178">"No giris tant el cap."</string>
+ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"No inclinis tant el cap."</string>
+ <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"No giris tant el cap."</string>
<string name="face_acquired_obscured" msgid="5357207702967893283">"Suprimeix qualsevol cosa que amagui la teva cara."</string>
<string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Neteja la part superior de la pantalla, inclosa la barra negra"</string>
<string-array name="face_acquired_vendor">
@@ -1483,7 +1484,7 @@
<string name="back_button_label" msgid="2300470004503343439">"Enrere"</string>
<string name="next_button_label" msgid="1080555104677992408">"Següent"</string>
<string name="skip_button_label" msgid="1275362299471631819">"Omet"</string>
- <string name="no_matches" msgid="8129421908915840737">"Cap coincidència"</string>
+ <string name="no_matches" msgid="8129421908915840737">"No s\'ha trobat cap coincidència"</string>
<string name="find_on_page" msgid="1946799233822820384">"Troba-ho a la pàgina"</string>
<plurals name="matches_found" formatted="false" msgid="1210884353962081884">
<item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 4171a8b..3a77e9c 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Hlasové zprávy"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Volání přes Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Stav SIM karty"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stav SIM karty: vysoká priorita"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner požádal o přechod na režim TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner požádal o přechod na režim TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner požádal o přechod na režim TTY VCO"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index b6cb874..c10680e 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talebeskeder"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-opkald"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM-kort med høj prioritet"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Den anden enhed har skiftet til FULD TTY-tilstand"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Den anden enhed har skiftet til TTY-tilstanden HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Den anden enhed har skiftet til TTY-tilstanden VCO"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 114d801..933741a 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mailboxnachrichten"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"WLAN-Telefonie"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status der SIM-Karte"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Benachrichtigungen mit hoher Priorität von der SIM-Karte"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer hat TTY-Modus \"Vollständig\" angefordert."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer hat TTY-Modus \"HCO\" angefordert."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer hat TTY-Modus \"VC\" angefordert."</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 44357ff..e5ff8a8 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Μηνύματα αυτόματου τηλεφωνητή"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Κλήση Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Κατάσταση SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Κατάσταση SIM υψηλής προτεραιότητας"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Αίτημα peer για TTY ΠΛΗΡΗΣ Λειτουργία"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Αίτημα peer για TTY Λειτουργία HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Αίτημα peer για TTY Λειτουργία VCO"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index cc389f3..4f0ebc5 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 0e6d49c..d1ac6dc 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index cc389f3..4f0ebc5 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index cc389f3..4f0ebc5 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index dade85e..66aa946 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi calling"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 3a2ea3e..68604d9 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensajes del buzón de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Llamada con Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Estado de SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Notificaciones de prioridad alta sobre el estado de la SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"El dispositivo del mismo nivel solicitó el modo TTY FULL."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"El dispositivo del mismo nivel solicitó el modo TTY HCO."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"El dispositivo del mismo nivel solicitó el modo TTY VCO."</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 633759b..f290fae 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensajes de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Llamada por Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Estado de la tarjeta SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Estado de SIM de alta prioridad"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Un dispositivo ha solicitado el modo TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Un dispositivo ha solicitado el modo TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Un dispositivo ha solicitado el modo TTY VCO"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 86843c7..8e07555 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Kõnepostisõnumid"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"WiFi-kõned"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kaardi olek"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Kõrge prioriteediga SIM-i olek"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner taotles TTY-režiimi TÄIELIK"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner taotles TTY-režiimi HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner taotles TTY-režiimi VCO"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index d25fe8c..7303406 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Erantzungailuko mezuak"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi bidezko deiak"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIMaren egoera"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM txartelaren lehentasun handiko jakinarazpenak"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Beste gailuak TTY osagarria HCO moduan erabiltzea eskatu du"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Beste gailuak TTY osagarria VCO moduan erabiltzea eskatu du"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 48cdafc..44428dc 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"پیامهای پست صوتی"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"تماس ازطریق Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"وضعیت سیمکارت"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"وضعیت سیم با اولویت بالا"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"دستگاه مرتبط درخواست TTY حالت FULL کرد"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"دستگاه مرتبط درخواست TTY حالت HCO کرد"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"دستگاه مرتبط درخواست TTY حالت VCO کرد"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index cd9a711..ccc9d33 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Vastaajaviestit"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-puhelut"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kortin tila"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Tärkeät SIM-ilmoitukset"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Toinen käyttäjä vaihtoi TTY-tilaksi TÄYSI"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Toinen käyttäjä vaihtoi TTY-tilaksi HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Toinen käyttäjä vaihtoi TTY-tilaksi VCO"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 2bfef39..99f874d 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messages vocaux"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Appels Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"État de la carte SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"État SIM de priorité élevée"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Mode TTY COMPLET demandé par un pair"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Mode TTY HCO demandé par un pair"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Mode TTY VCO demandé par un pair"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 041668f..bac6066 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messages vocaux"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Appels Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"État de la carte SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Notifications prioritaires de la carte SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Mode TTY demandé par l\'interlocuteur : COMPLET"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Mode TTY demandé par l\'interlocuteur : HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Mode TTY demandé par l\'interlocuteur : VCO"</string>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index b3eed4a..40c1ed2 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensaxes de correo de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por wifi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Estado da SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Estado da SIM con prioridade alta"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Outro dispositivo solicitou o modo TTY COMPLETO"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Outro dispositivo solicitou o modo TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Outro dispositivo solicitou o modo TTY VCO"</string>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 1b96172..bbb344b 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"વૉઇસમેઇલ સંદેશા"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"વાઇ-ફાઇ કૉલિંગ"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"સિમનું સ્ટેટસ"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"સિમ કાર્ડનું ઉચ્ચ પ્રાધાન્યતાનું સ્ટેટસ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"પીઅરે TTY મોડ HCO ની વિનંતી કરી"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"પીઅરે TTY મોડ VCO ની વિનંતી કરી"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index fd063c4..f130e01 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"वॉइसमेल संदेश"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"वाई-फ़ाई कॉलिंग"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"सिम की स्थिति"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"सिम की ज़रूरी सूचनाओं की स्थिति"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"पीयर ने टेलीटाइपराइटर (TTY) मोड फ़ुल का अनुरोध किया"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीओ (VCO) का अनुरोध किया"</string>
@@ -451,7 +452,7 @@
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ऐप को डिवाइस के फ़ोन नंबर का इस्तेमाल करने देती है."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"टैबलेट को सोने (कम बैटरी मोड) से रोकें"</string>
<string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"टीवी को सोने (कम बैटरी मोड) से रोकें"</string>
- <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"टीवी को सोने (कम बैटरी मोड) से रोकें"</string>
+ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"फ़ोन को सोने (कम बैटरी मोड) से रोकें"</string>
<string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"ऐप्स को टैबलेट को प्रयोग में नहीं हो जाने से रोकता है."</string>
<string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"ऐप को टीवी को सोने (कम बैटरी मोड) से रोकने की अनुमति देता है."</string>
<string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"ऐप्स को फ़ोन को प्रयोग में नहीं होने से रोकता है."</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 21fdc2f..38bd8a3 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -96,6 +96,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi pozivi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status SIM-a visokog prioriteta"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Način TTY FULL koji zahtijeva paralelni uređaj"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Način TTY HCO koji zahtijeva paralelni uređaj"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Način TTY VCO koji zahtijeva paralelni uređaj"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 1198610..d146ca7 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Hangpostaüzenetek"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-hívás"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kártya állapota"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Elsődleges SIM-kártya állapota"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner által kért TTY-mód: FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner által kért TTY-mód: HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner által kért TTY-mód: VCO"</string>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 7165df9..91d2552 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ձայնային փոստի հաղորդագրություններ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Զանգեր Wi-Fi-ի միջոցով"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM քարտի կարգավիճակը"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM քարտի բարձր առաջնահերթության ծանուցումներ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Բաժանորդի սարքում ընտրված է հեռատիպի ԲՈԼՈՐԸ ռեժիմը"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index ca369eb..4a8723b 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Notifikasi pesan suara"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status SIM prioritas tinggi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Rekan meminta Mode TTY PENUH"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Rekan meminta Mode TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Rekan meminta Mode TTY VCO"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 572313a..16bcd27 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talhólfsskilaboð"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi símtöl"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Staða SIM-korts"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Áríðandi staða SIM-korts"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Jafningi bað um FULLA stillingu fjarrita"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Jafningi bað um HCO-stillingu fjarrita"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Jafningi bað um VCO-stillingu fjarrita"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 6c579b8..8581eca 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messaggi vocali"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chiamate Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Stato SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stato SIM con priorità elevata"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer ha richiesto la modalità TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer ha richiesto la modalità TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer ha richiesto la modalità TTY VCO"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 437b31b..dc108b4 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"הודעות קוליות"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"שיחות Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"סטטוס SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"סטטוס התראות SIM בעדיפות גבוהה"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"העמית ביקש TTY במצב FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"העמית ביקש TTY במצב HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"העמית ביקש TTY במצב VCO"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 471c666..5180ab2 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ボイスメール メッセージ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM のステータス"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"高優先度: SIM のステータス"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ピアから、TTY モードを FULL にするようリクエストされました"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ピアから、TTYモードをHCOにするようリクエストされました"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ピアから、TTYモードをVCOにするようリクエストされました"</string>
@@ -551,11 +552,11 @@
<string-array name="fingerprint_error_vendor">
</string-array>
<string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋アイコン"</string>
- <string name="permlab_manageFace" msgid="7262837876352591553">"フェイスアンロック ハードウェアの管理"</string>
+ <string name="permlab_manageFace" msgid="7262837876352591553">"顔認証ハードウェアの管理"</string>
<string name="permdesc_manageFace" msgid="8919637120670185330">"使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。"</string>
- <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"フェイスアンロック ハードウェアの使用"</string>
- <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"フェイスアンロック ハードウェアを認証に使用することをアプリに許可します"</string>
- <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"フェイスアンロック"</string>
+ <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"顔認証ハードウェアの使用"</string>
+ <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"顔認証ハードウェアを認証に使用することをアプリに許可します"</string>
+ <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"顔認証"</string>
<string name="face_recalibrate_notification_title" msgid="4087620069451499365">"顔の再登録"</string>
<string name="face_recalibrate_notification_content" msgid="5530308842361499835">"認識を改善するには、顔を再登録してください"</string>
<string name="face_acquired_insufficient" msgid="2767330364802375742">"顔を認識できませんでした。もう一度お試しください。"</string>
@@ -581,15 +582,15 @@
<string-array name="face_acquired_vendor">
</string-array>
<string name="face_error_hw_not_available" msgid="396883585636963908">"顔を確認できません。ハードウェアを利用できません。"</string>
- <string name="face_error_timeout" msgid="981512090365729465">"フェイスアンロックをもう一度お試しください。"</string>
+ <string name="face_error_timeout" msgid="981512090365729465">"顔認証をもう一度お試しください。"</string>
<string name="face_error_no_space" msgid="2712120617457553825">"新しい顔データを保存できません。古いデータを削除してください。"</string>
<string name="face_error_canceled" msgid="283945501061931023">"顔の操作をキャンセルしました。"</string>
- <string name="face_error_user_canceled" msgid="5317030072349668946">"フェイスアンロックはユーザーによりキャンセルされました。"</string>
+ <string name="face_error_user_canceled" msgid="5317030072349668946">"顔認証はユーザーによりキャンセルされました。"</string>
<string name="face_error_lockout" msgid="3407426963155388504">"試行回数の上限です。後でもう一度お試しください。"</string>
- <string name="face_error_lockout_permanent" msgid="4723594314443097159">"試行回数が上限を超えました。フェイスアンロックを無効にしました。"</string>
+ <string name="face_error_lockout_permanent" msgid="4723594314443097159">"試行回数が上限を超えたため、顔認証を無効にしました。"</string>
<string name="face_error_unable_to_process" msgid="4940944939691171539">"顔を確認できません。もう一度お試しください。"</string>
- <string name="face_error_not_enrolled" msgid="4016937174832839540">"フェイスアンロックを設定していません。"</string>
- <string name="face_error_hw_not_present" msgid="8302690289757559738">"このデバイスでは、フェイスアンロックはご利用いただけません。"</string>
+ <string name="face_error_not_enrolled" msgid="4016937174832839540">"顔認証を設定していません。"</string>
+ <string name="face_error_hw_not_present" msgid="8302690289757559738">"このデバイスでは、顔認証はご利用いただけません。"</string>
<string name="face_name_template" msgid="7004562145809595384">"顔 <xliff:g id="FACEID">%d</xliff:g>"</string>
<string-array name="face_error_vendor">
</string-array>
@@ -818,7 +819,7 @@
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"もう一度お試しください"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"もう一度お試しください"</string>
<string name="lockscreen_storage_locked" msgid="9167551160010625200">"すべての機能とデータを利用するにはロック解除"</string>
- <string name="faceunlock_multiple_failures" msgid="754137583022792429">"フェイスアンロックの最大試行回数を超えました"</string>
+ <string name="faceunlock_multiple_failures" msgid="754137583022792429">"顔認証の最大試行回数を超えました"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIMカードが挿入されていません"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"タブレット内にSIMカードがありません。"</string>
<string name="lockscreen_missing_sim_message" product="tv" msgid="1943633865476989599">"テレビにSIMカードが挿入されていません。"</string>
@@ -888,7 +889,7 @@
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"ロック解除エリアを拡大します。"</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"スライドロックを解除します。"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"パターンロックを解除します。"</string>
- <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"フェイスアンロックを行います。"</string>
+ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"顔認証を行います。"</string>
<string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PINロックを解除します。"</string>
<string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"SIM PIN のロックを解除します。"</string>
<string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"SIM PUK のロックを解除します。"</string>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 3570d4c..2bba8cb 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ხმოვანი ფოსტის შეტყობინებები"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"დარეკვა Wi-Fi-ს მეშვეობით"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM სტატუსი"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"მაღალპრიორიტეტული SIM სტატუსი"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"მოთხოვნილია კვანძი TTY რეჟიმი FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"მოთხოვნილია კვანძი TTY რეჟიმი HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"მოთხოვნილია კვანძი TTY რეჟიმი VCO"</string>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 2ed1e5b..ec0ab3e 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дауыстық пошта хабарлары"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi қоңыраулары"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM күйі"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM картасы туралы маңызды хабарландырулар"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Пир TTY режимі ТОЛЫҚ сұрады"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Пир TTY режимінің HCO сұрады"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Пир TTY режимінің VCO сұрады"</string>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 02c6ba8..e9a140c 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"សារជាសំឡេង"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ការហៅទូរសព្ទតាម Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"ស្ថានភាពស៊ីម"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ស្ថានភាពស៊ីមដែលមានអាទិភាពខ្ពស់"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode VCO"</string>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 875ecd4..e82d54b 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳು"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"ಸಿಮ್ ಸ್ಥಿತಿ"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ಹೆಚ್ಚಿನ ಆದ್ಯತೆಯ ಸಿಮ್ ಸ್ಥಿತಿ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 9077145..4be4bd2 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"음성사서함 메시지"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 통화"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM 상태"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"우선순위가 높은 SIM 상태"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"피어가 TTY 모드 FULL을 요청했습니다."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"피어가 TTY 모드 HCO를 요청했습니다."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"피어가 TTY 모드 VCO를 요청했습니다."</string>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 8cac363..6607242 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Үн почтасынын билдирүүлөрү"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi аркылуу чалуу"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM-картанын абалы"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM картадагы өтө маанилүү билдирмелер"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer TTY режимин FULL кылууну суранды"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer TTY режимин HCO кылууну суранды"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer TTY режимин VCO кылууну суранды"</string>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index 47b0fe4..684adc3 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ຂໍ້ຄວາມສຽງ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ການໂທ Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"ສະຖານະ SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ສະຖານະ SIM ຄວາມສຳຄັນສູງ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ໂໝດ TTY ທີ່ເພື່ອນຂໍນັ້ນເຕັມແລ້ວ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ໂໝດ TTY ທີ່ເພື່ອນຂໍ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ໂໝດ TTY ທີ່ເພື່ອນຂໍ VCO"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 6f8e2df..5283f27 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balso pašto pranešimai"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"„Wi-Fi“ skambinimas"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM būsena"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Didelio prioriteto SIM kortelės būsena"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo VCO"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 253ff72..c93ae1f 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -96,6 +96,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balss pasta ziņojumi"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zvani"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM kartes statuss"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Augstas prioritātes SIM kartes statuss"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO"</string>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 19c1c85..70ee0ae 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Пораки од говорна пошта"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Повикување преку Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Статус на SIM-картичка"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Статус на SIM-известувања со висок приоритет"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Рамноправен уред го побара режимот на TTY „FULL“"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Рамноправен уред го побара режимот на TTY „HCO“"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Рамноправен уред го побара режимот на TTY „VCO“"</string>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index b2e9b64..3fb844d 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"വൈഫൈ കോളിംഗ്"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"സിം നില"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ഉയർന്ന മുൻഗണനയുള്ള സിം നില"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO"</string>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index a229713..254bb0e 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дуут шуудангийн мессеж"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi дуудлага"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM статус"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Өндөр ач холбогдолтой SIM-н статус"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Хандлагын цэгт хүсэлт тавьсан TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Хандлагын цэгт хүсэлт тавьсан TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Хандлагын цэгт хүсэлт тавьсан TTY Mode VCO"</string>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index a86caa5..5fc2310 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"व्हॉइसमेल मेसेज"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"वाय-फाय कॉलिंग"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"सिम स्थिती"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"उच्च प्राधान्य सिम स्थिती"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली"</string>
@@ -302,8 +303,8 @@
<string name="permgroupdesc_activityRecognition" msgid="6949472038320473478">"शारीरिक अॅक्टिव्हिटी अॅक्सेस करा"</string>
<string name="permgrouprequest_activityRecognition" msgid="7626438016904799383">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमची शारीरिक अॅक्टिव्हिटी अॅक्सेस करण्याची अनुमती द्यायची का?"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"कॅमेरा"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"चित्रे घेण्याची आणि व्हिडिओ रेकॉर्ड"</string>
- <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला फोटो घेऊ आणि व्हिडिओ रेकॉर्ड करू द्यायचे?"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"चित्रे काढण्याची आणि व्हिडिओ रेकॉर्ड करण्याची"</string>
+ <string name="permgrouprequest_camera" msgid="1299833592069671756">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला फोटो काढू आणि व्हिडिओ रेकॉर्ड करू द्यायचे?"</string>
<string name="permgrouplab_calllog" msgid="8798646184930388160">"कॉल लॉग"</string>
<string name="permgroupdesc_calllog" msgid="3006237336748283775">"फोन कॉल लॉग वाचा आणि लिहा"</string>
<string name="permgrouprequest_calllog" msgid="8487355309583773267">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमचे फोन कॉल लॉग अॅक्सेस करण्याची अनुमती द्यायची का?"</string>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index c18e078..7d1b76c 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesej mel suara"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status SIM keutamaan tinggi"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Rakan meminta Mod TTY PENUH"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Rakan meminta Mod TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Rakan meminta Mod TTY VCO"</string>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 55e7b01..e037b70 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"အသံမေးလ် မက်ဆေ့ဂျ်များ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ခေါ်ဆိုမှု"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"ဆင်းမ်ကဒ် အခြေအနေ"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"အထူးဦးစားပေး ဆင်းမ်ကတ်အခြေအနေ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index a589389..c75c8d1 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talepostmeldinger"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-anrop"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM-status er satt til høy prioritet"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Motpart ba om TTY-modus FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Motpart ba om TTY-modus HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Motpart ba om TTY-modus VCO"</string>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 89e75b4..1422caa 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"भ्वाइस मेल सन्देशहरू"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi कल"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM को स्थिति"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"उच्च प्राथमिकता रहेको SIM को स्थिति"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"सहकर्मी अनुरोध गरियो। TTY मोड HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"सहकर्मी अनुरोध गरियो। TTY मोड VCO"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 4194eb1..c668abe 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemailberichten"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Bellen via wifi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Simkaartstatus"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Meldingen met hoge prioriteit voor de simkaartstatus"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Door peer aangevraagde TTY-modus VOL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Door peer aangevraagde TTY-modus HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Door peer aangevraagde TTY-modus VCO"</string>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index df874bc..940fdc16 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ଭଏସମେଲ୍ ମେସେଜ୍"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ୱାଇ-ଫାଇ କଲିଙ୍ଗ"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM ଷ୍ଟାଟସ୍"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ଉଚ୍ଚ ପ୍ରାଥମିକତା SIM ସ୍ଥିତି"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ପୀଆର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ FULL ଅଟେ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ HCO ଅଟେ"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ VCO ଅଟେ"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 8245546..ddf2fc1 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ਵੌਇਸਮੇਲ ਸੁਨੇਹੇ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"ਸਿਮ ਅਵਸਥਾ"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ਉੱਚ ਤਰਜੀਹੀ ਸਿਮ ਸਥਿਤੀ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 054a456..69fc0e6 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Wiadomości poczty głosowej"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Połączenia przez Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Stan karty SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stan karty SIM – wysoki priorytet"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Drugie urządzenie zażądało trybu „TTY pełny”"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Drugie urządzenie zażądało trybu „TTY HCO”"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Drugie urządzenie zażądało trybu „TTY VCO”"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 742fa81..f29ea42 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens do correio de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status do chip"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status de prioridade alta do chip"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTD modo COMPLETO solicitado"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTD modo HCO solicitado"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTD modo VCO solicitado"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 85fb7fd..696f2f1 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens de correio de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Estado do SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Estado do SIM de elevada prioridade"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"O par solicitou o modo COMPLETO de teletipo"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"O par solicitou o modo HCO de teletipo"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"O par solicitou o modo VCO de teletipo"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 742fa81..f29ea42 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens do correio de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status do chip"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status de prioridade alta do chip"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTD modo COMPLETO solicitado"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTD modo HCO solicitado"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTD modo VCO solicitado"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 2f464e9..d80a7ba 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -96,6 +96,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesaje din mesageria vocală"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Apelare prin Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Starea cardului SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Notificări de la SIM cu prioritate ridicată"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Cealaltă persoană a solicitat modul TTY cu setarea COMPLET"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Cealaltă persoană a solicitat modul TTY cu setarea HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Cealaltă persoană a solicitat modul TTY cu setarea VCO"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index c4b61b2..410f4b9 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Голосовые сообщения"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Звонки по Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карты"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Важные уведомления SIM-карты"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"На устройстве абонента выбран режим телетайпа \"ВСЕ\""</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"На устройстве абонента выбран режим телетайпа HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"На устройстве абонента выбран режим телетайпа VCO"</string>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index ddeb94b..a39cb6e 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"හඬ තැපැල් පණිවිඩ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ඇමතීම"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM තත්ත්වය"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ඉහළ ප්රමුඛතා SIM තත්ත්වය"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"සම ඉල්ලීම් කළ TTY ප්රකාරය පූර්ණයි"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"සම ඉල්ලීම් කළ TTY ප්රකාරය HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"සම ඉල්ලීම් කළ TTY ප්රකාරය VCO"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 4d19308..d8a7561 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Správy hlasovej schránky"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Volanie cez Wi‑Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Stav SIM karty"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stav SIM karty: vysoká priorita"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index b2b3109..7e12c2c 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sporočila v odzivniku"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Klicanje prek Wi-Fi-ja"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Stanje kartice SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stanje kartice SIM z visoko stopnjo prednosti"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Enakovredna naprava je zahtevala način TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Enakovredna naprava je zahtevala način TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Enakovredna naprava je zahtevala način TTY VCO"</string>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index afed336..a958d1b 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesazhet e postës zanore"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Telefonata me Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Statusi i kartës SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Statusi i kartës SIM me përparësi të lartë"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Homologu yt kërkoi modalitet \"TTY\" të plotë"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\""</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\""</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 110b31d..1adede3 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -96,6 +96,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Поруке говорне поште"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Позивање преко Wi-Fi мреже"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-а"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Обавештења SIM картице са статусом „висок приоритет“"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Корисник захтева ПОТПУН режим TTY"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Корисник захтева ПРЕНОС ЗВУКА за режим TTY"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Корисник захтева ПРЕНОС ГЛАСА за режим TTY"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index bc1752e..434f36a 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Röstmeddelanden"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-samtal"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status för SIM-kort"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM-aviseringar med hög prioritet"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer-enheten begärde texttelefonläget FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer-enheten begärde texttelefonläget HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer-enheten begärde texttelefonläget VCO"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 92510ea..8f18ceb 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ujumbe wa sauti"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Kupiga simu kupitia Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Hali ya SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Hali ya SIM ya kipaumbele cha juu"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Hali ya TTY iliyoombwa na mtandao mwenza KAMILI"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Hali ya TTY iliyoombwa na mtandao mwenza HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Hali ya TTY iliyoombwa na mtandao mwenza VCO"</string>
@@ -364,7 +365,7 @@
<string name="permlab_enableCarMode" msgid="5684504058192921098">"Wezesha mtindo wa gari"</string>
<string name="permdesc_enableCarMode" msgid="4853187425751419467">"Inaruhusu programu kuwawezesha mtindo wa gari."</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"funga programu zingine"</string>
- <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Inaruhusu programu kukamilisha michakato ya usuli ya programu nyingine. Hii inaweza kusababisha programu nyingine kukoma kufanyakazi."</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Huruhusu programu kukamilisha michakato ya chinichini ya programu nyingine. Hii inaweza kusababisha programu nyingine kuacha kufanya kazi."</string>
<string name="permlab_systemAlertWindow" msgid="7238805243128138690">"Programu hii inaweza kuonekana juu ya programu zingine"</string>
<string name="permdesc_systemAlertWindow" msgid="2393776099672266188">"Programu hii inaweza kuonekana juu ya programu zingine au sehemu zingine za skrini. Hii huenda ikaathiri matumizi ya kawaida ya programu na kubadilisha jinsi ambavyo programu zingine zinavyoonekana."</string>
<string name="permlab_runInBackground" msgid="7365290743781858803">"tumia chini chini"</string>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index ab3446f..d211e90 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"குரலஞ்சல் செய்திகள்"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"வைஃபை அழைப்பு"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"சிம் நிலை"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"அதிக முன்னுரிமையுடைய சிம்மின் நிலை"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது"</string>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 649e17c..e6a3daf 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"వాయిస్ మెయిల్ సందేశాలు"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi కాలింగ్"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM స్థితి"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"అధిక ప్రాధాన్యత గల SIM స్థితి"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"అవతలి వారు FULL TTY మోడ్ని అభ్యర్థించారు"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"అవతలి వారు HCO TTY మోడ్ని అభ్యర్థించారు"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"అవతలి వారు VCO TTY మోడ్ని అభ్యర్థించారు"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 4e69430..045ea3e 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ข้อความเสียง"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"การโทรผ่าน Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"สถานะซิม"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"สถานะซิมลำดับความสำคัญสูง"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"เต็ม\""</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"HCO\""</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"VCO\""</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 6843528..6dcc40c 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mga mensahe sa voicemail"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Pagtawag gamit ang Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Status ng SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority na status ng SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Hiniling ng peer ang TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Hiniling ng peer ang TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Hiniling ng peer ang TTY Mode VCO"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 3592df9..c0303ac 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sesli mesajlar"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Kablosuz çağrı"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM durumu"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Yüksek öncelikli SIM durumu"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Karşı taraf TTY Modunu TAM yaptı"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Karşı taraf TTY Modunu HCO yaptı"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Karşı taraf TTY Modunu VCO yaptı"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 347c81f..3437b51 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Повідомлення голосової пошти"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Дзвінки через Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карти"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Високопріоритетні сповіщення із SIM-карти"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Пристрій змінив режим TTY на FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Пристрій змінив режим TTY на HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Пристрій змінив режим TTY на VCO"</string>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 3fd6fe7..83c3199 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"صوتی میل پیغامات"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi کالنگ"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM کا اسٹیٹس"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"اعلی ترجیحی SIM کی صورتحال"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ہمسر نے TTY وضع مکمل کی درخواست کی"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ہمسر نے TTY وضع HCO کی درخواست کی"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ہمسر نے TTY وضع VCO کی درخواست کی"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 85ebe00..0425010 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ovozli xabarlar"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi chaqiruv"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM karta holati"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM kartadagi muhim bildirishnomalar"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Teng huquqli ishtirokchi teletayp rejimini FULL (to‘liq) qilib o‘zgartirdi"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Teng huquqli ishtirokchi teletayp rejimini HCO (eshitadi, gapirolmaydi) qilib o‘zgartirdi"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Teng huquqli ishtirokchi teletayp rejimini VCO (gapiradi, eshitolmaydi) qilib o‘zgartirdi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 78c4290..4f7b4fe 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Thư thoại"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Gọi qua Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Trạng thái SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Trạng thái SIM có mức ưu tiên cao"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 9893a0f..765e1db 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"语音邮件"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"WLAN 通话"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡状态"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"高优先顺序 SIM 卡状态"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"对方请求使用“TTY 完整”模式"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"对方请求使用“TTY HCO”模式"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"对方请求使用“TTY VCO”模式"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 884772e..4124079 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"留言訊息"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡狀態"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"重要 SIM 卡狀態"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"對方曾要求 TTY 完整模式"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"對方曾要求 TTY 模式 (HCO)"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"對方曾要求 TTY 模式 (VCO)"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 580a1dc..1f7b3e2 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"語音留言"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡狀態"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"高優先順序 SIM 卡狀態"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"通訊對象要求使用 TTY 的 FULL 模式"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"通訊對象要求使用 TTY 的 HCO 模式"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"通訊對象要求使用 TTY 的 VCO 模式"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index c4f8823..c58c77c 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Imilayezo yevoyisimeyili"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Ukushaya kwe-Wi-Fi"</string>
<string name="notification_channel_sim" msgid="4052095493875188564">"Isimo se-SIM"</string>
+ <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Isimo se-SIM esiphezulu kakhulu"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Umngani ucele imodi ye-TTY ephelele"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Umngani ucele imodi ye-TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Umngani ucele imodi ye-TTY VCO"</string>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index b34c422..4d6e7da 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1301,6 +1301,9 @@
<!-- Whether to use the strict phone number matcher in Kazakhstan. -->
<bool name="config_use_strict_phone_number_comparation_for_kazakhstan">true</bool>
+ <!-- The character count of the minimum match for comparison phone numbers -->
+ <integer name="config_phonenumber_compare_min_match">7</integer>
+
<!-- Display low battery warning when battery level dips to this value.
Also, the battery stats are flushed to disk when we hit this level. -->
<integer name="config_criticalBatteryWarningLevel">5</integer>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ac32c95..4094bf4 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -320,6 +320,7 @@
<java-symbol type="bool" name="config_use_strict_phone_number_comparation" />
<java-symbol type="bool" name="config_use_strict_phone_number_comparation_for_russia" />
<java-symbol type="bool" name="config_use_strict_phone_number_comparation_for_kazakhstan" />
+ <java-symbol type="integer" name="config_phonenumber_compare_min_match" />
<java-symbol type="bool" name="config_single_volume" />
<java-symbol type="bool" name="config_voice_capable" />
<java-symbol type="bool" name="config_requireCallCapableAccountForHandle" />
diff --git a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/StartProgramListUpdatesFanoutTest.java b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/StartProgramListUpdatesFanoutTest.java
index f9e3798..6e65df1 100644
--- a/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/StartProgramListUpdatesFanoutTest.java
+++ b/core/tests/BroadcastRadioTests/src/com/android/server/broadcastradio/hal2/StartProgramListUpdatesFanoutTest.java
@@ -17,7 +17,6 @@
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@@ -41,7 +40,6 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer;
@@ -49,7 +47,6 @@
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
-import java.util.Set;
/**
* Tests for v2 HAL RadioModule.
@@ -293,61 +290,6 @@
}
ProgramList.Chunk expectedChunk = new ProgramList.Chunk(purge, true, modifiedSet,
removedSet);
- verify(clientMock).onProgramListUpdated(argThat(new ChunkMatcher(expectedChunk)));
+ verify(clientMock).onProgramListUpdated(expectedChunk);
}
-
- // TODO(b/130750904): Remove this class and replace "argThat(new ChunkMatcher(chunk))" with
- // "eq(chunk)".
- //
- // Ideally, this class wouldn't exist, but currently RadioManager.ProgramInfo#hashCode() can
- // return different values for objects that satisfy ProgramInfo#equals(). As a short term
- // workaround, this class performs the O(N^2) comparison between the Chunks' mModified sets.
- //
- // To test if ProgramInfo#hashCode() has been fixed, remove commenting from
- // testProgramInfoHashCode() below.
- private class ChunkMatcher implements ArgumentMatcher<ProgramList.Chunk> {
- private final ProgramList.Chunk mExpected;
-
- ChunkMatcher(ProgramList.Chunk expected) {
- mExpected = expected;
- }
-
- @Override
- public boolean matches(ProgramList.Chunk actual) {
- if ((mExpected.isPurge() != actual.isPurge())
- || (mExpected.isComplete() != actual.isComplete())
- || (!mExpected.getRemoved().equals(actual.getRemoved()))) {
- return false;
- }
- Set<RadioManager.ProgramInfo> expectedModified = mExpected.getModified();
- Set<RadioManager.ProgramInfo> actualModified = new HashSet<>(actual.getModified());
- if (expectedModified.size() != actualModified.size()) {
- return false;
- }
- for (RadioManager.ProgramInfo expectedInfo : expectedModified) {
- boolean found = false;
- for (RadioManager.ProgramInfo actualInfo : actualModified) {
- if (expectedInfo.equals(actualInfo)) {
- found = true;
- actualModified.remove(actualInfo);
- break;
- }
- }
- if (!found) {
- return false;
- }
- }
- return true;
- }
- }
-
- // @Test
- // public void testProgramInfoHashCode() {
- // RadioManager.ProgramInfo info1 = TestUtils.makeProgramInfo(
- // ProgramSelector.PROGRAM_TYPE_FM, mAmFmIdentifier, 0);
- // RadioManager.ProgramInfo info2 = TestUtils.makeProgramInfo(
- // ProgramSelector.PROGRAM_TYPE_FM, mAmFmIdentifier, 0);
- // assertEquals(info1, info2);
- // assertEquals(info1.hashCode(), info2.hashCode());
- // }
}
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 833c734..1670d49 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -58,6 +58,8 @@
resource_dirs: ["res"],
resource_zips: [":FrameworksCoreTests_apks_as_resources"],
+
+ data: [":BstatsTestApp"],
}
// Rules to copy all the test apks to the intermediate raw resource directory
diff --git a/core/tests/coretests/BstatsTestApp/Android.bp b/core/tests/coretests/BstatsTestApp/Android.bp
index 424c71a..a89d728 100644
--- a/core/tests/coretests/BstatsTestApp/Android.bp
+++ b/core/tests/coretests/BstatsTestApp/Android.bp
@@ -15,10 +15,6 @@
android_test_helper_app {
name: "BstatsTestApp",
- test_suites: [
- "device-tests",
- ],
-
static_libs: ["coretests-aidl"],
srcs: ["**/*.java"],
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 88bda9d..89ba3df 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -721,7 +721,8 @@
Settings.Secure.BIOMETRIC_DEBUG_ENABLED,
Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED,
Settings.Secure.FACE_UNLOCK_DIVERSITY_REQUIRED,
- Settings.Secure.FACE_UNLOCK_EDUCATION_INFO_DISPLAYED);
+ Settings.Secure.FACE_UNLOCK_EDUCATION_INFO_DISPLAYED,
+ Settings.Secure.MANAGED_PROVISIONING_DPC_DOWNLOADED);
@Test
public void systemSettingsBackedUpOrBlacklisted() {
diff --git a/core/tests/overlaytests/device/Android.bp b/core/tests/overlaytests/device/Android.bp
new file mode 100644
index 0000000..12a2b08
--- /dev/null
+++ b/core/tests/overlaytests/device/Android.bp
@@ -0,0 +1,26 @@
+// Copyright (C) 2018 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.
+
+android_test {
+ name: "OverlayDeviceTests",
+ srcs: ["src/**/*.java"],
+ platform_apis: true,
+ static_libs: ["androidx.test.rules"],
+ test_suites: ["device-tests"],
+ data: [
+ ":OverlayDeviceTests_AppOverlayOne",
+ ":OverlayDeviceTests_AppOverlayTwo",
+ ":OverlayDeviceTests_FrameworkOverlay",
+ ],
+}
diff --git a/core/tests/overlaytests/device/Android.mk b/core/tests/overlaytests/device/Android.mk
deleted file mode 100644
index c6d2a51..0000000
--- a/core/tests/overlaytests/device/Android.mk
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (C) 2018 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under,src)
-LOCAL_MODULE_TAGS := tests
-LOCAL_PACKAGE_NAME := OverlayDeviceTests
-LOCAL_PRIVATE_PLATFORM_APIS := true
-LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules
-LOCAL_COMPATIBILITY_SUITE := device-tests
-LOCAL_REQUIRED_MODULES := \
- OverlayDeviceTests_AppOverlayOne \
- OverlayDeviceTests_AppOverlayTwo \
- OverlayDeviceTests_FrameworkOverlay
-include $(BUILD_PACKAGE)
-
-# Include to build test-apps.
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
diff --git a/core/tests/overlaytests/device/test-apps/Android.mk b/core/tests/overlaytests/device/test-apps/Android.mk
deleted file mode 100644
index 9af9f444..0000000
--- a/core/tests/overlaytests/device/test-apps/Android.mk
+++ /dev/null
@@ -1,15 +0,0 @@
-# Copyright (C) 2018 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.
-
-include $(call all-subdir-makefiles)
diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.bp b/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.bp
new file mode 100644
index 0000000..da3aa00
--- /dev/null
+++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.bp
@@ -0,0 +1,20 @@
+// Copyright (C) 2018 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.
+
+android_test {
+ name: "OverlayDeviceTests_AppOverlayOne",
+ sdk_version: "current",
+
+ aaptflags: ["--no-resource-removal"],
+}
diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.mk b/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.mk
deleted file mode 100644
index fa15241..0000000
--- a/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (C) 2018 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := tests
-LOCAL_PACKAGE_NAME := OverlayDeviceTests_AppOverlayOne
-LOCAL_SDK_VERSION := current
-LOCAL_COMPATIBILITY_SUITE := device-tests
-LOCAL_USE_AAPT2 := true
-LOCAL_AAPT_FLAGS := --no-resource-removal
-include $(BUILD_PACKAGE)
diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.bp b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.bp
new file mode 100644
index 0000000..215b66da3
--- /dev/null
+++ b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.bp
@@ -0,0 +1,20 @@
+// Copyright (C) 2018 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.
+
+android_test {
+ name: "OverlayDeviceTests_AppOverlayTwo",
+ sdk_version: "current",
+
+ aaptflags: ["--no-resource-removal"],
+}
diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.mk b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.mk
deleted file mode 100644
index ada9b3c..0000000
--- a/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (C) 2018 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := tests
-LOCAL_PACKAGE_NAME := OverlayDeviceTests_AppOverlayTwo
-LOCAL_SDK_VERSION := current
-LOCAL_COMPATIBILITY_SUITE := device-tests
-LOCAL_USE_AAPT2 := true
-LOCAL_AAPT_FLAGS := --no-resource-removal
-include $(BUILD_PACKAGE)
diff --git a/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.bp b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.bp
new file mode 100644
index 0000000..50dbc6f
--- /dev/null
+++ b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.bp
@@ -0,0 +1,21 @@
+// Copyright (C) 2018 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.
+
+android_test {
+ name: "OverlayDeviceTests_FrameworkOverlay",
+ sdk_version: "current",
+ certificate: "platform",
+
+ aaptflags: ["--no-resource-removal"],
+}
diff --git a/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.mk b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.mk
deleted file mode 100644
index e4819e1..0000000
--- a/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright (C) 2018 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := tests
-LOCAL_PACKAGE_NAME := OverlayDeviceTests_FrameworkOverlay
-LOCAL_SDK_VERSION := current
-LOCAL_COMPATIBILITY_SUITE := device-tests
-LOCAL_CERTIFICATE := platform
-LOCAL_USE_AAPT2 := true
-LOCAL_AAPT_FLAGS := --no-resource-removal
-include $(BUILD_PACKAGE)
diff --git a/core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java b/core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java
index 39bb84a..cb30b3f 100644
--- a/core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java
+++ b/core/tests/utiltests/src/com/android/internal/util/ArrayUtilsTest.java
@@ -177,4 +177,40 @@
assertArrayEquals(new Long[] { 1L, 2L, 3L, 4L },
concatElements(Long.class, new Long[] { 1L, 2L }, new Long[] { 3L, 4L }));
}
+
+ public void testConcatElements_threeWay() {
+ String[] array1 = { "1", "2" };
+ String[] array2 = { "3", "4" };
+ String[] array3 = { "5", "6" };
+ String[] expectation = {"1", "2", "3", "4", "5", "6"};
+
+ String[] concatResult = ArrayUtils.concatElements(String.class, array1, array2, array3);
+ assertArrayEquals(expectation, concatResult);
+ }
+
+
+ public void testConcatElements_threeWayWithNull() {
+ String[] array1 = { "1", "2" };
+ String[] array2 = null;
+ String[] array3 = { "5", "6" };
+ String[] expectation = {"1", "2", "5", "6"};
+
+ String[] concatResult = ArrayUtils.concatElements(String.class, array1, array2, array3);
+ assertArrayEquals(expectation, concatResult);
+ }
+
+ public void testConcatElements_zeroElements() {
+ String[] expectation = new String[0];
+
+ String[] concatResult = ArrayUtils.concatElements(String.class);
+ assertArrayEquals(expectation, concatResult);
+ }
+
+ public void testConcatElements_oneNullElement() {
+ String[] expectation = new String[0];
+
+ String[] concatResult = ArrayUtils.concatElements(String.class, null);
+ assertArrayEquals(expectation, concatResult);
+ }
+
}
diff --git a/core/tests/utiltests/src/com/android/internal/util/XmlUtilsTest.java b/core/tests/utiltests/src/com/android/internal/util/XmlUtilsTest.java
index 2596ece..27f3596 100644
--- a/core/tests/utiltests/src/com/android/internal/util/XmlUtilsTest.java
+++ b/core/tests/utiltests/src/com/android/internal/util/XmlUtilsTest.java
@@ -16,13 +16,22 @@
package com.android.internal.util;
+import static org.junit.Assert.assertArrayEquals;
+
+import android.util.Xml;
+
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
+
import junit.framework.TestCase;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlSerializer;
+
public class XmlUtilsTest extends TestCase {
// https://code.google.com/p/android/issues/detail?id=63717
@@ -38,4 +47,23 @@
assertEquals("nullValue", deserialized.get(null));
assertEquals("fooValue", deserialized.get("foo"));
}
+
+ public void testreadWriteXmlByteArrayValue() throws Exception {
+ byte[] testByteArray = {0x1 , 0xa, 0xb, 0x9, 0x34, (byte) 0xaa, (byte) 0xba, (byte) 0x99};
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
+ XmlSerializer serializer = new FastXmlSerializer();
+ serializer.setOutput(baos, StandardCharsets.UTF_8.name());
+ serializer.startDocument(null, true);
+ XmlUtils.writeValueXml(testByteArray, "testByteArray", serializer);
+ serializer.endDocument();
+
+ InputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ XmlPullParser pullParser = Xml.newPullParser();
+ pullParser.setInput(bais, StandardCharsets.UTF_8.name());
+ String[] name = new String[1];
+ byte[] testByteArrayDeserialized = (byte[]) XmlUtils.readValueXml(pullParser, name);
+ assertEquals("testByteArray", name[0]);
+ assertArrayEquals(testByteArray, testByteArrayDeserialized);
+ }
}
diff --git a/graphics/java/android/graphics/RectF.java b/graphics/java/android/graphics/RectF.java
index 3361fa2..1d294d5 100644
--- a/graphics/java/android/graphics/RectF.java
+++ b/graphics/java/android/graphics/RectF.java
@@ -27,7 +27,7 @@
/**
* RectF holds four float coordinates for a rectangle. The rectangle is
- * represented by the coordinates of its 4 edges (left, top, right bottom).
+ * represented by the coordinates of its 4 edges (left, top, right, bottom).
* These fields can be accessed directly. Use width() and height() to retrieve
* the rectangle's width and height. Note: most methods do not check to see that
* the coordinates are sorted correctly (i.e. left <= right and top <= bottom).
diff --git a/libs/hostgraphics/Android.bp b/libs/hostgraphics/Android.bp
new file mode 100644
index 0000000..aedb752
--- /dev/null
+++ b/libs/hostgraphics/Android.bp
@@ -0,0 +1,24 @@
+cc_library_host_static {
+ name: "libhostgraphics",
+
+ srcs: [
+ ":libui_host_common",
+ ],
+
+ include_dirs: [
+ // Here we override all the headers automatically included with frameworks/native/include.
+ // When frameworks/native/include will be removed from the list of automatic includes.
+ // We will have to copy necessary headers with a pre-build step (generated headers).
+ ".",
+ "frameworks/native/libs/nativebase/include",
+ "frameworks/native/libs/nativewindow/include",
+ "frameworks/native/libs/arect/include",
+ ],
+ export_include_dirs: ["."],
+
+ target: {
+ windows: {
+ enabled: true,
+ }
+ },
+}
\ No newline at end of file
diff --git a/libs/hostgraphics/gui/IGraphicBufferProducer.h b/libs/hostgraphics/gui/IGraphicBufferProducer.h
new file mode 100644
index 0000000..0042213
--- /dev/null
+++ b/libs/hostgraphics/gui/IGraphicBufferProducer.h
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+#ifndef ANDROID_GUI_IGRAPHICBUFFERPRODUCER_H
+#define ANDROID_GUI_IGRAPHICBUFFERPRODUCER_H
+
+#include <utils/RefBase.h>
+
+namespace android {
+
+class IGraphicBufferProducer : virtual public RefBase {
+public:
+ enum class DisconnectMode {
+ // Disconnect only the specified API.
+ Api,
+ // Disconnect any API originally connected from the process calling disconnect.
+ AllLocal
+ };
+};
+
+} // namespace android
+
+#endif // ANDROID_GUI_IGRAPHICBUFFERPRODUCER_H
diff --git a/libs/hostgraphics/gui/Surface.h b/libs/hostgraphics/gui/Surface.h
new file mode 100644
index 0000000..de1ba00
--- /dev/null
+++ b/libs/hostgraphics/gui/Surface.h
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+
+#ifndef ANDROID_GUI_SURFACE_H
+#define ANDROID_GUI_SURFACE_H
+
+#include <gui/IGraphicBufferProducer.h>
+#include <ui/ANativeObjectBase.h>
+#include <utils/RefBase.h>
+#include <system/window.h>
+
+namespace android {
+
+class Surface : public ANativeObjectBase<ANativeWindow, Surface, RefBase> {
+public:
+ explicit Surface(const sp<IGraphicBufferProducer>& bufferProducer,
+ bool controlledByApp = false) {
+ ANativeWindow::perform = hook_perform;
+ }
+ static bool isValid(const sp<Surface>& surface) { return surface != nullptr; }
+ void allocateBuffers() {}
+
+ uint64_t getNextFrameNumber() const { return 0; }
+
+ int setScalingMode(int mode) { return 0; }
+
+ virtual int disconnect(int api,
+ IGraphicBufferProducer::DisconnectMode mode =
+ IGraphicBufferProducer::DisconnectMode::Api) {
+ return 0;
+ }
+
+ virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds) {
+ // TODO: implement this
+ return 0;
+ }
+ virtual int unlockAndPost() { return 0; }
+ virtual int query(int what, int* value) const { return 0; }
+
+protected:
+ virtual ~Surface() {}
+
+ static int hook_perform(ANativeWindow* window, int operation, ...) { return 0; }
+
+private:
+ // can't be copied
+ Surface& operator=(const Surface& rhs);
+ Surface(const Surface& rhs);
+};
+
+} // namespace android
+
+#endif // ANDROID_GUI_SURFACE_H
diff --git a/libs/hwui/DeviceInfo.cpp b/libs/hwui/DeviceInfo.cpp
index 0a9d965..a0d3ff9 100644
--- a/libs/hwui/DeviceInfo.cpp
+++ b/libs/hwui/DeviceInfo.cpp
@@ -18,7 +18,6 @@
#include "Properties.h"
-#include <gui/ISurfaceComposer.h>
#include <gui/SurfaceComposerClient.h>
#include <ui/GraphicTypes.h>
diff --git a/libs/hwui/renderthread/CacheManager.cpp b/libs/hwui/renderthread/CacheManager.cpp
index 1b638c1..5469a68 100644
--- a/libs/hwui/renderthread/CacheManager.cpp
+++ b/libs/hwui/renderthread/CacheManager.cpp
@@ -28,7 +28,6 @@
#include <SkExecutor.h>
#include <SkGraphics.h>
#include <SkMathPriv.h>
-#include <gui/Surface.h>
#include <math.h>
#include <set>
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index 159cf49..1202164 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -29,7 +29,6 @@
#include <EGL/eglext.h>
#include <GLES/gl.h>
-#include <gui/Surface.h>
#include <system/window.h>
#include <string>
#include <vector>
@@ -289,6 +288,10 @@
if (mPBufferSurface == EGL_NO_SURFACE && !EglExtensions.surfacelessContext) {
EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE};
mPBufferSurface = eglCreatePbufferSurface(mEglDisplay, mEglConfig, attribs);
+ LOG_ALWAYS_FATAL_IF(mPBufferSurface == EGL_NO_SURFACE,
+ "Failed to create a pixel buffer display=%p, "
+ "mEglConfig=%p, error=%s",
+ mEglDisplay, mEglConfig, eglErrorString());
}
}
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 280f7d3..5100165 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -17,7 +17,8 @@
#include "VulkanManager.h"
#include <android/sync.h>
-#include <gui/Surface.h>
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
#include "Properties.h"
#include "RenderThread.h"
diff --git a/libs/hwui/surfacetexture/ImageConsumer.cpp b/libs/hwui/surfacetexture/ImageConsumer.cpp
index bae616b..17ee17d 100644
--- a/libs/hwui/surfacetexture/ImageConsumer.cpp
+++ b/libs/hwui/surfacetexture/ImageConsumer.cpp
@@ -71,13 +71,16 @@
void makeImage(sp<GraphicBuffer>& graphicBuffer, android_dataspace dataspace,
GrContext* context);
+ void newBufferContent(GrContext* context);
+
private:
// The only way to invoke dtor is with unref, when mUsageCount is 0.
~AutoBackendTextureRelease() {}
GrBackendTexture mBackendTexture;
GrAHardwareBufferUtils::DeleteImageProc mDeleteProc;
- GrAHardwareBufferUtils::DeleteImageCtx mDeleteCtx;
+ GrAHardwareBufferUtils::UpdateImageProc mUpdateProc;
+ GrAHardwareBufferUtils::TexImageCtx mImageCtx;
// Starting with refcount 1, because the first ref is held by SurfaceTexture. Additional refs
// are held by SkImages.
@@ -101,7 +104,8 @@
buffer->getWidth(),
buffer->getHeight(),
&mDeleteProc,
- &mDeleteCtx,
+ &mUpdateProc,
+ &mImageCtx,
createProtectedImage,
backendFormat,
false);
@@ -123,7 +127,7 @@
mUsageCount--;
if (mUsageCount <= 0) {
if (mBackendTexture.isValid()) {
- mDeleteProc(mDeleteCtx);
+ mDeleteProc(mImageCtx);
mBackendTexture = {};
}
delete this;
@@ -154,6 +158,12 @@
}
}
+void AutoBackendTextureRelease::newBufferContent(GrContext* context) {
+ if (mBackendTexture.isValid()) {
+ mUpdateProc(mImageCtx, context);
+ }
+}
+
void ImageConsumer::ImageSlot::createIfNeeded(sp<GraphicBuffer> graphicBuffer,
android_dataspace dataspace, bool forceCreate,
GrContext* context) {
@@ -166,6 +176,8 @@
if (!mTextureRelease) {
mTextureRelease = new AutoBackendTextureRelease(context, graphicBuffer.get());
+ } else {
+ mTextureRelease->newBufferContent(context);
}
mDataspace = dataspace;
diff --git a/libs/hwui/surfacetexture/ImageConsumer.h b/libs/hwui/surfacetexture/ImageConsumer.h
index 2fdece9..3e2a91a 100644
--- a/libs/hwui/surfacetexture/ImageConsumer.h
+++ b/libs/hwui/surfacetexture/ImageConsumer.h
@@ -26,11 +26,6 @@
#include <gui/BufferItem.h>
#include <system/graphics.h>
-namespace GrAHardwareBufferUtils {
-typedef void* DeleteImageCtx;
-typedef void (*DeleteImageProc)(DeleteImageCtx);
-}
-
namespace android {
namespace uirenderer {
diff --git a/libs/hwui/tests/scripts/skp-capture.sh b/libs/hwui/tests/scripts/skp-capture.sh
index aad31fc..4b46fbf 100755
--- a/libs/hwui/tests/scripts/skp-capture.sh
+++ b/libs/hwui/tests/scripts/skp-capture.sh
@@ -29,10 +29,14 @@
phase1_timeout_seconds=60
phase2_timeout_seconds=300
package="$1"
-filename="$(date '+%H%M%S').skp"
+extension="skp"
+if (( "$2" > 1 )); then # 2nd arg is number of frames
+ extension="mskp" # use different extension for multi frame files.
+fi
+filename="$(date '+%H%M%S').${extension}"
remote_path="/data/data/${package}/cache/${filename}"
local_path_prefix="$(date '+%Y-%m-%d_%H%M%S')_${package}"
-local_path="${local_path_prefix}.skp"
+local_path="${local_path_prefix}.${extension}"
enable_capture_key='debug.hwui.capture_skp_enabled'
enable_capture_value=$(adb shell "getprop '${enable_capture_key}'")
diff --git a/location/java/com/android/internal/location/ILocationProvider.aidl b/location/java/com/android/internal/location/ILocationProvider.aidl
index a571630..8ae972b 100644
--- a/location/java/com/android/internal/location/ILocationProvider.aidl
+++ b/location/java/com/android/internal/location/ILocationProvider.aidl
@@ -29,10 +29,13 @@
*/
interface ILocationProvider {
+ @UnsupportedAppUsage
oneway void setLocationProviderManager(in ILocationProviderManager manager);
+ @UnsupportedAppUsage
oneway void setRequest(in ProviderRequest request, in WorkSource ws);
+ @UnsupportedAppUsage
oneway void sendExtraCommand(String command, in Bundle extras);
// --- deprecated and will be removed the future ---
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index 820d82d..65d3ffc 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -824,7 +824,7 @@
if (attributes != null) {
mUsage = attributes.mUsage;
mContentType = attributes.mContentType;
- mFlags = attributes.mFlags;
+ mFlags = attributes.getAllFlags();
mMuteHapticChannels = attributes.areHapticChannelsMuted();
mTags = attributes.mTags;
mBundle = attributes.mBundle;
diff --git a/media/java/android/media/AudioPortConfig.java b/media/java/android/media/AudioPortConfig.java
index 45e49a7..ac19bb1 100644
--- a/media/java/android/media/AudioPortConfig.java
+++ b/media/java/android/media/AudioPortConfig.java
@@ -95,7 +95,6 @@
/**
* The gain configuration if this port supports gain control, null otherwise
- * @see AudioGainConfig.
*/
public AudioGainConfig gain() {
return mGain;
diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp
index 6d8b966..e9d7f8b 100644
--- a/media/jni/android_media_ImageWriter.cpp
+++ b/media/jni/android_media_ImageWriter.cpp
@@ -126,7 +126,7 @@
Condition mCondition;
std::deque<wp<Surface>> mQueue;
- static const nsecs_t kWaitDuration = 20000000; // 20 ms
+ static const nsecs_t kWaitDuration = 500000000; // 500 ms
};
sp<DetachThread> mThread;
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp
index b532621..7760e0e 100644
--- a/packages/SettingsLib/Android.bp
+++ b/packages/SettingsLib/Android.bp
@@ -23,6 +23,7 @@
"SettingsLibBarChartPreference",
"SettingsLibProgressBar",
"SettingsLibAdaptiveIcon",
+ "SettingsLibRadioButtonPreference",
],
// ANDROIDMK TRANSLATION ERROR: unsupported assignment to LOCAL_SHARED_JAVA_LIBRARIES
diff --git a/packages/SettingsLib/AppPreference/Android.bp b/packages/SettingsLib/AppPreference/Android.bp
index b56181d..b07176a 100644
--- a/packages/SettingsLib/AppPreference/Android.bp
+++ b/packages/SettingsLib/AppPreference/Android.bp
@@ -4,9 +4,10 @@
srcs: ["src/**/*.java"],
resource_dirs: ["res"],
- libs: [
+ static_libs: [
"androidx.annotation_annotation",
"androidx.preference_preference",
+ "SettingsLibSettingsTheme",
],
sdk_version: "system_current",
min_sdk_version: "21",
diff --git a/packages/SettingsLib/EntityHeaderWidgets/Android.bp b/packages/SettingsLib/EntityHeaderWidgets/Android.bp
index 3ca4ecd..280848a 100644
--- a/packages/SettingsLib/EntityHeaderWidgets/Android.bp
+++ b/packages/SettingsLib/EntityHeaderWidgets/Android.bp
@@ -6,7 +6,7 @@
static_libs: [
"androidx.annotation_annotation",
- "SettingsLibAppPreference"
+ "SettingsLibSettingsTheme"
],
sdk_version: "system_current",
diff --git a/packages/SettingsLib/RadioButtonPreference/Android.bp b/packages/SettingsLib/RadioButtonPreference/Android.bp
new file mode 100644
index 0000000..136d6da
--- /dev/null
+++ b/packages/SettingsLib/RadioButtonPreference/Android.bp
@@ -0,0 +1,14 @@
+android_library {
+ name: "SettingsLibRadioButtonPreference",
+
+ srcs: ["src/**/*.java"],
+ resource_dirs: ["res"],
+
+ static_libs: [
+ "androidx.preference_preference",
+ "SettingsLibSettingsTheme",
+ ],
+
+ sdk_version: "system_current",
+ min_sdk_version: "21",
+}
diff --git a/packages/SettingsLib/AppPreference/res/values/dimens.xml b/packages/SettingsLib/RadioButtonPreference/AndroidManifest.xml
similarity index 70%
copy from packages/SettingsLib/AppPreference/res/values/dimens.xml
copy to packages/SettingsLib/RadioButtonPreference/AndroidManifest.xml
index e2a7a19..fda7fde 100644
--- a/packages/SettingsLib/AppPreference/res/values/dimens.xml
+++ b/packages/SettingsLib/RadioButtonPreference/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2018 The Android Open Source Project
+ 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.
@@ -13,8 +13,11 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
- -->
+-->
-<resources>
- <dimen name="secondary_app_icon_size">32dp</dimen>
-</resources>
\ No newline at end of file
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.settingslib.widget">
+
+ <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
diff --git a/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml
new file mode 100644
index 0000000..dcb014d
--- /dev/null
+++ b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_radio.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/selectableItemBackground"
+ android:gravity="center_vertical"
+ android:minHeight="?android:attr/listPreferredItemHeightSmall"
+ android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+ <LinearLayout
+ android:id="@android:id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:minWidth="56dp"
+ android:layout_marginEnd="16dp"
+ android:orientation="vertical"/>
+
+ <LinearLayout
+ android:id="@+id/icon_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:minWidth="32dp"
+ android:orientation="horizontal"
+ android:layout_marginEnd="16dp"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp">
+ <androidx.preference.internal.PreferenceImageView
+ android:id="@android:id/icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ settings:maxWidth="@dimen/secondary_app_icon_size"
+ settings:maxHeight="@dimen/secondary_app_icon_size"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp">
+
+ <TextView
+ android:id="@android:id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"/>
+
+ <LinearLayout
+ android:id="@+id/summary_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone">
+ <TextView
+ android:id="@android:id/summary"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
+ android:textAlignment="viewStart"
+ android:textColor="?android:attr/textColorSecondary"/>
+
+ <TextView
+ android:id="@+id/appendix"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
+ android:textAlignment="viewEnd"
+ android:textColor="?android:attr/textColorSecondary"
+ android:maxLines="1"
+ android:ellipsize="end"/>
+ </LinearLayout>
+ <ProgressBar
+ android:id="@android:id/progress"
+ style="?android:attr/progressBarStyleHorizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="4dp"
+ android:max="100"
+ android:visibility="gone"/>
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/packages/SettingsLib/AppPreference/res/values/dimens.xml b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_widget_radiobutton.xml
similarity index 60%
copy from packages/SettingsLib/AppPreference/res/values/dimens.xml
copy to packages/SettingsLib/RadioButtonPreference/res/layout/preference_widget_radiobutton.xml
index e2a7a19..cb7b8eb 100644
--- a/packages/SettingsLib/AppPreference/res/values/dimens.xml
+++ b/packages/SettingsLib/RadioButtonPreference/res/layout/preference_widget_radiobutton.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2018 The Android Open Source Project
+ 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.
@@ -15,6 +15,11 @@
limitations under the License.
-->
-<resources>
- <dimen name="secondary_app_icon_size">32dp</dimen>
-</resources>
\ No newline at end of file
+<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@android:id/checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:background="@null"
+ android:focusable="false"
+ android:clickable="false" />
diff --git a/packages/SettingsLib/RadioButtonPreference/src/com/android/settingslib/widget/RadioButtonPreference.java b/packages/SettingsLib/RadioButtonPreference/src/com/android/settingslib/widget/RadioButtonPreference.java
new file mode 100644
index 0000000..08287ac
--- /dev/null
+++ b/packages/SettingsLib/RadioButtonPreference/src/com/android/settingslib/widget/RadioButtonPreference.java
@@ -0,0 +1,161 @@
+/*
+ * 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.settingslib.widget;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.core.content.res.TypedArrayUtils;
+import androidx.preference.CheckBoxPreference;
+import androidx.preference.PreferenceViewHolder;
+
+/**
+ * Check box preference with check box replaced by radio button.
+ *
+ * Functionally speaking, it's actually a CheckBoxPreference. We only modified
+ * the widget to RadioButton to make it "look like" a RadioButtonPreference.
+ *
+ * In other words, there's no "RadioButtonPreferenceGroup" in this
+ * implementation. When you check one RadioButtonPreference, if you want to
+ * uncheck all the other preferences, you should do that by code yourself.
+ */
+public class RadioButtonPreference extends CheckBoxPreference {
+
+ /**
+ * Interface definition for a callback to be invoked when the preference is clicked.
+ */
+ public interface OnClickListener {
+ /**
+ * Called when a preference has been clicked.
+ *
+ * @param emiter The clicked preference
+ */
+ void onRadioButtonClicked(RadioButtonPreference emiter);
+ }
+
+ private OnClickListener mListener = null;
+ private View mAppendix;
+ private int mAppendixVisibility = -1;
+
+
+ /**
+ * Perform inflation from XML and apply a class-specific base style.
+ *
+ * @param context The {@link Context} this is associated with, through which it can
+ * access the current theme, resources, {@link SharedPreferences}, etc.
+ * @param attrs The attributes of the XML tag that is inflating the preference
+ * @param defStyleAttr An attribute in the current theme that contains a reference to a style
+ * resource that supplies default values for the view. Can be 0 to not
+ * look for defaults.
+ */
+ public RadioButtonPreference(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ setWidgetLayoutResource(R.layout.preference_widget_radiobutton);
+ setLayoutResource(R.layout.preference_radio);
+ setIconSpaceReserved(false);
+ }
+
+
+ /**
+ * Perform inflation from XML and apply a class-specific base style.
+ *
+ * @param context The {@link Context} this is associated with, through which it can
+ * access the current theme, resources, {@link SharedPreferences}, etc.
+ * @param attrs The attributes of the XML tag that is inflating the preference
+ */
+ public RadioButtonPreference(Context context, AttributeSet attrs) {
+ this(context, attrs, TypedArrayUtils.getAttr(context,
+ androidx.preference.R.attr.preferenceStyle,
+ android.R.attr.preferenceStyle));
+ }
+
+ /**
+ * Constructor to create a preference.
+ *
+ * @param context The Context this is associated with.
+ */
+ public RadioButtonPreference(Context context) {
+ this(context, null);
+ }
+
+ /**
+ * Sets the callback to be invoked when this preference is clicked by the user.
+ *
+ * @param listener The callback to be invoked
+ */
+ public void setOnClickListener(OnClickListener listener) {
+ mListener = listener;
+ }
+
+ /**
+ * Processes a click on the preference.
+ */
+ @Override
+ public void onClick() {
+ if (mListener != null) {
+ mListener.onRadioButtonClicked(this);
+ }
+ }
+
+ /**
+ * Binds the created View to the data for this preference.
+ *
+ * <p>This is a good place to grab references to custom Views in the layout and set
+ * properties on them.
+ *
+ * <p>Make sure to call through to the superclass's implementation.
+ *
+ * @param holder The ViewHolder that provides references to the views to fill in. These views
+ * will be recycled, so you should not hold a reference to them after this method
+ * returns.
+ */
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+
+ View summaryContainer = holder.findViewById(R.id.summary_container);
+ if (summaryContainer != null) {
+ summaryContainer.setVisibility(
+ TextUtils.isEmpty(getSummary()) ? View.GONE : View.VISIBLE);
+ mAppendix = holder.findViewById(R.id.appendix);
+ if (mAppendix != null && mAppendixVisibility != -1) {
+ mAppendix.setVisibility(mAppendixVisibility);
+ }
+ }
+
+ TextView title = (TextView) holder.findViewById(android.R.id.title);
+ if (title != null) {
+ title.setSingleLine(false);
+ title.setMaxLines(3);
+ }
+ }
+
+ /**
+ * Set the visibility state of appendix view.
+ *
+ * @param visibility One of {@link View#VISIBLE}, {@link View#INVISIBLE}, or {@link View#GONE}.
+ */
+ public void setAppendixVisibility(int visibility) {
+ if (mAppendix != null) {
+ mAppendix.setVisibility(visibility);
+ }
+ mAppendixVisibility = visibility;
+ }
+}
diff --git a/packages/SettingsLib/SettingsTheme/Android.bp b/packages/SettingsLib/SettingsTheme/Android.bp
new file mode 100644
index 0000000..6d505bf
--- /dev/null
+++ b/packages/SettingsLib/SettingsTheme/Android.bp
@@ -0,0 +1,8 @@
+android_library {
+ name: "SettingsLibSettingsTheme",
+
+ resource_dirs: ["res"],
+
+ sdk_version: "system_current",
+ min_sdk_version: "21",
+}
diff --git a/packages/SettingsLib/AppPreference/res/values/dimens.xml b/packages/SettingsLib/SettingsTheme/AndroidManifest.xml
similarity index 70%
copy from packages/SettingsLib/AppPreference/res/values/dimens.xml
copy to packages/SettingsLib/SettingsTheme/AndroidManifest.xml
index e2a7a19..fda7fde 100644
--- a/packages/SettingsLib/AppPreference/res/values/dimens.xml
+++ b/packages/SettingsLib/SettingsTheme/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2018 The Android Open Source Project
+ 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.
@@ -13,8 +13,11 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
- -->
+-->
-<resources>
- <dimen name="secondary_app_icon_size">32dp</dimen>
-</resources>
\ No newline at end of file
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.settingslib.widget">
+
+ <uses-sdk android:minSdkVersion="21" />
+
+</manifest>
diff --git a/packages/SettingsLib/AppPreference/res/values/dimens.xml b/packages/SettingsLib/SettingsTheme/res/values/dimens.xml
similarity index 92%
rename from packages/SettingsLib/AppPreference/res/values/dimens.xml
rename to packages/SettingsLib/SettingsTheme/res/values/dimens.xml
index e2a7a19..9485655 100644
--- a/packages/SettingsLib/AppPreference/res/values/dimens.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values/dimens.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2018 The Android Open Source Project
+ 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.
@@ -17,4 +17,4 @@
<resources>
<dimen name="secondary_app_icon_size">32dp</dimen>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
index 7100acc..fcd7ff81 100644
--- a/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
+++ b/packages/SettingsLib/src/com/android/settingslib/widget/FooterPreference.java
@@ -72,7 +72,9 @@
}
private void init() {
- setIcon(R.drawable.ic_info_outline_24);
+ if (getIcon() == null) {
+ setIcon(R.drawable.ic_info_outline_24);
+ }
setOrder(ORDER_FOOTER);
if (TextUtils.isEmpty(getKey())) {
setKey(KEY_FOOTER);
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/RadioButtonPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/RadioButtonPreferenceTest.java
new file mode 100644
index 0000000..d58e68a
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/RadioButtonPreferenceTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.settingslib.widget;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.Application;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import androidx.preference.PreferenceViewHolder;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class RadioButtonPreferenceTest {
+
+ private Application mContext;
+ private RadioButtonPreference mPreference;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mPreference = new RadioButtonPreference(mContext);
+ }
+
+ @Test
+ public void shouldHaveRadioPreferenceLayout() {
+ assertThat(mPreference.getLayoutResource()).isEqualTo(R.layout.preference_radio);
+ }
+
+ @Test
+ public void iconSpaceReservedShouldBeFalse() {
+ assertThat(mPreference.isIconSpaceReserved()).isFalse();
+ }
+
+ @Test
+ public void summary_containerShouldBeVisible() {
+ mPreference.setSummary("some summary");
+ View summaryContainer = new View(mContext);
+ View view = mock(View.class);
+ when(view.findViewById(R.id.summary_container)).thenReturn(summaryContainer);
+ PreferenceViewHolder preferenceViewHolder =
+ PreferenceViewHolder.createInstanceForTests(view);
+ mPreference.onBindViewHolder(preferenceViewHolder);
+ assertEquals(View.VISIBLE, summaryContainer.getVisibility());
+ }
+
+ @Test
+ public void emptySummary_containerShouldBeGone() {
+ mPreference.setSummary("");
+ View summaryContainer = new View(mContext);
+ View view = mock(View.class);
+ when(view.findViewById(R.id.summary_container)).thenReturn(summaryContainer);
+ PreferenceViewHolder preferenceViewHolder =
+ PreferenceViewHolder.createInstanceForTests(view);
+ mPreference.onBindViewHolder(preferenceViewHolder);
+ assertEquals(View.GONE, summaryContainer.getVisibility());
+ }
+
+ @Test
+ public void nullSummary_containerShouldBeGone() {
+ mPreference.setSummary(null);
+ View summaryContainer = new View(mContext);
+ View view = mock(View.class);
+ when(view.findViewById(R.id.summary_container)).thenReturn(summaryContainer);
+ PreferenceViewHolder preferenceViewHolder =
+ PreferenceViewHolder.createInstanceForTests(view);
+ mPreference.onBindViewHolder(preferenceViewHolder);
+ assertEquals(View.GONE, summaryContainer.getVisibility());
+ }
+
+ @Test
+ public void hideAppendix_shouldBeGone() {
+ mPreference.setAppendixVisibility(View.GONE);
+ View view = LayoutInflater.from(mContext).inflate(R.layout.preference_radio, null);
+ PreferenceViewHolder holder = PreferenceViewHolder.createInstanceForTests(view);
+ mPreference.onBindViewHolder(holder);
+ assertThat(holder.findViewById(R.id.appendix).getVisibility()).isEqualTo(View.GONE);
+ }
+}
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 8689eef..bb9a5e4 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -123,7 +123,6 @@
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
<uses-permission android:name="android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"/>
- <uses-permission android:name="android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS" />
<uses-permission android:name="android.permission.CHANGE_APP_IDLE_STATE" />
<uses-permission android:name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 279cf30..58e1d47 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -582,9 +582,9 @@
ParcelFileDescriptor screenshotFd = createReadWriteFile(BUGREPORT_DIR,
bugreportName + ".png");
if (screenshotFd == null) {
- Log.e(TAG, "Screenshot parcel file descriptor is null.");
- // TODO(b/123617758): Delete bugreport file created above
+ Log.e(TAG, "Screenshot parcel file descriptor is null. Deleting bugreport file");
FileUtils.closeQuietly(bugreportFd);
+ new File(BUGREPORT_DIR, String.format("%s.zip", bugreportName)).delete();
return;
}
mBugreportManager = (BugreportManager) mContext.getSystemService(
@@ -972,18 +972,8 @@
private void onBugreportFinished(int id) {
BugreportInfo info = getInfo(id);
final File bugreportFile = new File(BUGREPORT_DIR, info.name + ".zip");
- if (bugreportFile == null) {
- // Should never happen, an id always has a file linked to it.
- Log.wtf(TAG, "Missing file " + bugreportFile.getPath() + " does not exist.");
- return;
- }
final int max = -1; // this is to log metrics for dumpstate duration.
File screenshotFile = new File(BUGREPORT_DIR, info.name + ".png");
- if (screenshotFile == null) {
- // Should never happen, an id always has a file linked to it.
- Log.wtf(TAG, "Missing file " + screenshotFile.getPath() + " does not exist.");
- return;
- }
// If the screenshot file did not get populated implies this type of bugreport does not
// need the screenshot file; setting the file to null so that empty file doesnt get shared
if (screenshotFile.length() == 0) {
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 4fae3c5..76c1045 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -42,6 +42,32 @@
android:visibility="gone"
/>
+ <LinearLayout
+ android:id="@+id/divider_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:background="@color/transparent" >
+
+ <android.widget.Space
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="@integer/qqs_split_fraction" />
+
+ <com.android.systemui.DarkReceiverImpl
+ android:id="@+id/divider"
+ android:layout_height="match_parent"
+ android:layout_width="1dp"
+ android:layout_marginTop="4dp"
+ android:layout_marginBottom="4dp" />
+
+ <android.widget.Space
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="@integer/qs_split_fraction" />
+
+ </LinearLayout>
+
<LinearLayout android:id="@+id/status_bar_contents"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/packages/SystemUI/res/values/integers.xml b/packages/SystemUI/res/values/integers.xml
index a6dae45..deae7e2 100644
--- a/packages/SystemUI/res/values/integers.xml
+++ b/packages/SystemUI/res/values/integers.xml
@@ -27,4 +27,9 @@
performance issues arise. -->
<integer name="bubbles_max_rendered">5</integer>
+ <!-- Ratio of "left" end of status bar that will swipe to QQS. -->
+ <integer name="qqs_split_fraction">3</integer>
+ <!-- Ratio of "right" end of status bar that will swipe to QS. -->
+ <integer name="qs_split_fraction">2</integer>
+
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 7feacb4..fab7242 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -958,6 +958,9 @@
<!-- Message shown when lock screen is tapped or face authentication fails. [CHAR LIMIT=60] -->
<string name="keyguard_unlock">Swipe up to open</string>
+ <!-- Message shown when face authentication fails and the pin pad is visible. [CHAR LIMIT=60] -->
+ <string name="keyguard_retry">Swipe up to try again</string>
+
<!-- Text on keyguard screen and in Quick Settings footer indicating that the device is enterprise-managed by a Device Owner [CHAR LIMIT=60] -->
<string name="do_disclosure_generic">This device is managed by your organization</string>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
index 328116d..13fc702 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
@@ -236,7 +236,8 @@
@Override
public void onAnimationCanceled(boolean deferredWithScreenshot) {
- animationHandler.onAnimationCanceled(deferredWithScreenshot);
+ animationHandler.onAnimationCanceled(
+ deferredWithScreenshot ? new ThumbnailData() : null);
}
};
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java
index 5850fda..579858a 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationListener.java
@@ -18,6 +18,8 @@
import android.graphics.Rect;
+import com.android.systemui.shared.recents.model.ThumbnailData;
+
public interface RecentsAnimationListener {
/**
@@ -29,5 +31,5 @@
/**
* Called when the animation into Recents was canceled. This call is made on the binder thread.
*/
- void onAnimationCanceled(boolean deferredWithScreenshot);
+ void onAnimationCanceled(ThumbnailData thumbnailData);
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SystemGestureExclusionListenerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SystemGestureExclusionListenerCompat.java
index 9fdecfb..aeb0415 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SystemGestureExclusionListenerCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SystemGestureExclusionListenerCompat.java
@@ -34,9 +34,11 @@
new ISystemGestureExclusionListener.Stub() {
@Override
public void onSystemGestureExclusionChanged(int displayId,
- Region systemGestureExclusion) {
+ Region systemGestureExclusion, Region unrestrictedOrNull) {
if (displayId == mDisplayId) {
- onExclusionChanged(systemGestureExclusion);
+ Region unrestricted = (unrestrictedOrNull == null)
+ ? systemGestureExclusion : unrestrictedOrNull;
+ onExclusionChanged(systemGestureExclusion, unrestricted);
}
}
};
@@ -47,11 +49,29 @@
}
/**
- * Called when the exclusion region has changed
+ * Called when the exclusion region has changed.
+ *
+ * TODO: remove, once all subclasses have migrated to
+ * {@link #onExclusionChanged(Region, Region)}.
*/
public abstract void onExclusionChanged(Region systemGestureExclusion);
/**
+ * Called when the exclusion region has changed.
+ *
+ * @param systemGestureExclusion the system gesture exclusion to be applied
+ * @param systemGestureExclusionUnrestricted what would be the system gesture exclusion, if
+ * there were no restrictions being applied. For logging purposes only.
+ *
+ */
+ public void onExclusionChanged(Region systemGestureExclusion,
+ Region systemGestureExclusionUnrestricted) {
+ // TODO: make abstract, once all subclasses have migrated away from
+ // onExclusionChanged(Region)
+ onExclusionChanged(systemGestureExclusion);
+ }
+
+ /**
* Registers the listener for getting exclusion rect changes.
*/
public void register() {
diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
index 11d093f..10d132a 100644
--- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
+++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
@@ -400,8 +400,11 @@
}
}
+ if (TextUtils.isEmpty(displayText)) displayText = joinNotEmpty(mSeparator, carrierNames);
+
displayText = updateCarrierTextWithSimIoError(displayText, carrierNames, subOrderBySlot,
allSimsMissing);
+
boolean airplaneMode = false;
// APM (airplane mode) != no carrier state. There are carrier services
// (e.g. WFC = Wi-Fi calling) which may operate in APM.
@@ -410,9 +413,6 @@
airplaneMode = true;
}
- if (TextUtils.isEmpty(displayText) && !airplaneMode) {
- displayText = joinNotEmpty(mSeparator, carrierNames);
- }
final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo(
displayText,
carrierNames,
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
index fb3a586..69da990 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
@@ -123,7 +123,7 @@
msg = rez.getString(R.string.kg_sim_lock_esim_instructions, msg);
}
- if (mSecurityMessageDisplay != null) {
+ if (mSecurityMessageDisplay != null && getVisibility() == VISIBLE) {
mSecurityMessageDisplay.setMessage(msg);
}
mSimImageView.setImageTintList(ColorStateList.valueOf(color));
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 4e7b157..6a54782 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -182,6 +182,11 @@
public static final int BIOMETRIC_HELP_FACE_NOT_RECOGNIZED = -2;
private static final int DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT = 5000000;
+ /**
+ * If no cancel signal has been received after this amount of time, set the biometric running
+ * state to stopped to allow Keyguard to retry authentication.
+ */
+ private static final int DEFAULT_CANCEL_SIGNAL_TIMEOUT = 3000;
private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName(
"com.android.settings", "com.android.settings.FallbackHome");
@@ -264,11 +269,20 @@
*/
private static final int BIOMETRIC_CONTINUE_DELAY_MS = 500;
- // If FP daemon dies, keyguard should retry after a short delay
+ // If the HAL dies or is unable to authenticate, keyguard should retry after a short delay
private int mHardwareFingerprintUnavailableRetryCount = 0;
private int mHardwareFaceUnavailableRetryCount = 0;
- private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms
- private static final int HW_UNAVAILABLE_RETRY_MAX = 3;
+ private static final int HAL_ERROR_RETRY_TIMEOUT = 500; // ms
+ private static final int HAL_ERROR_RETRY_MAX = 10;
+
+ private final Runnable mCancelNotReceived = new Runnable() {
+ @Override
+ public void run() {
+ Log.w(TAG, "Cancel not received, transitioning to STOPPED");
+ mFingerprintRunningState = mFaceRunningState = BIOMETRIC_STATE_STOPPED;
+ updateBiometricListeningState();
+ }
+ };
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
@@ -662,6 +676,11 @@
};
private void handleFingerprintError(int msgId, String errString) {
+ if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED && mHandler.hasCallbacks(
+ mCancelNotReceived)) {
+ mHandler.removeCallbacks(mCancelNotReceived);
+ }
+
if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED
&& mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
@@ -671,10 +690,10 @@
}
if (msgId == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) {
- if (mHardwareFingerprintUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
+ if (mHardwareFingerprintUnavailableRetryCount < HAL_ERROR_RETRY_MAX) {
mHardwareFingerprintUnavailableRetryCount++;
mHandler.removeCallbacks(mRetryFingerprintAuthentication);
- mHandler.postDelayed(mRetryFingerprintAuthentication, HW_UNAVAILABLE_TIMEOUT);
+ mHandler.postDelayed(mRetryFingerprintAuthentication, HAL_ERROR_RETRY_TIMEOUT);
}
}
@@ -822,6 +841,10 @@
private void handleFaceError(int msgId, String errString) {
if (DEBUG_FACE) Log.d(TAG, "Face error received: " + errString);
+ if (msgId == FaceManager.FACE_ERROR_CANCELED && mHandler.hasCallbacks(mCancelNotReceived)) {
+ mHandler.removeCallbacks(mCancelNotReceived);
+ }
+
if (msgId == FaceManager.FACE_ERROR_CANCELED
&& mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
setFaceRunningState(BIOMETRIC_STATE_STOPPED);
@@ -830,11 +853,12 @@
setFaceRunningState(BIOMETRIC_STATE_STOPPED);
}
- if (msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE) {
- if (mHardwareFaceUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
+ if (msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE
+ || msgId == FaceManager.FACE_ERROR_UNABLE_TO_PROCESS) {
+ if (mHardwareFaceUnavailableRetryCount < HAL_ERROR_RETRY_MAX) {
mHardwareFaceUnavailableRetryCount++;
mHandler.removeCallbacks(mRetryFaceAuthentication);
- mHandler.postDelayed(mRetryFaceAuthentication, HW_UNAVAILABLE_TIMEOUT);
+ mHandler.postDelayed(mRetryFaceAuthentication, HAL_ERROR_RETRY_TIMEOUT);
}
}
@@ -843,11 +867,6 @@
getCurrentUser());
}
- // The face timeout message is not very actionable, let's ask the user to
- // manually retry.
- if (msgId == FaceManager.FACE_ERROR_TIMEOUT) {
- errString = mContext.getString(R.string.keyguard_unlock);
- }
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -1802,6 +1821,9 @@
if (mFingerprintCancelSignal != null) {
mFingerprintCancelSignal.cancel();
mFingerprintCancelSignal = null;
+ if (!mHandler.hasCallbacks(mCancelNotReceived)) {
+ mHandler.postDelayed(mCancelNotReceived, DEFAULT_CANCEL_SIGNAL_TIMEOUT);
+ }
}
setFingerprintRunningState(BIOMETRIC_STATE_CANCELLING);
}
@@ -1816,6 +1838,9 @@
if (mFaceCancelSignal != null) {
mFaceCancelSignal.cancel();
mFaceCancelSignal = null;
+ if (!mHandler.hasCallbacks(mCancelNotReceived)) {
+ mHandler.postDelayed(mCancelNotReceived, DEFAULT_CANCEL_SIGNAL_TIMEOUT);
+ }
}
setFaceRunningState(BIOMETRIC_STATE_CANCELLING);
}
diff --git a/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt b/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt
new file mode 100644
index 0000000..42d38cb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/DarkReceiverImpl.kt
@@ -0,0 +1,42 @@
+/*
+ * 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.systemui
+
+import android.content.Context
+import android.graphics.Rect
+import android.util.AttributeSet
+import android.view.View
+import com.android.systemui.plugins.DarkIconDispatcher
+
+class DarkReceiverImpl @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyle: Int = 0,
+ defStyleRes: Int = 0
+) : View(context, attrs, defStyle, defStyleRes), DarkIconDispatcher.DarkReceiver {
+
+ private val dualToneHandler = DualToneHandler(context)
+
+ init {
+ onDarkChanged(Rect(), 1f, DarkIconDispatcher.DEFAULT_ICON_TINT)
+ }
+
+ override fun onDarkChanged(area: Rect?, darkIntensity: Float, tint: Int) {
+ val intensity = if (DarkIconDispatcher.isInArea(area, this)) darkIntensity else 0f
+ setBackgroundColor(dualToneHandler.getSingleColor(intensity))
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java
index 7595654..0cee030 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java
@@ -74,6 +74,7 @@
private boolean mHandlesShowing = false;
private long mHandlesLastHiddenAt;
+ private long mShowAndGoEndsAt;
/**
* This should always be initialized as {@link AssistHandleBehavior#OFF} to ensure proper
* behavior lifecycle.
@@ -144,7 +145,9 @@
private void showAndGoInternal() {
maybeShowHandles(/* ignoreThreshold = */ false);
- mHandler.postDelayed(mHideHandles, getShowAndGoDuration());
+ long showAndGoDuration = getShowAndGoDuration();
+ mShowAndGoEndsAt = SystemClock.elapsedRealtime() + showAndGoDuration;
+ mHandler.postDelayed(mHideHandles, showAndGoDuration);
}
@Override // AssistHandleCallbacks
@@ -162,6 +165,10 @@
mHandler.post(() -> maybeShowHandles(/* ignoreThreshold = */ true));
}
+ public long getShowAndGoRemainingTimeMs() {
+ return Long.max(mShowAndGoEndsAt - SystemClock.elapsedRealtime(), 0);
+ }
+
boolean areHandlesShowing() {
return mHandlesShowing;
}
@@ -271,6 +278,7 @@
private void clearPendingCommands() {
mHandler.removeCallbacks(mHideHandles);
mHandler.removeCallbacks(mShowAndGo);
+ mShowAndGoEndsAt = 0;
}
@VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index 97b6e7c..4a4fead 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -82,7 +82,7 @@
void processBundle(Bundle hints);
/**
- * Hides the UI.
+ * Hides any SysUI for the assistant, but _does not_ close the assistant itself.
*/
void hide();
}
@@ -440,6 +440,10 @@
mAssistUtils.onLockscreenShown();
}
+ public long getAssistHandleShowAndGoRemainingDurationMs() {
+ return mHandleController.getShowAndGoRemainingTimeMs();
+ }
+
/** Returns the logging flags for the given Assistant invocation type. */
public int toLoggingSubType(int invocationType) {
return toLoggingSubType(invocationType, mPhoneStateMonitor.getPhoneState());
diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java b/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java
index 662de3a..0c4f051 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java
@@ -118,7 +118,6 @@
@Override // AssistManager.UiController
public void hide() {
- Dependency.get(AssistManager.class).hideAssist();
detach();
if (mInvocationAnimator.isRunning()) {
mInvocationAnimator.cancel();
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
index 9bca3c7..c09e284 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -261,6 +261,12 @@
+ state + " blocked=" + blocked);
}
+ public static void tracePulseDropped(Context context, String why) {
+ if (!ENABLED) return;
+ init(context);
+ log("pulseDropped why=" + why);
+ }
+
public static void tracePulseTouchDisabledByProx(Context context, boolean disabled) {
if (!ENABLED) return;
init(context);
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
index 2ca85c0..310f04a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java
@@ -113,11 +113,13 @@
if (!sWakeDisplaySensorState) {
Log.d(TAG, "Wake display false. Pulse denied.");
runIfNotNull(onPulseSuppressedListener);
+ DozeLog.tracePulseDropped(mContext, "wakeDisplaySensor");
return;
}
mNotificationPulseTime = SystemClock.elapsedRealtime();
if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) {
runIfNotNull(onPulseSuppressedListener);
+ DozeLog.tracePulseDropped(mContext, "pulseOnNotificationsDisabled");
return;
}
requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */,
@@ -376,6 +378,7 @@
proximityCheckThenCall((result) -> {
if (result == ProximityCheck.RESULT_NEAR) {
// in pocket, abort pulse
+ DozeLog.tracePulseDropped(mContext, "inPocket");
mPulsePending = false;
runIfNotNull(onPulseSuppressedListener);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index fb8b6c7..75dc397 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -64,6 +64,8 @@
private static final int CHARGE_CYCLE_PERCENT_RESET = 45;
private static final long SIX_HOURS_MILLIS = Duration.ofHours(6).toMillis();
public static final int NO_ESTIMATE_AVAILABLE = -1;
+ private static final String BOOT_COUNT_KEY = "boot_count";
+ private static final String PREFS = "powerui_prefs";
private final Handler mHandler = new Handler();
@VisibleForTesting
@@ -118,7 +120,7 @@
// Check to see if we need to let the user know that the phone previously shut down due
// to the temperature being too high.
- showThermalShutdownDialog();
+ showWarnOnThermalShutdown();
// Register an observer to configure mEnableSkinTemperatureWarning and perform the
// registration of skin thermal event listener upon Settings change.
@@ -542,10 +544,23 @@
}
}
- private void showThermalShutdownDialog() {
- if (mPowerManager.getLastShutdownReason()
- == PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN) {
- mWarnings.showThermalShutdownWarning();
+ private void showWarnOnThermalShutdown() {
+ int bootCount = -1;
+ int lastReboot = mContext.getSharedPreferences(PREFS, 0).getInt(BOOT_COUNT_KEY, -1);
+ try {
+ bootCount = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.BOOT_COUNT);
+ } catch (Settings.SettingNotFoundException e) {
+ Slog.e(TAG, "Failed to read system boot count from Settings.Global.BOOT_COUNT");
+ }
+ // Only show the thermal shutdown warning when there is a thermal reboot.
+ if (bootCount > lastReboot) {
+ mContext.getSharedPreferences(PREFS, 0).edit().putInt(BOOT_COUNT_KEY,
+ bootCount).apply();
+ if (mPowerManager.getLastShutdownReason()
+ == PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN) {
+ mWarnings.showThermalShutdownWarning();
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
index d939828..5adee40 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
@@ -92,7 +92,7 @@
mInitialTouchY = y;
mInitialTouchX = x;
mDragDownCallback.onTouchSlopExceeded();
- return true;
+ return mStartingChild != null || mDragDownCallback.isDragDownAnywhereEnabled();
}
break;
}
@@ -162,7 +162,11 @@
if (mStartingChild == null) {
mStartingChild = findView(x, y);
if (mStartingChild != null) {
- mCallback.setUserLockedChild(mStartingChild, true);
+ if (mDragDownCallback.isDragDownEnabledForView(mStartingChild)) {
+ mCallback.setUserLockedChild(mStartingChild, true);
+ } else {
+ mStartingChild = null;
+ }
}
}
}
@@ -237,6 +241,10 @@
return mDraggingDown;
}
+ public boolean isDragDownEnabled() {
+ return mDragDownCallback.isDragDownEnabledForView(null);
+ }
+
public interface DragDownCallback {
/**
@@ -253,5 +261,16 @@
void onTouchSlopExceeded();
void setEmptyDragAmount(float amount);
boolean isFalsingCheckNeeded();
+
+ /**
+ * Is dragging down enabled on a given view
+ * @param view The view to check or {@code null} to check if it's enabled at all
+ */
+ boolean isDragDownEnabledForView(ExpandableView view);
+
+ /**
+ * @return if drag down is enabled anywhere, not just on selected views.
+ */
+ boolean isDragDownAnywhereEnabled();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 4be93df..bba64d9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -562,11 +562,11 @@
return;
}
- String message = mContext.getString(R.string.keyguard_unlock);
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
+ String message = mContext.getString(R.string.keyguard_retry);
mStatusBarKeyguardViewManager.showBouncerMessage(message, mInitialTextColorState);
} else if (mKeyguardUpdateMonitor.isScreenOn()) {
- showTransientIndication(message);
+ showTransientIndication(mContext.getString(R.string.keyguard_unlock));
hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS);
}
}
@@ -676,7 +676,11 @@
return;
}
animatePadlockError();
- if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
+ if (msgId == FaceManager.FACE_ERROR_TIMEOUT) {
+ // The face timeout message is not very actionable, let's ask the user to
+ // manually retry.
+ showSwipeUpToUnlock();
+ } else if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
mStatusBarKeyguardViewManager.showBouncerMessage(errString, mInitialTextColorState);
} else if (updateMonitor.isScreenOn()) {
showTransientIndication(errString);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java
index f34b912..3cb2a2a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java
@@ -63,11 +63,6 @@
int getMaxNotificationsWhileLocked(boolean recompute);
/**
- * True if the presenter is currently locked.
- */
- boolean isPresenterLocked();
-
- /**
* Called when the row states are updated by {@link NotificationViewHierarchyManager}.
*/
void onUpdateRowStates();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java
index 16bd884..d9328fa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java
@@ -20,8 +20,12 @@
import android.util.ArraySet;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
+import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.UnlockMethodCache;
+import com.android.systemui.statusbar.policy.KeyguardMonitor;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -34,22 +38,33 @@
private final UnlockMethodCache mUnlockMethodCache;
private final NotificationLockscreenUserManager mLockscreenUserManager;
+ private final StatusBarStateController mStateController;
+ private final KeyguardMonitor mKeyguardMonitor;
private ArraySet<Listener> mListeners = new ArraySet<>();
private boolean mLastDynamicUnlocked;
private boolean mCacheInvalid;
+ private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
@Inject
DynamicPrivacyController(Context context,
- NotificationLockscreenUserManager notificationLockscreenUserManager) {
- this(notificationLockscreenUserManager, UnlockMethodCache.getInstance(context));
+ KeyguardMonitor keyguardMonitor,
+ NotificationLockscreenUserManager notificationLockscreenUserManager,
+ StatusBarStateController stateController) {
+ this(notificationLockscreenUserManager, keyguardMonitor,
+ UnlockMethodCache.getInstance(context),
+ stateController);
}
@VisibleForTesting
DynamicPrivacyController(NotificationLockscreenUserManager notificationLockscreenUserManager,
- UnlockMethodCache unlockMethodCache) {
+ KeyguardMonitor keyguardMonitor,
+ UnlockMethodCache unlockMethodCache,
+ StatusBarStateController stateController) {
mLockscreenUserManager = notificationLockscreenUserManager;
+ mStateController = stateController;
mUnlockMethodCache = unlockMethodCache;
+ mKeyguardMonitor = keyguardMonitor;
mUnlockMethodCache.addListener(this);
mLastDynamicUnlocked = isDynamicallyUnlocked();
}
@@ -77,13 +92,39 @@
}
public boolean isDynamicallyUnlocked() {
- return mUnlockMethodCache.canSkipBouncer() && isDynamicPrivacyEnabled();
+ return (mUnlockMethodCache.canSkipBouncer() || mKeyguardMonitor.isKeyguardGoingAway()
+ || mKeyguardMonitor.isKeyguardFadingAway())
+ && isDynamicPrivacyEnabled();
}
public void addListener(Listener listener) {
mListeners.add(listener);
}
+ /**
+ * Is the notification shade currently in a locked down mode where it's fully showing but the
+ * contents aren't revealed yet?
+ */
+ public boolean isInLockedDownShade() {
+ if (!mStatusBarKeyguardViewManager.isShowing()
+ || !mStatusBarKeyguardViewManager.isSecure()) {
+ return false;
+ }
+ int state = mStateController.getState();
+ if (state != StatusBarState.SHADE && state != StatusBarState.SHADE_LOCKED) {
+ return false;
+ }
+ if (!isDynamicPrivacyEnabled() || isDynamicallyUnlocked()) {
+ return false;
+ }
+ return true;
+ }
+
+ public void setStatusBarKeyguardViewManager(
+ StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
+ mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
+ }
+
public interface Listener {
void onDynamicPrivacyChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java
index 5bab0ef3..4fc6461 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java
@@ -23,7 +23,6 @@
import android.content.Context;
import android.database.ContentObserver;
import android.hardware.display.AmbientDisplayConfiguration;
-import android.os.Bundle;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -32,7 +31,6 @@
import android.service.dreams.DreamService;
import android.service.dreams.IDreamManager;
import android.service.notification.StatusBarNotification;
-import android.text.TextUtils;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -51,6 +49,7 @@
private static final String TAG = "InterruptionStateProvider";
private static final boolean DEBUG = false;
+ private static final boolean DEBUG_HEADS_UP = true;
private static final boolean ENABLE_HEADS_UP = true;
private static final String SETTING_HEADS_UP_TICKER = "ticker_gets_heads_up";
@@ -199,7 +198,7 @@
boolean inShade = mStatusBarStateController.getState() == SHADE;
if (entry.isBubble() && inShade) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No heads up: in unlocked shade where notification is shown as a "
+ "bubble: " + sbn.getKey());
}
@@ -207,7 +206,7 @@
}
if (!canAlertCommon(entry)) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No heads up: notification shouldn't alert: " + sbn.getKey());
}
return false;
@@ -218,7 +217,7 @@
}
if (entry.importance < NotificationManager.IMPORTANCE_HIGH) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No heads up: unimportant notification: " + sbn.getKey());
}
return false;
@@ -233,13 +232,16 @@
boolean inUse = mPowerManager.isScreenOn() && !isDreaming;
if (!inUse) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No heads up: not in use: " + sbn.getKey());
}
return false;
}
if (!mHeadsUpSuppressor.canHeadsUp(entry, sbn)) {
+ if (DEBUG_HEADS_UP) {
+ Log.d(TAG, "No heads up: aborted by suppressor: " + sbn.getKey());
+ }
return false;
}
@@ -257,28 +259,28 @@
StatusBarNotification sbn = entry.notification;
if (!mAmbientDisplayConfiguration.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No pulsing: disabled by setting: " + sbn.getKey());
}
return false;
}
if (!canAlertCommon(entry)) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No pulsing: notification shouldn't alert: " + sbn.getKey());
}
return false;
}
if (entry.shouldSuppressAmbient()) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No pulsing: ambient effect suppressed: " + sbn.getKey());
}
return false;
}
if (entry.importance < NotificationManager.IMPORTANCE_DEFAULT) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No pulsing: not important enough: " + sbn.getKey());
}
return false;
@@ -300,7 +302,7 @@
StatusBarNotification sbn = entry.notification;
if (mNotificationFilter.shouldFilterOut(entry)) {
- if (DEBUG) {
+ if (DEBUG || DEBUG_HEADS_UP) {
Log.d(TAG, "No alerting: filtered notification: " + sbn.getKey());
}
return false;
@@ -308,7 +310,7 @@
// Don't alert notifications that are suppressed due to group alert behavior
if (sbn.isGroup() && sbn.getNotification().suppressAlertingDueToGrouping()) {
- if (DEBUG) {
+ if (DEBUG || DEBUG_HEADS_UP) {
Log.d(TAG, "No alerting: suppressed due to group alert behavior");
}
return false;
@@ -330,28 +332,28 @@
StatusBarNotification sbn = entry.notification;
if (!mUseHeadsUp || mPresenter.isDeviceInVrMode()) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No heads up: no huns or vr mode");
}
return false;
}
if (entry.shouldSuppressPeek()) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No heads up: suppressed by DND: " + sbn.getKey());
}
return false;
}
if (isSnoozedPackage(sbn)) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No heads up: snoozed package: " + sbn.getKey());
}
return false;
}
if (entry.hasJustLaunchedFullScreenIntent()) {
- if (DEBUG) {
+ if (DEBUG_HEADS_UP) {
Log.d(TAG, "No heads up: recent fullscreen: " + sbn.getKey());
}
return false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 1a41866..6a611a6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -179,6 +179,8 @@
*/
private static final int DISTANCE_BETWEEN_ADJACENT_SECTIONS_PX = 1;
private final KeyguardBypassController mKeyguardBypassController;
+ private final DynamicPrivacyController mDynamicPrivacyController;
+ private final SysuiStatusBarStateController mStatusbarStateController;
private ExpandHelper mExpandHelper;
private final NotificationSwipeHelper mSwipeHelper;
@@ -605,6 +607,8 @@
}
});
dynamicPrivacyController.addListener(this);
+ mDynamicPrivacyController = dynamicPrivacyController;
+ mStatusbarStateController = (SysuiStatusBarStateController) statusBarStateController;
}
private void updateDismissRtlSetting(boolean dismissRtl) {
@@ -695,6 +699,9 @@
*/
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
public boolean hasActiveClearableNotifications(@SelectedRows int selection) {
+ if (mDynamicPrivacyController.isInLockedDownShade()) {
+ return false;
+ }
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
@@ -5699,7 +5706,10 @@
mAnimateBottomOnLayout = true;
}
// Let's update the footer once the notifications have been updated (in the next frame)
- post(this::updateFooter);
+ post(() -> {
+ updateFooter();
+ updateSectionBoundaries();
+ });
}
public void setOnPulseHeightChangedListener(Runnable listener) {
@@ -6355,6 +6365,11 @@
}
return true;
+ } else if (mDynamicPrivacyController.isInLockedDownShade()) {
+ mStatusbarStateController.setLeaveOpenOnKeyguardHide(true);
+ mStatusBar.dismissKeyguardThenExecute(() -> false /* dismissAction */,
+ null /* cancelRunnable */, false /* afterKeyguardGone */);
+ return true;
} else {
// abort gesture.
return false;
@@ -6388,6 +6403,30 @@
public boolean isFalsingCheckNeeded() {
return mStatusBarState == StatusBarState.KEYGUARD;
}
+
+ @Override
+ public boolean isDragDownEnabledForView(ExpandableView view) {
+ if (isDragDownAnywhereEnabled()) {
+ return true;
+ }
+ if (mDynamicPrivacyController.isInLockedDownShade()) {
+ if (view == null) {
+ // Dragging down is allowed in general
+ return true;
+ }
+ if (view instanceof ExpandableNotificationRow) {
+ // Only drag down on sensitive views, otherwise the ExpandHelper will take this
+ return ((ExpandableNotificationRow) view).getEntry().isSensitive();
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isDragDownAnywhereEnabled() {
+ return mStatusbarStateController.getState() == StatusBarState.KEYGUARD
+ && !mKeyguardBypassController.getBypassEnabled();
+ }
};
public DragDownCallback getDragDownCallback() { return mDragDownCallback; }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
index d22ad71..fce1dcc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
@@ -14,8 +14,6 @@
package com.android.systemui.statusbar.phone;
-import static com.android.systemui.Interpolators.ALPHA_IN;
-import static com.android.systemui.Interpolators.ALPHA_OUT;
import static com.android.systemui.Interpolators.LINEAR;
import android.animation.Animator;
@@ -24,6 +22,8 @@
import android.view.View;
import android.view.View.AccessibilityDelegate;
+import com.android.systemui.Dependency;
+import com.android.systemui.assist.AssistManager;
import com.android.systemui.statusbar.policy.KeyButtonDrawable;
import java.util.ArrayList;
@@ -33,12 +33,13 @@
* multiples of the same nav bar icon appearing.
*/
public class ButtonDispatcher {
- private final static int FADE_DURATION_IN = 150;
- private final static int FADE_DURATION_OUT = 1000;
+ private static final int FADE_DURATION_IN = 150;
+ private static final int FADE_DURATION_OUT = 250;
private final ArrayList<View> mViews = new ArrayList<>();
private final int mId;
+ private final AssistManager mAssistManager;
private View.OnClickListener mClickListener;
private View.OnTouchListener mTouchListener;
@@ -56,7 +57,10 @@
private AccessibilityDelegate mAccessibilityDelegate;
private final ValueAnimator.AnimatorUpdateListener mAlphaListener = animation ->
- setAlpha((float) animation.getAnimatedValue());
+ setAlpha(
+ (float) animation.getAnimatedValue(),
+ false /* animate */,
+ false /* cancelAnimator */);
private final AnimatorListenerAdapter mFadeListener = new AnimatorListenerAdapter() {
@Override
@@ -68,6 +72,7 @@
public ButtonDispatcher(int id) {
mId = id;
+ mAssistManager = Dependency.get(AssistManager.class);
}
void clear() {
@@ -168,16 +173,30 @@
}
public void setAlpha(float alpha, boolean animate) {
- setAlpha(alpha, animate, (getAlpha() < alpha) ? FADE_DURATION_IN : FADE_DURATION_OUT);
+ setAlpha(alpha, animate, true /* cancelAnimator */);
}
public void setAlpha(float alpha, boolean animate, long duration) {
+ setAlpha(alpha, animate, duration, true /* cancelAnimator */);
+ }
+
+ public void setAlpha(float alpha, boolean animate, boolean cancelAnimator) {
+ setAlpha(
+ alpha,
+ animate,
+ (getAlpha() < alpha) ? FADE_DURATION_IN : FADE_DURATION_OUT,
+ cancelAnimator);
+ }
+
+ public void setAlpha(float alpha, boolean animate, long duration, boolean cancelAnimator) {
+ if (mFadeAnimator != null && (cancelAnimator || animate)) {
+ mFadeAnimator.cancel();
+ }
if (animate) {
- if (mFadeAnimator != null) {
- mFadeAnimator.cancel();
- }
setVisibility(View.VISIBLE);
mFadeAnimator = ValueAnimator.ofFloat(getAlpha(), alpha);
+ mFadeAnimator.setStartDelay(
+ mAssistManager.getAssistHandleShowAndGoRemainingDurationMs());
mFadeAnimator.setDuration(duration);
mFadeAnimator.setInterpolator(LINEAR);
mFadeAnimator.addListener(mFadeListener);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
index f9cdde8..e0c6c55 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -103,7 +103,7 @@
new ISystemGestureExclusionListener.Stub() {
@Override
public void onSystemGestureExclusionChanged(int displayId,
- Region systemGestureExclusion) {
+ Region systemGestureExclusion, Region unrestrictedOrNull) {
if (displayId == mDisplayId) {
mMainExecutor.execute(() -> mExcludeRegion.set(systemGestureExclusion));
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
index c0a1b12..1d4d0bd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
@@ -103,10 +103,11 @@
final boolean userSwitcherEnabled = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.USER_SWITCHER_ENABLED, 0) != 0;
- if (!UserManager.supportsMultipleUsers()
- || mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)
+ // TODO(b/138661450) Move IPC calls to background
+ if (!userSwitcherEnabled
+ || !UserManager.supportsMultipleUsers()
|| UserManager.isDeviceInDemoMode(mContext)
- || !userSwitcherEnabled) {
+ || mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)) {
return false;
}
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 9652992..c171730 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -41,6 +41,7 @@
import android.graphics.Region;
import android.os.PowerManager;
import android.os.SystemClock;
+import android.provider.DeviceConfig;
import android.util.AttributeSet;
import android.util.Log;
import android.util.MathUtils;
@@ -54,6 +55,7 @@
import android.widget.FrameLayout;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.keyguard.KeyguardClockSwitch;
@@ -135,6 +137,8 @@
*/
public static final int FLING_HIDE = 2;
+ private double mQqsSplitFraction;
+
// Cap and total height of Roboto font. Needs to be adjusted when font for the big clock is
// changed.
private static final int CAP_HEIGHT = 1456;
@@ -527,6 +531,9 @@
com.android.internal.R.dimen.status_bar_height);
mHeadsUpInset = statusbarHeight + getResources().getDimensionPixelSize(
R.dimen.heads_up_status_bar_padding);
+ mQqsSplitFraction = ((float) getResources().getInteger(R.integer.qqs_split_fraction)) / (
+ getResources().getInteger(R.integer.qqs_split_fraction)
+ + getResources().getInteger(R.integer.qs_split_fraction));
}
/**
@@ -1259,6 +1266,15 @@
// earlier so the state is already up to date when dragging down.
setListening(true);
}
+ if (isQsSplitEnabled() && !mKeyguardShowing) {
+ if (mQsExpandImmediate) {
+ mNotificationStackScroller.setVisibility(View.GONE);
+ mQsFrame.setVisibility(View.VISIBLE);
+ } else {
+ mNotificationStackScroller.setVisibility(View.VISIBLE);
+ mQsFrame.setVisibility(View.GONE);
+ }
+ }
return false;
}
@@ -1269,6 +1285,17 @@
|| y <= mQs.getView().getY() + mQs.getView().getHeight());
}
+ private boolean isOnQsEndArea(float x) {
+ if (!isQsSplitEnabled()) return false;
+ if (getLayoutDirection() == LAYOUT_DIRECTION_LTR) {
+ return x >= mQsFrame.getX() + mQqsSplitFraction * mQsFrame.getWidth()
+ && x <= mQsFrame.getX() + mQsFrame.getWidth();
+ } else {
+ return x >= mQsFrame.getX()
+ && x <= mQsFrame.getX() + (1 - mQqsSplitFraction) * mQsFrame.getWidth();
+ }
+ }
+
private boolean isOpenQsEvent(MotionEvent event) {
final int pointerCount = event.getPointerCount();
final int action = event.getActionMasked();
@@ -1284,7 +1311,9 @@
&& (event.isButtonPressed(MotionEvent.BUTTON_SECONDARY)
|| event.isButtonPressed(MotionEvent.BUTTON_TERTIARY));
- return twoFingerDrag || stylusButtonClickDrag || mouseButtonClickDrag;
+ final boolean onHeaderRight = isOnQsEndArea(event.getX());
+
+ return twoFingerDrag || stylusButtonClickDrag || mouseButtonClickDrag || onHeaderRight;
}
private void handleQsDown(MotionEvent event) {
@@ -1519,6 +1548,10 @@
mBarState = statusBarState;
mKeyguardShowing = keyguardShowing;
+ if (mKeyguardShowing && isQsSplitEnabled()) {
+ mNotificationStackScroller.setVisibility(View.VISIBLE);
+ mQsFrame.setVisibility(View.VISIBLE);
+ }
if (oldState == StatusBarState.KEYGUARD
&& (goingToFullShade || statusBarState == StatusBarState.SHADE_LOCKED)) {
@@ -1538,6 +1571,7 @@
} else {
mKeyguardStatusBar.setAlpha(1f);
mKeyguardStatusBar.setVisibility(keyguardShowing ? View.VISIBLE : View.INVISIBLE);
+ ((PhoneStatusBarView) mBar).maybeShowDivider(keyguardShowing);
if (keyguardShowing && oldState != mBarState) {
if (mQs != null) {
mQs.hideImmediately();
@@ -3422,4 +3456,8 @@
mOnReinflationListener = onReinflationListener;
}
+ public static boolean isQsSplitEnabled() {
+ return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
+ SystemUiDeviceConfigFlags.QS_SPLIT_ENABLED, false);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
index a7d5aca..96b4b22 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java
@@ -32,7 +32,7 @@
private final PhoneStatusBarView mView;
private final float mIconAlphaWhenOpaque;
- private View mLeftSide, mStatusIcons, mBattery, mClock;
+ private View mLeftSide, mStatusIcons, mBattery, mClock, mDivider;
private Animator mCurrentAnimation;
public PhoneStatusBarTransitions(PhoneStatusBarView view) {
@@ -46,6 +46,7 @@
mLeftSide = mView.findViewById(R.id.status_bar_left_side);
mStatusIcons = mView.findViewById(R.id.statusIcons);
mBattery = mView.findViewById(R.id.battery);
+ mDivider = mView.findViewById(R.id.divider);
applyModeBackground(-1, getMode(), false /*animate*/);
applyMode(getMode(), false /*animate*/);
}
@@ -88,6 +89,7 @@
anims.playTogether(
animateTransitionTo(mLeftSide, newAlpha),
animateTransitionTo(mStatusIcons, newAlpha),
+ animateTransitionTo(mDivider, newAlpha),
animateTransitionTo(mBattery, newAlphaBC)
);
if (isLightsOut(mode)) {
@@ -98,6 +100,7 @@
} else {
mLeftSide.setAlpha(newAlpha);
mStatusIcons.setAlpha(newAlpha);
+ mDivider.setAlpha(newAlpha);
mBattery.setAlpha(newAlphaBC);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 8efd952..53e1467 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -26,6 +26,7 @@
import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
+import android.provider.DeviceConfig;
import android.util.AttributeSet;
import android.util.EventLog;
import android.util.Pair;
@@ -40,6 +41,8 @@
import android.widget.FrameLayout;
import android.widget.LinearLayout;
+import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
+import com.android.systemui.DarkReceiverImpl;
import com.android.systemui.Dependency;
import com.android.systemui.EventLogTags;
import com.android.systemui.R;
@@ -78,6 +81,10 @@
private View mCutoutSpace;
@Nullable
private DisplayCutout mDisplayCutout;
+
+ private DarkReceiverImpl mSplitDivider;
+ private View mDividerContainer;
+ private QsSplitPropertyListener mPropertyListener;
/**
* Draw this many pixels into the left/right side of the cutout to optimally use the space
*/
@@ -109,6 +116,10 @@
mBattery = findViewById(R.id.battery);
mCutoutSpace = findViewById(R.id.cutout_space_view);
mCenterIconSpace = findViewById(R.id.centered_icon_area);
+ mSplitDivider = findViewById(R.id.divider);
+ mDividerContainer = findViewById(R.id.divider_container);
+ maybeShowDivider(true);
+ mPropertyListener = new QsSplitPropertyListener(mDividerContainer);
updateResources();
}
@@ -118,16 +129,26 @@
super.onAttachedToWindow();
// Always have Battery meters in the status bar observe the dark/light modes.
Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mBattery);
+ Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mSplitDivider);
+ maybeShowDivider(true);
if (updateOrientationAndCutout(getResources().getConfiguration().orientation)) {
updateLayoutForCutout();
}
+ if (mPropertyListener != null) {
+ DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
+ mContext.getMainExecutor(), mPropertyListener);
+ }
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mBattery);
+ Dependency.get(DarkIconDispatcher.class).removeDarkReceiver(mSplitDivider);
mDisplayCutout = null;
+ if (mPropertyListener != null) {
+ DeviceConfig.removeOnPropertiesChangedListener(mPropertyListener);
+ }
}
@Override
@@ -196,6 +217,7 @@
public void onPanelPeeked() {
super.onPanelPeeked();
mBar.makeExpandedVisible(false);
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
@@ -204,6 +226,7 @@
// Close the status bar in the next frame so we can show the end of the animation.
post(mHideExpandedRunnable);
mIsFullyOpenedPanel = false;
+ maybeShowDivider(!mBar.mPanelExpanded);
}
public void removePendingHideExpandedRunnables() {
@@ -217,6 +240,7 @@
mPanel.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}
mIsFullyOpenedPanel = true;
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
@@ -240,24 +264,28 @@
mBar.onTrackingStarted();
mScrimController.onTrackingStarted();
removePendingHideExpandedRunnables();
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
public void onClosingFinished() {
super.onClosingFinished();
mBar.onClosingFinished();
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
public void onTrackingStopped(boolean expand) {
super.onTrackingStopped(expand);
mBar.onTrackingStopped(expand);
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
public void onExpandingFinished() {
super.onExpandingFinished();
mScrimController.onExpandingFinished();
+ maybeShowDivider(!mBar.mPanelExpanded);
}
@Override
@@ -390,4 +418,30 @@
protected boolean shouldPanelBeVisible() {
return mHeadsUpVisible || super.shouldPanelBeVisible();
}
+
+ void maybeShowDivider(boolean showDivider) {
+ int state =
+ showDivider && NotificationPanelView.isQsSplitEnabled() ? View.VISIBLE : View.GONE;
+ mDividerContainer.setVisibility(state);
+ }
+
+ private static class QsSplitPropertyListener implements
+ DeviceConfig.OnPropertiesChangedListener {
+ private final View mDivider;
+
+ QsSplitPropertyListener(View divider) {
+ mDivider = divider;
+ }
+
+ @Override
+ public void onPropertiesChanged(DeviceConfig.Properties properties) {
+ if (properties.getNamespace().equals(DeviceConfig.NAMESPACE_SYSTEMUI)
+ && properties.getKeyset().contains(
+ SystemUiDeviceConfigFlags.QS_SPLIT_ENABLED)) {
+ boolean splitEnabled = properties.getBoolean(
+ SystemUiDeviceConfigFlags.QS_SPLIT_ENABLED, false);
+ mDivider.setVisibility(splitEnabled ? VISIBLE : GONE);
+ }
+ }
+ }
}
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 17a3a9f..4f9df43 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -193,6 +193,7 @@
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
import com.android.systemui.statusbar.notification.BypassHeadsUpNotifier;
+import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationActivityStarter;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
import com.android.systemui.statusbar.notification.NotificationClicker;
@@ -375,6 +376,8 @@
@Inject
protected HeadsUpManagerPhone mHeadsUpManager;
@Inject
+ DynamicPrivacyController mDynamicPrivacyController;
+ @Inject
BypassHeadsUpNotifier mBypassHeadsUpNotifier;
@Nullable
@Inject
@@ -591,7 +594,7 @@
private boolean mVibrateOnOpening;
private VibratorHelper mVibratorHelper;
private ActivityLaunchAnimator mActivityLaunchAnimator;
- protected NotificationPresenter mPresenter;
+ protected StatusBarNotificationPresenter mPresenter;
private NotificationActivityStarter mNotificationActivityStarter;
private boolean mPulsing;
protected BubbleController mBubbleController;
@@ -1066,7 +1069,7 @@
mPresenter = new StatusBarNotificationPresenter(mContext, mNotificationPanel,
mHeadsUpManager, mStatusBarWindow, mStackScroller, mDozeScrimController,
- mScrimController, mActivityLaunchAnimator, mStatusBarKeyguardViewManager,
+ mScrimController, mActivityLaunchAnimator, mDynamicPrivacyController,
mNotificationAlertingManager, rowBinder);
mNotificationListController =
@@ -1243,6 +1246,7 @@
.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
mRemoteInputManager.getController().addCallback(mStatusBarKeyguardViewManager);
+ mDynamicPrivacyController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
mKeyguardViewMediatorCallback = keyguardViewMediator.getViewMediatorCallback();
mLightBarController.setBiometricUnlockController(mBiometricUnlockController);
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 a87dca4..a870590 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -59,6 +59,7 @@
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.notification.AboveShelfObserver;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
+import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -117,9 +118,9 @@
private final AccessibilityManager mAccessibilityManager;
private final KeyguardManager mKeyguardManager;
private final ActivityLaunchAnimator mActivityLaunchAnimator;
- private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
private final int mMaxAllowedKeyguardNotifications;
private final IStatusBarService mBarService;
+ private final DynamicPrivacyController mDynamicPrivacyController;
private boolean mReinflateNotificationsOnUserSwitched;
private boolean mDispatchUiModeChangeOnUserSwitched;
private final UnlockMethodCache mUnlockMethodCache;
@@ -136,16 +137,16 @@
DozeScrimController dozeScrimController,
ScrimController scrimController,
ActivityLaunchAnimator activityLaunchAnimator,
- StatusBarKeyguardViewManager statusBarKeyguardViewManager,
+ DynamicPrivacyController dynamicPrivacyController,
NotificationAlertingManager notificationAlertingManager,
NotificationRowBinderImpl notificationRowBinder) {
mContext = context;
mNotificationPanel = panel;
mHeadsUpManager = headsUp;
+ mDynamicPrivacyController = dynamicPrivacyController;
mCommandQueue = getComponent(context, CommandQueue.class);
mAboveShelfObserver = new AboveShelfObserver(stackScroller);
mActivityLaunchAnimator = activityLaunchAnimator;
- mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mAboveShelfObserver.setListener(statusBarWindow.findViewById(
R.id.notification_container_parent));
mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
@@ -454,8 +455,15 @@
@Override
public void onExpandClicked(NotificationEntry clickedEntry, boolean nowExpanded) {
mHeadsUpManager.setExpanded(clickedEntry, nowExpanded);
- if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD && nowExpanded) {
- mShadeController.goToLockedShade(clickedEntry.getRow());
+ if (nowExpanded) {
+ if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) {
+ mShadeController.goToLockedShade(clickedEntry.getRow());
+ } else if (clickedEntry.isSensitive()
+ && mDynamicPrivacyController.isInLockedDownShade()) {
+ mStatusBarStateController.setLeaveOpenOnKeyguardHide(true);
+ mActivityStarter.dismissKeyguardThenExecute(() -> false /* dismissAction */
+ , null /* cancelRunnable */, false /* afterKeyguardGone */);
+ }
}
}
@@ -464,12 +472,6 @@
return mVrMode;
}
- @Override
- public boolean isPresenterLocked() {
- return mStatusBarKeyguardViewManager.isShowing()
- && mStatusBarKeyguardViewManager.isSecure();
- }
-
private void onLockedNotificationImportanceChange(OnDismissAction dismissAction) {
mStatusBarStateController.setLeaveOpenOnKeyguardHide(true);
mActivityStarter.dismissKeyguardThenExecute(dismissAction, null,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index f1049f0..6789930 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -66,6 +66,7 @@
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility;
import com.android.systemui.tuner.TunerService;
@@ -416,9 +417,8 @@
}
boolean intercept = false;
if (mNotificationPanel.isFullyExpanded()
- && mStatusBarStateController.getState() == StatusBarState.KEYGUARD
+ && mDragDownHelper.isDragDownEnabled()
&& !mService.isBouncerShowing()
- && !mBypassController.getBypassEnabled()
&& !mService.isDozing()) {
intercept = mDragDownHelper.onInterceptTouchEvent(ev);
}
@@ -441,9 +441,7 @@
if (mService.isDozing()) {
handled = !mService.isPulsing();
}
- if ((mStatusBarStateController.getState() == StatusBarState.KEYGUARD && !handled
- && !mBypassController.getBypassEnabled())
- || mDragDownHelper.isDraggingDown()) {
+ if ((mDragDownHelper.isDragDownEnabled() && !handled) || mDragDownHelper.isDraggingDown()) {
// we still want to finish our drag down gesture when locking the screen
handled = mDragDownHelper.onTouchEvent(ev);
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
index db45ad78..0044ca7 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java
@@ -36,6 +36,7 @@
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
+import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -65,6 +66,8 @@
public class CarrierTextControllerTest extends SysuiTestCase {
private static final CharSequence SEPARATOR = " \u2014 ";
+ private static final CharSequence INVALID_CARD_TEXT = "Invalid card";
+ private static final CharSequence AIRPLANE_MODE_TEXT = "Airplane mode";
private static final String TEST_CARRIER = "TEST_CARRIER";
private static final String TEST_CARRIER_2 = "TEST_CARRIER_2";
private static final String TEST_GROUP_UUID = "59b5c870-fc4c-47a4-a99e-9db826b48b24";
@@ -106,6 +109,10 @@
mContext.addMockSystemService(ConnectivityManager.class, mConnectivityManager);
mContext.addMockSystemService(TelephonyManager.class, mTelephonyManager);
mContext.addMockSystemService(SubscriptionManager.class, mSubscriptionManager);
+ mContext.getOrCreateTestableResources().addOverride(
+ R.string.keyguard_sim_error_message_short, INVALID_CARD_TEXT);
+ mContext.getOrCreateTestableResources().addOverride(
+ R.string.airplane_mode, AIRPLANE_MODE_TEXT);
mDependency.injectMockDependency(WakefulnessLifecycle.class);
mDependency.injectTestDependency(Dependency.MAIN_HANDLER,
new Handler(mTestableLooper.getLooper()));
@@ -122,6 +129,53 @@
}
@Test
+ public void testAirplaneMode() {
+ Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION);
+ when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list);
+ when(mKeyguardUpdateMonitor.getSimState(0)).thenReturn(IccCardConstants.State.READY);
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+
+ mCarrierTextController.updateCarrierText();
+
+ ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextController.CarrierTextCallbackInfo.class);
+
+ mTestableLooper.processAllMessages();
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+ assertEquals(AIRPLANE_MODE_TEXT, captor.getValue().carrierText);
+ }
+
+ @Test
+ public void testCardIOError() {
+ reset(mCarrierTextCallback);
+ List<SubscriptionInfo> list = new ArrayList<>();
+ list.add(TEST_SUBSCRIPTION);
+ when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list);
+ when(mKeyguardUpdateMonitor.getSimState(0)).thenReturn(IccCardConstants.State.READY);
+ when(mKeyguardUpdateMonitor.getSimState(1)).thenReturn(
+ IccCardConstants.State.CARD_IO_ERROR);
+ mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
+
+ mCarrierTextController.mCallback.onSimStateChanged(3, 1,
+ IccCardConstants.State.CARD_IO_ERROR);
+
+ ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
+ ArgumentCaptor.forClass(
+ CarrierTextController.CarrierTextCallbackInfo.class);
+
+ mTestableLooper.processAllMessages();
+ verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());
+ assertEquals("TEST_CARRIER" + SEPARATOR + INVALID_CARD_TEXT, captor.getValue().carrierText);
+ // There's only one subscription in the list
+ assertEquals(1, captor.getValue().listOfCarriers.length);
+ assertEquals(TEST_CARRIER, captor.getValue().listOfCarriers[0]);
+ }
+
+ @Test
public void testWrongSlots() {
reset(mCarrierTextCallback);
when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java
index 6ca5d2c..d804b6f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java
@@ -29,9 +29,12 @@
import android.testing.TestableLooper.RunWithLooper;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationViewHierarchyManager;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.UnlockMethodCache;
+import com.android.systemui.statusbar.policy.KeyguardMonitor;
import org.junit.Assert;
import org.junit.Before;
@@ -51,12 +54,17 @@
= mock(NotificationLockscreenUserManager.class);
private DynamicPrivacyController.Listener mListener
= mock(DynamicPrivacyController.Listener.class);
+ private KeyguardMonitor mKeyguardMonitor = mock(KeyguardMonitor.class);
@Before
public void setUp() throws Exception {
when(mCache.canSkipBouncer()).thenReturn(false);
+ when(mKeyguardMonitor.isShowing()).thenReturn(true);
mDynamicPrivacyController = new DynamicPrivacyController(
- mLockScreenUserManager, mCache);
+ mLockScreenUserManager, mKeyguardMonitor, mCache,
+ mock(StatusBarStateController.class));
+ mDynamicPrivacyController.setStatusBarKeyguardViewManager(
+ mock(StatusBarKeyguardViewManager.class));
mDynamicPrivacyController.addListener(mListener);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index c1911ee..31054260 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -62,6 +62,7 @@
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.RemoteInputController;
import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationData;
@@ -105,7 +106,7 @@
@Rule public MockitoRule mockito = MockitoJUnit.rule();
@Mock private StatusBar mBar;
- @Mock private StatusBarStateController mBarState;
+ @Mock private SysuiStatusBarStateController mBarState;
@Mock private HeadsUpManagerPhone mHeadsUpManager;
@Mock private NotificationBlockingHelperManager mBlockingHelperManager;
@Mock private NotificationGroupManager mGroupManager;
@@ -136,7 +137,7 @@
mDependency.injectTestDependency(
NotificationBlockingHelperManager.class,
mBlockingHelperManager);
- mDependency.injectTestDependency(StatusBarStateController.class, mBarState);
+ mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState);
mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
mDependency.injectTestDependency(NotificationRemoteInputManager.class,
mRemoteInputManager);
@@ -162,7 +163,7 @@
mock(DynamicPrivacyController.class),
mock(ConfigurationController.class),
mock(ActivityStarterDelegate.class),
- mock(StatusBarStateController.class),
+ mock(SysuiStatusBarStateController.class),
mHeadsUpManager,
mKeyguardBypassController,
new FalsingManagerFake());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
index e811e1d..186a8c7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
@@ -40,6 +40,7 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
+import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl;
@@ -75,7 +76,7 @@
mock(NotificationPanelView.class), mock(HeadsUpManagerPhone.class),
statusBarWindowView, mock(NotificationListContainerViewGroup.class),
mock(DozeScrimController.class), mock(ScrimController.class),
- mock(ActivityLaunchAnimator.class), mock(StatusBarKeyguardViewManager.class),
+ mock(ActivityLaunchAnimator.class), mock(DynamicPrivacyController.class),
mock(NotificationAlertingManager.class),
mock(NotificationRowBinderImpl.class));
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index cffd57b..fa235bd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -157,7 +157,7 @@
@Mock private RemoteInputController mRemoteInputController;
@Mock private StatusBarStateControllerImpl mStatusBarStateController;
@Mock private DeviceProvisionedController mDeviceProvisionedController;
- @Mock private NotificationPresenter mNotificationPresenter;
+ @Mock private StatusBarNotificationPresenter mNotificationPresenter;
@Mock
private NotificationEntryListener mEntryListener;
@Mock
@@ -780,7 +780,7 @@
NotificationShelf notificationShelf,
NotificationLockscreenUserManager notificationLockscreenUserManager,
CommandQueue commandQueue,
- NotificationPresenter notificationPresenter,
+ StatusBarNotificationPresenter notificationPresenter,
BubbleController bubbleController,
NavigationBarController navBarController,
AutoHideController autoHideController,
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
index 5111bec..18b6f90 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -29,6 +29,7 @@
import android.view.MotionEvent;
import android.view.accessibility.AccessibilityEvent;
+import com.android.server.accessibility.gestures.TouchExplorer;
import com.android.server.LocalServices;
import com.android.server.policy.WindowManagerPolicy;
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 5ba777c..b5b3cd2 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -816,7 +816,7 @@
}
- boolean onGesture(AccessibilityGestureInfo gestureInfo) {
+ public boolean onGesture(AccessibilityGestureInfo gestureInfo) {
synchronized (mLock) {
boolean handled = notifyGestureLocked(gestureInfo, false);
if (!handled) {
@@ -905,15 +905,15 @@
return getInteractionBridge().performActionOnAccessibilityFocusedItemNotLocked(action);
}
- int getActiveWindowId() {
+ public int getActiveWindowId() {
return mA11yWindowManager.getActiveWindowId(mCurrentUserId);
}
- void onTouchInteractionStart() {
+ public void onTouchInteractionStart() {
mA11yWindowManager.onTouchInteractionStart();
}
- void onTouchInteractionEnd() {
+ public void onTouchInteractionEnd() {
mA11yWindowManager.onTouchInteractionEnd();
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
index 961168a..02f7821 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
@@ -361,7 +361,7 @@
mSystemSupport.getMotionEventInjectorForDisplayLocked(displayId);
if (motionEventInjector != null && isTouchableDisplay) {
motionEventInjector.injectEvents(
- gestureSteps.getList(), mServiceInterface, sequence);
+ gestureSteps.getList(), mServiceInterface, sequence, displayId);
} else {
try {
mServiceInterface.onPerformGestureResult(sequence, false);
diff --git a/services/accessibility/java/com/android/server/accessibility/BaseEventStreamTransformation.java b/services/accessibility/java/com/android/server/accessibility/BaseEventStreamTransformation.java
index ce54586..1645721 100644
--- a/services/accessibility/java/com/android/server/accessibility/BaseEventStreamTransformation.java
+++ b/services/accessibility/java/com/android/server/accessibility/BaseEventStreamTransformation.java
@@ -16,7 +16,7 @@
package com.android.server.accessibility;
-abstract class BaseEventStreamTransformation implements EventStreamTransformation {
+public abstract class BaseEventStreamTransformation implements EventStreamTransformation {
private EventStreamTransformation mNext;
@Override
diff --git a/services/accessibility/java/com/android/server/accessibility/EventStreamTransformation.java b/services/accessibility/java/com/android/server/accessibility/EventStreamTransformation.java
index 7982996..61aff9a 100644
--- a/services/accessibility/java/com/android/server/accessibility/EventStreamTransformation.java
+++ b/services/accessibility/java/com/android/server/accessibility/EventStreamTransformation.java
@@ -54,7 +54,7 @@
* For example, if it received a down motion event followed by a cancel motion
* event, it should not handle subsequent move and up events until it gets a down.
*/
-interface EventStreamTransformation {
+public interface EventStreamTransformation {
/**
* Receives a motion event. Passed are the event transformed by previous
diff --git a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
index 1d58e90..06ca054 100644
--- a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
@@ -24,7 +24,7 @@
import static android.view.MotionEvent.ACTION_POINTER_UP;
import static android.view.MotionEvent.ACTION_UP;
-import static com.android.server.accessibility.GestureUtils.distance;
+import static com.android.server.accessibility.gestures.GestureUtils.distance;
import static java.lang.Math.abs;
import static java.util.Arrays.asList;
@@ -54,6 +54,7 @@
import android.view.ViewConfiguration;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.accessibility.gestures.GestureUtils;
import java.util.ArrayDeque;
import java.util.Queue;
diff --git a/services/accessibility/java/com/android/server/accessibility/MotionEventInjector.java b/services/accessibility/java/com/android/server/accessibility/MotionEventInjector.java
index 7b6a128..3310cb4 100644
--- a/services/accessibility/java/com/android/server/accessibility/MotionEventInjector.java
+++ b/services/accessibility/java/com/android/server/accessibility/MotionEventInjector.java
@@ -101,11 +101,12 @@
* either complete or cancelled.
*/
public void injectEvents(List<GestureStep> gestureSteps,
- IAccessibilityServiceClient serviceInterface, int sequence) {
+ IAccessibilityServiceClient serviceInterface, int sequence, int displayId) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = gestureSteps;
args.arg2 = serviceInterface;
args.argi1 = sequence;
+ args.argi2 = displayId;
mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_INJECT_EVENTS, args));
}
@@ -146,7 +147,7 @@
if (message.what == MESSAGE_INJECT_EVENTS) {
SomeArgs args = (SomeArgs) message.obj;
injectEventsMainThread((List<GestureStep>) args.arg1,
- (IAccessibilityServiceClient) args.arg2, args.argi1);
+ (IAccessibilityServiceClient) args.arg2, args.argi1, args.argi2);
args.recycle();
return true;
}
@@ -165,7 +166,7 @@
}
private void injectEventsMainThread(List<GestureStep> gestureSteps,
- IAccessibilityServiceClient serviceInterface, int sequence) {
+ IAccessibilityServiceClient serviceInterface, int sequence, int displayId) {
if (mIsDestroyed) {
try {
serviceInterface.onPerformGestureResult(sequence, false);
@@ -209,6 +210,7 @@
for (int i = 0; i < events.size(); i++) {
MotionEvent event = events.get(i);
+ event.setDisplayId(displayId);
int isEndOfSequence = (i == events.size() - 1) ? 1 : 0;
Message message = mHandler.obtainMessage(
MESSAGE_SEND_MOTION_EVENT, isEndOfSequence, 0, event);
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityGestureDetector.java b/services/accessibility/java/com/android/server/accessibility/gestures/AccessibilityGestureDetector.java
similarity index 99%
rename from services/accessibility/java/com/android/server/accessibility/AccessibilityGestureDetector.java
rename to services/accessibility/java/com/android/server/accessibility/gestures/AccessibilityGestureDetector.java
index b4ac92f..9101a01 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityGestureDetector.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/AccessibilityGestureDetector.java
@@ -14,7 +14,7 @@
** limitations under the License.
*/
-package com.android.server.accessibility;
+package com.android.server.accessibility.gestures;
import android.accessibilityservice.AccessibilityGestureInfo;
import android.accessibilityservice.AccessibilityService;
diff --git a/services/accessibility/java/com/android/server/accessibility/GestureUtils.java b/services/accessibility/java/com/android/server/accessibility/gestures/GestureUtils.java
similarity index 97%
rename from services/accessibility/java/com/android/server/accessibility/GestureUtils.java
rename to services/accessibility/java/com/android/server/accessibility/gestures/GestureUtils.java
index d5b53bc..0f5dd08 100644
--- a/services/accessibility/java/com/android/server/accessibility/GestureUtils.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/GestureUtils.java
@@ -1,4 +1,4 @@
-package com.android.server.accessibility;
+package com.android.server.accessibility.gestures;
import android.util.MathUtils;
import android.view.MotionEvent;
@@ -6,7 +6,7 @@
/**
* Some helper functions for gesture detection.
*/
-final class GestureUtils {
+public final class GestureUtils {
private GestureUtils() {
/* cannot be instantiated */
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
similarity index 99%
rename from services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
rename to services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
index 380e853..10c32ee 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
@@ -14,11 +14,11 @@
** limitations under the License.
*/
-package com.android.server.accessibility;
+package com.android.server.accessibility.gestures;
import static android.view.MotionEvent.INVALID_POINTER_ID;
-import static com.android.server.accessibility.TouchState.ALL_POINTER_ID_BITS;
+import static com.android.server.accessibility.gestures.TouchState.ALL_POINTER_ID_BITS;
import android.accessibilityservice.AccessibilityGestureInfo;
import android.content.Context;
@@ -34,6 +34,8 @@
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
+import com.android.server.accessibility.AccessibilityManagerService;
+import com.android.server.accessibility.BaseEventStreamTransformation;
import com.android.server.policy.WindowManagerPolicy;
import java.util.ArrayList;
@@ -58,7 +60,7 @@
*
* @hide
*/
-class TouchExplorer extends BaseEventStreamTransformation
+public class TouchExplorer extends BaseEventStreamTransformation
implements AccessibilityGestureDetector.Listener {
private static final boolean DEBUG = false;
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchState.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java
similarity index 99%
rename from services/accessibility/java/com/android/server/accessibility/TouchState.java
rename to services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java
index 7569b05..820c1a7 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchState.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchState.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server.accessibility;
+package com.android.server.accessibility.gestures;
import static android.view.MotionEvent.INVALID_POINTER_ID;
diff --git a/services/art-profile-boot b/services/art-profile-boot
new file mode 100644
index 0000000..0bc7e12
--- /dev/null
+++ b/services/art-profile-boot
@@ -0,0 +1,231 @@
+Lcom/android/server/pm/permission/PermissionsState;->hasPermission(Ljava/lang/String;I)Z
+Lcom/android/server/pm/permission/PermissionsState;->hasPermissionRequiringReview(I)Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;-><init>(Lcom/android/server/pm/permission/PermissionsState$PermissionData;)V
+Lcom/android/server/pm/Settings;->readInstallPermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/permission/PermissionsState;)V
+Lcom/android/server/pm/permission/PermissionsState;->getPermissions(I)Ljava/util/Set;
+Lcom/android/server/pm/permission/PermissionsState;->computeGids(I)[I
+Lcom/android/server/pm/permission/PermissionsState;->copyFrom(Lcom/android/server/pm/permission/PermissionsState;)V
+Lcom/android/server/pm/PackageManagerService;->prepareAppDataLeafLIF(Landroid/content/pm/PackageParser$Package;II)V
+Lcom/android/server/SystemServer;->startOtherServices()V
+Lcom/android/server/pm/permission/PermissionsState;->grantPermission(Lcom/android/server/pm/permission/BasePermission;I)I
+Lcom/android/server/pm/permission/PermissionManagerService;->restorePermissionState(Landroid/content/pm/PackageParser$Package;ZLjava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;)V
+Lcom/android/server/pm/PackageManagerService;->lambda$new$0$PackageManagerService(Ljava/util/List;I)V
+Lcom/android/server/pm/permission/PermissionsState;->updatePermissionFlags(Lcom/android/server/pm/permission/BasePermission;III)Z
+Lcom/android/server/pm/PackageManagerService;->reconcilePackagesLocked(Lcom/android/server/pm/PackageManagerService$ReconcileRequest;Lcom/android/server/pm/KeySetManagerService;)Ljava/util/Map;
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->updateFlags(III)Z
+Lcom/android/server/pm/Settings;->writePermissionsLPr(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+Lcom/android/server/pm/permission/PermissionSettings;->getPermissionLocked(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+Lcom/android/server/pm/Settings;->readPackageLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->grant(I)Z
+Lcom/android/server/pm/PackageManagerService;->getInstantAppPackageName(I)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->scanPackageOnlyLI(Lcom/android/server/pm/PackageManagerService$ScanRequest;ZJ)Lcom/android/server/pm/PackageManagerService$ScanResult;
+Lcom/android/server/pm/Settings;->getSettingLPr(I)Lcom/android/server/pm/SettingBase;
+Lcom/android/server/usage/AppStandbyController;->informListeners(Ljava/lang/String;IIIZ)V
+Lcom/android/server/pm/permission/PermissionsState;->hasInstallPermission(Ljava/lang/String;)Z
+Lcom/android/server/pm/permission/PermissionManagerService;->revokePermissionsNoLongerImplicitLocked(Lcom/android/server/pm/permission/PermissionsState;Landroid/content/pm/PackageParser$Package;[I)[I
+Lcom/android/server/pm/PackageManagerService;->getPackagesForUid(I)[Ljava/lang/String;
+Lcom/android/server/pm/permission/PermissionsState;->ensurePermissionData(Lcom/android/server/pm/permission/BasePermission;)Lcom/android/server/pm/permission/PermissionsState$PermissionData;
+Lcom/android/server/pm/PackageManagerService;->filterAppAccessLPr(Lcom/android/server/pm/PackageSetting;II)Z
+Lcom/android/server/pm/PackageManagerService;->filterAppAccessLPr(Lcom/android/server/pm/PackageSetting;ILandroid/content/ComponentName;II)Z
+Lcom/android/server/pm/permission/PermissionManagerService;->grantSignaturePermission(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/permission/BasePermission;Lcom/android/server/pm/permission/PermissionsState;)Z
+Lcom/android/server/pm/PackageSettingBase;->readUserState(I)Landroid/content/pm/PackageUserState;
+Lcom/android/server/am/ActivityManagerService;-><init>(Landroid/content/Context;Lcom/android/server/wm/ActivityTaskManagerService;)V
+Lcom/android/server/pm/PackageManagerService;->generatePackageInfo(Lcom/android/server/pm/PackageSetting;II)Landroid/content/pm/PackageInfo;
+Lcom/android/server/pm/ComponentResolver;->addActivitiesLocked(Landroid/content/pm/PackageParser$Package;Ljava/util/List;Z)V
+Lcom/android/server/usage/UsageStatsProto;->loadUsageStats(Landroid/util/proto/ProtoInputStream;JLcom/android/server/usage/IntervalStats;Ljava/util/List;)V
+Lcom/android/server/pm/permission/BasePermission;->readLPw(Ljava/util/Map;Lorg/xmlpull/v1/XmlPullParser;)Z
+Lcom/android/server/pm/permission/PermissionsState;->getPermissionStatesInternal(I)Ljava/util/List;
+Lcom/android/server/om/OverlayManagerSettings;->select(Ljava/lang/String;I)I
+Lcom/android/server/pm/permission/PermissionsState;->enforceValidUserId(I)V
+Lcom/android/server/pm/UserManagerService;->getUserInfoNoChecks(I)Landroid/content/pm/UserInfo;
+Lcom/android/server/SystemServer;->startBootstrapServices()V
+Lcom/android/server/pm/PackageManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;ZZ)V
+Lcom/android/server/pm/PackageManagerService;->scanDirLI(Ljava/io/File;IIJ)V
+Lcom/android/server/SystemServiceManager;->startBootPhase(I)V
+Lcom/android/server/pm/PackageManagerService;->checkUidPermission(Ljava/lang/String;I)I
+Lcom/android/server/pm/PackageManagerService;->checkUidPermissionImpl(Ljava/lang/String;I)I
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->addActivity(Landroid/content/pm/PackageParser$Activity;Ljava/lang/String;Ljava/util/List;)V
+Lcom/android/server/pm/Settings;->readPackageRestrictionsLPr(I)V
+Lcom/android/server/usage/UserUsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;)V
+Lcom/android/server/pm/PackageManagerService;->getInstalledApplicationsListInternal(III)Ljava/util/List;
+Lcom/android/server/appop/AppOpsService;->readOp(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;Z)V
+Lcom/android/server/pm/PackageManagerService;->resolveContentProviderInternal(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+Lcom/android/server/pm/Settings;->readComponentsLPr(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/ArraySet;
+Lcom/android/server/pm/SELinuxMMAC;->getSeInfo(Landroid/content/pm/PackageParser$Package;ZII)Ljava/lang/String;
+Lcom/android/server/pm/permission/PermissionManagerService;->setInitialGrantForNewImplicitPermissionsLocked(Lcom/android/server/pm/permission/PermissionsState;Lcom/android/server/pm/permission/PermissionsState;Landroid/content/pm/PackageParser$Package;[I)[I
+Lcom/android/server/stats/StatsCompanionService;-><init>(Landroid/content/Context;)V
+Lcom/android/server/pm/PackageManagerService;->maybeMigrateAppDataLIF(Landroid/content/pm/PackageParser$Package;I)Z
+Lcom/android/server/media/MediaSessionService;-><init>(Landroid/content/Context;)V
+Lcom/android/server/pm/PackageUsage;->readToken(Ljava/io/InputStream;Ljava/lang/StringBuffer;C)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->addForInitLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+Lcom/android/server/pm/permission/PermissionsState;->grantInstallPermission(Lcom/android/server/pm/permission/BasePermission;)I
+Lcom/android/server/pm/PackageManagerService;->forEachPackage(Ljava/util/function/Consumer;)V
+Lcom/android/server/pm/PackageSignatures;->readXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/ArrayList;)V
+Lcom/android/server/pm/Installer;->createAppData(Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;I)J
+Lcom/android/server/pm/PackageManagerService;->commitPackageSettings(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/PackageSetting;IZLcom/android/server/pm/PackageManagerService$ReconciledPackage;)V
+Lcom/android/server/pm/PackageSettingBase;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JIILjava/lang/String;Ljava/util/List;[Ljava/lang/String;[J)V
+Lcom/android/server/pm/Settings;->writePackageLPr(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/ParallelPackageParser;->lambda$submit$0$ParallelPackageParser(Ljava/io/File;I)V
+Lcom/android/server/pm/permission/PermissionSettings;->readPermissions(Landroid/util/ArrayMap;Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/pm/permission/PermissionSettings;->readPermissions(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/pm/PackageManagerServiceUtils;->getLastModifiedTime(Landroid/content/pm/PackageParser$Package;)J
+Lcom/android/server/wm/WindowAnimator;->animate(J)V
+Lcom/android/server/pm/PackageManagerService;->getPackageUid(Ljava/lang/String;II)I
+Lcom/android/server/am/OomAdjuster;->updateOomAdjLocked()V
+Lcom/android/server/am/OomAdjuster;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;Z)Z
+Lcom/android/server/pm/PackageSignatures;->readCertsListXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/ArrayList;Ljava/util/ArrayList;IZLandroid/content/pm/PackageParser$SigningDetails$Builder;)I
+Lcom/android/server/pm/KeySetManagerService;->readKeySetListLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/usage/IntervalStats;->buildEvent(Landroid/util/proto/ProtoInputStream;Ljava/util/List;)Landroid/app/usage/UsageEvents$Event;
+Lcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZLjava/lang/Object;III)V
+Lcom/android/server/notification/PreferencesHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;ZI)V
+Lcom/android/server/pm/PackageManagerService;->applyPolicy(Landroid/content/pm/PackageParser$Package;IILandroid/content/pm/PackageParser$Package;)V
+Lcom/android/server/pm/permission/PermissionsState;->getPermissionState(Ljava/lang/String;I)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissions(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissionsForUserAsyncLPr(I)V
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissionsSync(I)V
+Lcom/android/server/pm/PackageManagerService;->scanPackageNewLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Lcom/android/server/pm/PackageManagerService$ScanResult;
+Lcom/android/server/pm/KeySetManagerService;->addScannedPackageLPw(Landroid/content/pm/PackageParser$Package;)V
+Lcom/android/server/pm/Policy;->getMatchedSeInfo(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+Lcom/android/server/pm/UserManagerService;->getUsers(Z)Ljava/util/List;
+Lcom/android/server/job/controllers/TimeController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+Lcom/android/server/pm/permission/PermissionsState;->hasRuntimePermission(Ljava/lang/String;I)Z
+Lcom/android/server/pm/permission/PermissionSettings;->getPermission(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+Lcom/android/server/pm/permission/PermissionSettings;->getPermissionTreeLocked(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+Lcom/android/server/pm/PackageSettingBase;->doCopy(Lcom/android/server/pm/PackageSettingBase;)V
+Lcom/android/server/pm/PackageManagerService;->commitReconciledScanResultLocked(Lcom/android/server/pm/PackageManagerService$ReconciledPackage;)V
+Lcom/android/server/pm/ComponentResolver;->addAllComponents(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/job/JobSchedulerService;->lambda$onBootPhase$2$JobSchedulerService(Lcom/android/server/job/controllers/JobStatus;)V
+Lcom/android/server/pm/PackageSettingBase;->updateFrom(Lcom/android/server/pm/PackageSettingBase;)Lcom/android/server/pm/PackageSettingBase;
+Lcom/android/server/pm/Settings;->writeUserRestrictionsLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/usage/AppIdleHistory;->readAppIdleTimes(ILandroid/util/ArrayMap;)V
+Lcom/android/server/pm/Settings;->addPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;)V
+Lcom/android/server/pm/PackageManagerService;->setNativeLibraryPaths(Landroid/content/pm/PackageParser$Package;Ljava/io/File;)V
+Lcom/android/server/pm/PackageManagerService;->assertPackageIsValid(Landroid/content/pm/PackageParser$Package;II)V
+Lcom/android/server/pm/PackageManagerServiceUtils;->getCompressedFiles(Ljava/lang/String;)[Ljava/io/File;
+Lcom/android/server/usage/UsageStatsProto;->read(Ljava/io/InputStream;Lcom/android/server/usage/IntervalStats;)V
+Lcom/android/server/usage/UsageStatsProto;->readStringPool(Landroid/util/proto/ProtoInputStream;)Ljava/util/List;
+Lcom/android/server/pm/Settings;->readLPw(Ljava/util/List;)Z
+Lcom/android/server/pm/PackageManagerService;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
+Lcom/android/server/pm/SettingBase;-><init>(II)V
+Lcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->restoreJobFromXml(ZLorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/job/controllers/JobStatus;
+Lcom/android/server/pm/Settings;->writeKernelMappingLPr()V
+Lcom/android/server/pm/Settings;->writeKernelMappingLPr(Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/Settings;->writeKernelMappingLPr(Ljava/lang/String;I[I)V
+Lcom/android/server/usage/AppStandbyController;->isAppSpecial(Ljava/lang/String;II)Z
+Lcom/android/server/pm/ComponentResolver;->addProvidersLocked(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/pm/ComponentResolver;->addServicesLocked(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/pm/PackageManagerService;->getApplicationInfoInternal(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+Lcom/android/server/pm/PackageManagerService;->collectCertificatesLI(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;ZZ)V
+Lcom/android/server/pm/PackageSignatures;->writeCertsListXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/ArrayList;[Landroid/content/pm/Signature;Z)V
+Lcom/android/server/pm/KeySetManagerService;->getPublicKeysFromKeySetLPr(J)Landroid/util/ArraySet;
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->addService(Landroid/content/pm/PackageParser$Service;)V
+Lcom/android/server/pm/permission/PermissionManagerService;->addAllPermissions(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/pm/ComponentResolver;->queryProvider(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+Lcom/android/server/pm/ComponentResolver;->queryProviders(Landroid/content/Intent;Ljava/lang/String;II)Ljava/util/List;
+PLcom/android/server/pm/ComponentResolver;->queryProviders(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;I)Ljava/util/List;
+Lcom/android/server/pm/ComponentResolver;->queryProviders(Ljava/lang/String;Ljava/lang/String;III)Ljava/util/List;
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackage(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+PLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageInfo(Ljava/lang/String;III)Landroid/content/pm/PackageInfo;
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageList(Landroid/content/pm/PackageManagerInternal$PackageListObserver;)Landroid/content/pm/PackageList;
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageTargetSdkVersion(Ljava/lang/String;)I
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageUid(Ljava/lang/String;II)I
+Lcom/android/server/pm/permission/PermissionsState;->getRuntimePermissionState(Ljava/lang/String;I)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+Lcom/android/server/pm/permission/PermissionsState;->getRuntimePermissionStates(I)Ljava/util/List;
+Lcom/android/server/pm/ComponentResolver;->addReceiversLocked(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/usage/IntervalStats;->getOrCreateUsageStats(Ljava/lang/String;)Landroid/app/usage/UsageStats;
+Lcom/android/server/pm/permission/BasePermission;->createOrUpdate(Lcom/android/server/pm/permission/BasePermission;Landroid/content/pm/PackageParser$Permission;Landroid/content/pm/PackageParser$Package;Ljava/util/Collection;Z)Lcom/android/server/pm/permission/BasePermission;
+Lcom/android/server/pm/ComponentResolver;->adjustPriority(Ljava/util/List;Landroid/content/pm/PackageParser$ActivityIntentInfo;Ljava/lang/String;)V
+Lcom/android/server/pm/PackageManagerService;->resolveInternalPackageNameLPr(Ljava/lang/String;J)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/server/pm/Settings;->getRenamedPackageLPr(Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->adjustScanFlags(ILcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/os/UserHandle;Landroid/content/pm/PackageParser$Package;)I
+Lcom/android/server/pm/Settings;->updatePackageSetting(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/util/List;Lcom/android/server/pm/UserManagerService;[Ljava/lang/String;[J)V
+Lcom/android/server/pm/UserManagerService;->getInstance()Lcom/android/server/pm/UserManagerService;
+Lcom/android/server/pm/UserManagerService;->getUserIds()[I
+Lcom/android/server/pm/PackageManagerService;->scanPackageChildLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+Lcom/android/server/pm/Settings;->writeLPr()V
+Lcom/android/server/net/NetworkPolicyManagerService;->initService(Ljava/util/concurrent/CountDownLatch;)V
+Lcom/android/server/pm/PackageManagerService;->prepareAppDataLIF(Landroid/content/pm/PackageParser$Package;II)V
+Lcom/android/server/pm/PackageSetting;-><init>(Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/PackageSetting;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JIILjava/lang/String;Ljava/util/List;I[Ljava/lang/String;[J)V
+Lcom/android/server/content/ContentService;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/IContentObserver;II)V
+Lcom/android/server/am/BatteryExternalStatsWorker;->updateExternalStatsLocked(Ljava/lang/String;IZZZ)V
+Lcom/android/server/pm/PackageManagerService$ScanRequest;-><init>(Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/SharedUserSetting;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;IIZLandroid/os/UserHandle;)V
+Lcom/android/server/usage/AppStandbyController;->getIdleUidsForUser(I)[I
+Lcom/android/server/pm/PackageManagerService;->getPackageInfoInternal(Ljava/lang/String;JIII)Landroid/content/pm/PackageInfo;
+Lcom/android/server/pm/PackageSignatures;->writeXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/lang/String;Ljava/util/ArrayList;)V
+Lcom/android/server/pm/PackageSetting;->updateFrom(Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/wm/DisplayContent;-><init>(Landroid/view/Display;Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/ActivityDisplay;)V
+Lcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsULInner(IIZ)I
+Lcom/android/server/pm/KeySetManagerService;->addSigningKeySetToPackageLPw(Lcom/android/server/pm/PackageSetting;Landroid/util/ArraySet;)V
+Lcom/android/server/notification/PreferencesHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;ZI)V
+Lcom/android/server/net/NetworkPolicyManagerService;->hasInternetPermissions(I)Z
+Lcom/android/server/pm/ComponentResolver$ProviderIntentResolver;->addProvider(Landroid/content/pm/PackageParser$Provider;)V
+Lcom/android/server/net/NetworkPolicyManagerService;->updateRulesForAllAppsUL(I)V
+Lcom/android/server/pm/UserManagerService;->exists(I)Z
+Lcom/android/server/usage/UsageStatsService$H;->handleMessage(Landroid/os/Message;)V
+Lcom/android/server/usage/UsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;I)V
+PLcom/android/server/usage/UsageStatsService;->reportEventToAllUserId(Landroid/app/usage/UsageEvents$Event;)V
+Lcom/android/server/net/NetworkPolicyManagerService;->isUidIdle(I)Z
+Lcom/android/server/content/ContentService$ObserverNode$ObserverEntry;-><init>(Lcom/android/server/content/ContentService$ObserverNode;Landroid/database/IContentObserver;ZLjava/lang/Object;III)V
+Lcom/android/server/pm/Settings;->writePackageRestrictionsLPr(I)V
+Lcom/android/server/pm/Settings;->addPackageLPw(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IJIILjava/lang/String;Ljava/util/List;[Ljava/lang/String;[J)Lcom/android/server/pm/PackageSetting;
+Lcom/android/server/pm/PackageKeySetData;-><init>()V
+Lcom/android/server/job/controllers/QuotaController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V
+Lcom/android/server/pm/UserManagerService$LocalService;->exists(I)Z
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->newResult(Landroid/content/IntentFilter;II)Ljava/lang/Object;
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->newResult(Landroid/content/pm/PackageParser$ServiceIntentInfo;II)Landroid/content/pm/ResolveInfo;
+Lcom/android/server/pm/PackageManagerService;->updateFlagsForPackage(IILjava/lang/Object;)I
+Lcom/android/server/pm/PackageManagerService;->reconcileAppsDataLI(Ljava/lang/String;IIZZ)Ljava/util/List;
+Lcom/android/server/pm/ParallelPackageParser;->take()Lcom/android/server/pm/ParallelPackageParser$ParseResult;
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getDisabledSystemPackage(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getDisabledSystemPackageName(Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/server/pm/permission/PermissionManagerService;->hasPrivappWhitelistEntry(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;)Z
+Lcom/android/server/pm/permission/PermissionsState;->getPermissionFlags(Ljava/lang/String;I)I
+Lcom/android/server/wm/WindowManagerService;-><init>(Landroid/content/Context;Lcom/android/server/input/InputManagerService;ZZLcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/TransactionFactory;)V
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->queryIntentForPackage(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;I)Ljava/util/List;
+Lcom/android/server/pm/PackageSetting;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
+Lcom/android/server/pm/PackageManagerService;->getSettingsVersionForPackage(Landroid/content/pm/PackageParser$Package;)Lcom/android/server/pm/Settings$VersionInfo;
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->parsePermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/permission/PermissionsState;I)V
+Lcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;)Z
+Lcom/android/server/pm/permission/BasePermission;->findPermissionTree(Ljava/util/Collection;Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+Lcom/android/server/pm/permission/BasePermission;->writeLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+Lcom/android/server/content/ContentService;->handleIncomingUser(Landroid/net/Uri;IIIZI)I
+Lcom/android/server/job/controllers/JobStatus;-><init>(Landroid/app/job/JobInfo;IILjava/lang/String;IIJLjava/lang/String;IJJJJI)V
+Lcom/android/server/job/controllers/JobStatus;-><init>(Landroid/app/job/JobInfo;ILjava/lang/String;IIJLjava/lang/String;JJJJLandroid/util/Pair;I)V
+Lcom/android/server/job/controllers/JobStatus;-><init>(Lcom/android/server/job/controllers/JobStatus;)V
+Lcom/android/server/job/controllers/JobStatus;-><init>(Lcom/android/server/job/controllers/JobStatus;JJJIJJ)V
+Lcom/android/server/usage/IntervalStats;->getOrCreateConfigurationStats(Landroid/content/res/Configuration;)Landroid/app/usage/ConfigurationStats;
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Landroid/content/pm/PackageParser$ServiceIntentInfo;Ljava/util/List;)Z
+Lcom/android/server/notification/ManagedServices;->writeXml(Lorg/xmlpull/v1/XmlSerializer;ZI)V
+Lcom/android/server/pm/permission/PermissionManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermissionGrantedCallback;Ljava/lang/Object;)V
+Lcom/android/server/pm/PackageSettingBase;->modifyUserState(I)Landroid/content/pm/PackageUserState;
+Lcom/android/server/pm/PackageSettingBase;->modifyUserStateComponents(IZZ)Landroid/content/pm/PackageUserState;
+Lcom/android/server/pm/Settings;->getInternalVersion()Lcom/android/server/pm/Settings$VersionInfo;
+Lcom/android/server/pm/PackageSettingBase;->getInstantApp(I)Z
+Lcom/android/server/pm/PackageManagerService$ReconcileRequest;-><init>(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Lcom/android/server/pm/PackageManagerService$1;)V
+Lcom/android/server/pm/PackageManagerService$ReconcileRequest;-><init>(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V
+Lcom/android/server/pm/Settings;->getPackageLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+Lcom/android/server/pm/UserManagerService;->hasManageUsersOrPermission(Ljava/lang/String;)Z
+Lcom/android/server/pm/PackageManagerServiceUtils;->verifySignatures(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$SigningDetails;ZZ)Z
+Lcom/android/server/IntentResolver;->addFilter(Landroid/content/IntentFilter;)V
+Lcom/android/server/IntentResolver;->addFilter(Landroid/util/ArrayMap;Ljava/lang/String;Landroid/content/IntentFilter;)V
+Lcom/android/server/pm/permission/PermissionsState;->hasRequestedPermission(Landroid/util/ArraySet;)Z
+Lcom/android/server/pm/PackageManagerService;->filterSharedLibPackageLPr(Lcom/android/server/pm/PackageSetting;III)Z
+Lcom/android/server/pm/permission/PermissionManagerService;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;II)Landroid/content/pm/PermissionInfo;
+Lcom/android/server/pm/permission/PermissionManagerService;->getPermissionInfoByGroup(Ljava/lang/String;II)Ljava/util/List;
+Lcom/android/server/net/NetworkPolicyManagerService;->writePolicyAL()V
+Lcom/android/server/pm/Installer;->checkBeforeRemote()Z
+PLcom/android/server/pm/permission/PermissionsState;-><init>(Lcom/android/server/pm/permission/PermissionsState;)V
+Lcom/android/server/am/ProcessList;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z
+Lcom/android/server/am/ProcessList;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;ZZLjava/lang/String;)Z
+Lcom/android/server/am/ProcessList;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILjava/lang/String;Landroid/content/ComponentName;ZZIZLjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Runnable;)Lcom/android/server/am/ProcessRecord;
+Lcom/android/server/am/ProcessList;->startProcessLocked(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Z
+Lcom/android/server/pm/Settings;->registerExistingAppIdLPw(ILcom/android/server/pm/SettingBase;Ljava/lang/Object;)Z
+Lcom/android/server/pm/PackageManagerService;->getRealPackageName(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getKnownPackageName(II)Ljava/lang/String;
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+PLcom/android/server/pm/Settings;->getDisabledSystemPkgLPr(Lcom/android/server/pm/PackageSetting;)Lcom/android/server/pm/PackageSetting;
+Lcom/android/server/pm/Settings;->getDisabledSystemPkgLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->parsePermission(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/List;)V
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 46c2a85..b4ee0b1 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -2402,7 +2402,9 @@
// Update the view states first...
mCurrentViewId = viewState.id;
- viewState.setCurrentValue(value);
+ if (value != null) {
+ viewState.setCurrentValue(value);
+ }
if (mCompatMode && (viewState.getState() & ViewState.STATE_URL_BAR) != 0) {
if (sDebug) Slog.d(TAG, "Ignoring VIEW_ENTERED on URL BAR (id=" + id + ")");
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index d5a7c81..814f6da 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -195,16 +195,20 @@
}
boolean isAbleToServeUser(int userId) {
- return getServiceUsers().get(UserHandle.USER_SYSTEM) != null
- && getServiceUsers().get(userId) != null;
+ return getUserServices().get(UserHandle.USER_SYSTEM) != null
+ && getUserServices().get(userId) != null;
}
/**
- * Returns a lst of users currently unlocked that have a
- * {@link UserBackupManagerService} registered.
+ * Returns a list of users currently unlocked that have a {@link UserBackupManagerService}
+ * registered.
+ *
+ * Warning: Do NOT modify returned object as it's used inside.
+ *
+ * TODO: Return a copy or only expose read-only information through other means.
*/
@VisibleForTesting
- public SparseArray<UserBackupManagerService> getServiceUsers() {
+ public SparseArray<UserBackupManagerService> getUserServices() {
return mServiceUsers;
}
@@ -495,7 +499,8 @@
/**
* Returns a {@link UserHandle} for the user that has {@code ancestralSerialNumber} as the
- * serial number of the its ancestral work profile.
+ * serial number of the its ancestral work profile or null if there is no {@link
+ * UserBackupManagerService} associated with that user.
*
* <p> The ancestral work profile is set by {@link #setAncestralSerialNumber(long)}
* and it corresponds to the profile that was used to restore to the callers profile.
@@ -504,16 +509,18 @@
public UserHandle getUserForAncestralSerialNumber(long ancestralSerialNumber) {
int callingUserId = Binder.getCallingUserHandle().getIdentifier();
long oldId = Binder.clearCallingIdentity();
- int[] userIds;
+ final int[] userIds;
try {
- userIds = mContext.getSystemService(UserManager.class).getProfileIds(callingUserId,
- false);
+ userIds =
+ mContext
+ .getSystemService(UserManager.class)
+ .getProfileIds(callingUserId, false);
} finally {
Binder.restoreCallingIdentity(oldId);
}
for (int userId : userIds) {
- UserBackupManagerService userBackupManagerService = getServiceUsers().get(userId);
+ UserBackupManagerService userBackupManagerService = getUserServices().get(userId);
if (userBackupManagerService != null) {
if (userBackupManagerService.getAncestralSerialNumber() == ancestralSerialNumber) {
return UserHandle.of(userId);
@@ -880,28 +887,35 @@
}
/** Implementation to receive lifecycle event callbacks for system services. */
- public static final class Lifecycle extends SystemService {
+ public static class Lifecycle extends SystemService {
public Lifecycle(Context context) {
+ this(context, new Trampoline(context));
+ }
+
+ @VisibleForTesting
+ Lifecycle(Context context, Trampoline trampoline) {
super(context);
- sInstance = new Trampoline(context);
+ sInstance = trampoline;
}
@Override
public void onStart() {
- publishBinderService(Context.BACKUP_SERVICE, sInstance);
+ publishService(Context.BACKUP_SERVICE, sInstance);
}
@Override
public void onUnlockUser(int userId) {
- if (userId == UserHandle.USER_SYSTEM) {
- sInstance.initializeService();
- }
- sInstance.unlockUser(userId);
+ sInstance.onUnlockUser(userId);
}
@Override
public void onStopUser(int userId) {
- sInstance.stopUser(userId);
+ sInstance.onStopUser(userId);
+ }
+
+ @VisibleForTesting
+ void publishService(String name, IBinder service) {
+ publishBinderService(name, service);
}
}
}
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index f4b6645..210a9ef 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -40,12 +40,12 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemProperties;
-import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DumpUtils;
import com.android.server.backup.utils.RandomAccessFileUtils;
@@ -73,9 +73,6 @@
* Temporary disabling is controlled by {@link #setBackupServiceActive(int, boolean)} through
* privileged callers (currently {@link DevicePolicyManager}). This is called on {@link
* UserHandle#USER_SYSTEM} and disables backup for all users.
- *
- * <p>Creation of the backup service is done when {@link UserHandle#USER_SYSTEM} is unlocked. The
- * system user is unlocked before any other users.
*/
public class Trampoline extends IBackupManager.Stub {
/**
@@ -109,7 +106,10 @@
// TODD(b/121198006): remove this object and synchronized all methods on "this".
private final Object mStateLock = new Object();
- private volatile BackupManagerService mService;
+ // TODO: This is not marked as final because of test code. Since we'll merge BMS and Trampoline,
+ // it doesn't make sense to refactor for final. It's never null.
+ @VisibleForTesting
+ protected volatile BackupManagerService mService;
private final Handler mHandler;
public Trampoline(Context context) {
@@ -120,6 +120,13 @@
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
mUserManager = UserManager.get(context);
+ mService = new BackupManagerService(mContext, this);
+ }
+
+ // TODO: Remove this when we implement DI by injecting in the construtor.
+ @VisibleForTesting
+ Handler getBackupHandler() {
+ return mHandler;
}
protected boolean isBackupDisabled() {
@@ -205,7 +212,7 @@
// This method should not perform any I/O (e.g. do not call isBackupActivatedForUser),
// it's used in multiple places where I/O waits would cause system lock-ups.
private boolean isUserReadyForBackup(int userId) {
- return mService != null && mService.isAbleToServeUser(userId);
+ return mService.isAbleToServeUser(userId);
}
/**
@@ -230,68 +237,55 @@
return mUserManager;
}
- protected BackupManagerService createBackupManagerService() {
- return new BackupManagerService(mContext, this);
- }
-
protected void postToHandler(Runnable runnable) {
mHandler.post(runnable);
}
/**
- * Called from {@link BackupManagerService.Lifecycle} when the system user is unlocked. Attempts
- * to initialize {@link BackupManagerService}. Offloads work onto the handler thread {@link
- * #mHandlerThread} to keep unlock time low.
- */
- void initializeService() {
- postToHandler(
- () -> {
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup init");
- if (mGlobalDisable) {
- Slog.i(TAG, "Backup service not supported");
- return;
- }
- synchronized (mStateLock) {
- if (mService == null) {
- mService = createBackupManagerService();
- }
- }
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- });
- }
-
- /**
* Called from {@link BackupManagerService.Lifecycle} when a user {@code userId} is unlocked.
* Starts the backup service for this user if backup is active for this user. Offloads work onto
- * the handler thread {@link #mHandlerThread} to keep unlock time low.
+ * the handler thread {@link #mHandlerThread} to keep unlock time low since backup is not
+ * essential for device functioning.
*/
- void unlockUser(int userId) {
+ void onUnlockUser(int userId) {
postToHandler(() -> startServiceForUser(userId));
}
private void startServiceForUser(int userId) {
// We know that the user is unlocked here because it is called from setBackupServiceActive
// and unlockUser which have these guarantees. So we can check if the file exists.
- if (mService != null && isBackupActivatedForUser(userId)) {
- Slog.i(TAG, "Starting service for user: " + userId);
- mService.startServiceForUser(userId);
+ if (mGlobalDisable) {
+ Slog.i(TAG, "Backup service not supported");
+ return;
}
+ if (!isBackupActivatedForUser(userId)) {
+ Slog.i(TAG, "Backup not activated for user " + userId);
+ return;
+ }
+ Slog.i(TAG, "Starting service for user: " + userId);
+ mService.startServiceForUser(userId);
}
/**
* Called from {@link BackupManagerService.Lifecycle} when a user {@code userId} is stopped.
* Offloads work onto the handler thread {@link #mHandlerThread} to keep stopping time low.
*/
- void stopUser(int userId) {
+ void onStopUser(int userId) {
postToHandler(
() -> {
- if (mService != null) {
+ if (!mGlobalDisable) {
Slog.i(TAG, "Stopping service for user: " + userId);
mService.stopServiceForUser(userId);
}
});
}
+ /** Returns {@link UserBackupManagerService} for user {@code userId}. */
+ @Nullable
+ public UserBackupManagerService getUserService(int userId) {
+ return mService.getUserServices().get(userId);
+ }
+
/**
* The system user and managed profiles can only be acted on by callers in the system or root
* processes. Other users can be acted on by callers who have both android.permission.BACKUP and
@@ -350,9 +344,6 @@
synchronized (mStateLock) {
Slog.i(TAG, "Making backup " + (makeActive ? "" : "in") + "active");
if (makeActive) {
- if (mService == null) {
- mService = createBackupManagerService();
- }
try {
activateBackupForUserLocked(userId);
} catch (IOException e) {
@@ -380,7 +371,7 @@
}
//TODO(b/121198006): loop through active users that have work profile and
// stop them as well.
- stopUser(userId);
+ onStopUser(userId);
}
}
}
@@ -388,8 +379,7 @@
// IBackupManager binder API
/**
- * Querying activity state of backup service. Calling this method before initialize yields
- * undefined result.
+ * Querying activity state of backup service.
*
* @param userId The user in which the activity state of backup service is queried.
* @return true if the service is active.
@@ -397,7 +387,7 @@
@Override
public boolean isBackupServiceActive(int userId) {
synchronized (mStateLock) {
- return mService != null && isBackupActivatedForUser(userId);
+ return !mGlobalDisable && isBackupActivatedForUser(userId);
}
}
@@ -598,8 +588,8 @@
@Override
@Nullable
public ComponentName getCurrentTransportComponentForUser(int userId) {
- return (isUserReadyForBackup(userId)) ? mService.getCurrentTransportComponent(userId)
- : null;
+ return (isUserReadyForBackup(userId))
+ ? mService.getCurrentTransportComponent(userId) : null;
}
@Override
@@ -614,8 +604,8 @@
@Override
public ComponentName[] listAllTransportComponentsForUser(int userId) throws RemoteException {
- return (isUserReadyForBackup(userId)) ? mService.listAllTransportComponents(userId)
- : null;
+ return (isUserReadyForBackup(userId))
+ ? mService.listAllTransportComponents(userId) : null;
}
@Override
@@ -648,8 +638,8 @@
@Override
public String selectBackupTransportForUser(int userId, String transport)
throws RemoteException {
- return (isUserReadyForBackup(userId)) ? mService.selectBackupTransport(userId, transport)
- : null;
+ return (isUserReadyForBackup(userId))
+ ? mService.selectBackupTransport(userId, transport) : null;
}
@Override
@@ -700,8 +690,8 @@
@Override
public Intent getDataManagementIntentForUser(int userId, String transport)
throws RemoteException {
- return isUserReadyForBackup(userId) ? mService.getDataManagementIntent(userId, transport)
- : null;
+ return isUserReadyForBackup(userId)
+ ? mService.getDataManagementIntent(userId, transport) : null;
}
@Override
@@ -784,15 +774,15 @@
@Override
@Nullable public UserHandle getUserForAncestralSerialNumber(long ancestralSerialNumber) {
- if (mService != null) {
- return mService.getUserForAncestralSerialNumber(ancestralSerialNumber);
+ if (mGlobalDisable) {
+ return null;
}
- return null;
+ return mService.getUserForAncestralSerialNumber(ancestralSerialNumber);
}
@Override
public void setAncestralSerialNumber(long ancestralSerialNumber) {
- if (mService != null) {
+ if (!mGlobalDisable) {
mService.setAncestralSerialNumber(ancestralSerialNumber);
}
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 4f7900e..293ab02 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -5520,7 +5520,6 @@
}
nai.asyncChannel.connect(mContext, mTrackerHandler, nai.messenger);
NetworkInfo networkInfo = nai.networkInfo;
- nai.networkInfo = null;
updateNetworkInfo(nai, networkInfo);
updateUids(nai, null, nai.networkCapabilities);
}
@@ -6519,8 +6518,7 @@
if (DBG) {
log(networkAgent.name() + " EVENT_NETWORK_INFO_CHANGED, going from " +
- (oldInfo == null ? "null" : oldInfo.getState()) +
- " to " + state);
+ oldInfo.getState() + " to " + state);
}
if (!networkAgent.created
@@ -6593,8 +6591,8 @@
// TODO(b/122649188): send the broadcast only to VPN users.
mProxyTracker.sendProxyBroadcast();
}
- } else if ((oldInfo != null && oldInfo.getState() == NetworkInfo.State.SUSPENDED) ||
- state == NetworkInfo.State.SUSPENDED) {
+ } else if (networkAgent.created && (oldInfo.getState() == NetworkInfo.State.SUSPENDED ||
+ state == NetworkInfo.State.SUSPENDED)) {
// going into or coming out of SUSPEND: re-score and notify
if (networkAgent.getCurrentScore() != oldScore) {
rematchAllNetworksAndRequests(networkAgent, oldScore);
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index 4d39f9a..bec08f4 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -39,6 +39,12 @@
27391 user_activity_timeout_override (override|2|3)
27392 battery_saver_setting (threshold|1)
+
+# ---------------------------
+# ThermalManagerService.java
+# ---------------------------
+2737 thermal_changed (name|3),(type|1|5),(temperature|5),(sensor_status|1|5),(previous_system_status|1|5)
+
#
# Leave IDs through 2740 for more power logs (2730 used by battery_discharge above)
#
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index b0efd43..80facbb 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -95,6 +95,16 @@
private static final int KEY_CAMERA = 0;
private static final int KEY_HOME = 1;
+ // Pin the camera application.
+ private static boolean PROP_PIN_CAMERA = SystemProperties.getBoolean(
+ "pinner.pin_camera", true);
+ // Pin using pinlist.meta when pinning apps.
+ private static boolean PROP_PIN_PINLIST = SystemProperties.getBoolean(
+ "pinner.use_pinlist", true);
+ // Pin the whole odex/vdex/etc file when pinning apps.
+ private static boolean PROP_PIN_ODEX = SystemProperties.getBoolean(
+ "pinner.whole_odex", true);
+
private static final int MAX_CAMERA_PIN_SIZE = 80 * (1 << 20); // 80MB max for camera app.
private static final int MAX_HOME_PIN_SIZE = 6 * (1 << 20); // 6MB max for home app.
@@ -158,7 +168,11 @@
boolean shouldPinHome = context.getResources().getBoolean(
com.android.internal.R.bool.config_pinnerHomeApp);
if (shouldPinCamera) {
- mPinKeys.add(KEY_CAMERA);
+ if (PROP_PIN_CAMERA) {
+ mPinKeys.add(KEY_CAMERA);
+ } else if (DEBUG) {
+ Slog.i(TAG, "Pinner - skip pinning camera app");
+ }
}
if (shouldPinHome) {
mPinKeys.add(KEY_HOME);
@@ -589,10 +603,16 @@
pf = pinFile(file, pinSizeLimit, /*attemptPinIntrospection=*/false);
if (pf != null) {
synchronized (this) {
- pinnedApp.mFiles.add(pf);
+ if (PROP_PIN_ODEX) {
+ pinnedApp.mFiles.add(pf);
+ }
}
if (DEBUG) {
- Slog.i(TAG, "Pinned " + pf.fileName);
+ if (PROP_PIN_ODEX) {
+ Slog.i(TAG, "Pinned " + pf.fileName);
+ } else {
+ Slog.i(TAG, "Pinned [skip] " + pf.fileName);
+ }
}
}
}
@@ -686,6 +706,13 @@
* @return Open input stream or null on any error
*/
private static InputStream maybeOpenPinMetaInZip(ZipFile zipFile, String fileName) {
+ if (!PROP_PIN_PINLIST) {
+ if (DEBUG) {
+ Slog.i(TAG, "Pin - skip pinlist.meta in " + fileName);
+ }
+ return null;
+ }
+
ZipEntry pinMetaEntry = zipFile.getEntry(PIN_META_FILENAME);
InputStream pinMetaStream = null;
if (pinMetaEntry != null) {
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index deff7ef..ddde7fe 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -3208,28 +3208,28 @@
// should be kept in sync with getFreeBytes().
final File path = storage.findPathForUuid(volumeUuid);
- final long usable = path.getUsableSpace();
- final long lowReserved = storage.getStorageLowBytes(path);
- final long fullReserved = storage.getStorageFullBytes(path);
+ long usable = 0;
+ long lowReserved = 0;
+ long fullReserved = 0;
+ long cacheClearable = 0;
- if (stats.isQuotaSupported(volumeUuid)) {
+ if ((flags & StorageManager.FLAG_ALLOCATE_CACHE_ONLY) == 0) {
+ usable = path.getUsableSpace();
+ lowReserved = storage.getStorageLowBytes(path);
+ fullReserved = storage.getStorageFullBytes(path);
+ }
+
+ if ((flags & StorageManager.FLAG_ALLOCATE_NON_CACHE_ONLY) == 0
+ && stats.isQuotaSupported(volumeUuid)) {
final long cacheTotal = stats.getCacheBytes(volumeUuid);
final long cacheReserved = storage.getStorageCacheBytes(path, flags);
- final long cacheClearable = Math.max(0, cacheTotal - cacheReserved);
+ cacheClearable = Math.max(0, cacheTotal - cacheReserved);
+ }
- if ((flags & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0) {
- return Math.max(0, (usable + cacheClearable) - fullReserved);
- } else {
- return Math.max(0, (usable + cacheClearable) - lowReserved);
- }
+ if ((flags & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0) {
+ return Math.max(0, (usable + cacheClearable) - fullReserved);
} else {
- // When we don't have fast quota information, we ignore cached
- // data and only consider unused bytes.
- if ((flags & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0) {
- return Math.max(0, usable - fullReserved);
- } else {
- return Math.max(0, usable - lowReserved);
- }
+ return Math.max(0, (usable + cacheClearable) - lowReserved);
}
} catch (IOException e) {
throw new ParcelableException(e);
@@ -3242,10 +3242,17 @@
public void allocateBytes(String volumeUuid, long bytes, int flags, String callingPackage) {
flags = adjustAllocateFlags(flags, Binder.getCallingUid(), callingPackage);
- final long allocatableBytes = getAllocatableBytes(volumeUuid, flags, callingPackage);
+ final long allocatableBytes = getAllocatableBytes(volumeUuid,
+ flags | StorageManager.FLAG_ALLOCATE_NON_CACHE_ONLY, callingPackage);
if (bytes > allocatableBytes) {
- throw new ParcelableException(new IOException("Failed to allocate " + bytes
- + " because only " + allocatableBytes + " allocatable"));
+ // If we don't have room without taking cache into account, check to see if we'd have
+ // room if we included freeable cache space.
+ final long cacheClearable = getAllocatableBytes(volumeUuid,
+ flags | StorageManager.FLAG_ALLOCATE_CACHE_ONLY, callingPackage);
+ if (bytes > allocatableBytes + cacheClearable) {
+ throw new ParcelableException(new IOException("Failed to allocate " + bytes
+ + " because only " + (allocatableBytes + cacheClearable) + " allocatable"));
+ }
}
final StorageManager storage = mContext.getSystemService(StorageManager.class);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f3264e2..f731a6d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2373,11 +2373,6 @@
}
}
- @VisibleForTesting
- public ActivityManagerService(Injector injector) {
- this(injector, null /* handlerThread */);
- }
-
/**
* Provides the basic functionality for activity task related tests when a handler thread is
* given to initialize the dependency members.
@@ -7901,11 +7896,14 @@
}
void reportGlobalUsageEventLocked(int event) {
- mUsageStatsService.reportEvent(Event.DEVICE_EVENT_PACKAGE_NAME,
- mUserController.getCurrentUserId(), event);
+ final int currentUserId = mUserController.getCurrentUserId();
+ mUsageStatsService.reportEvent(Event.DEVICE_EVENT_PACKAGE_NAME, currentUserId, event);
int[] profiles = mUserController.getCurrentProfileIds();
if (profiles != null) {
for (int i = profiles.length - 1; i >= 0; i--) {
+ if (profiles[i] == currentUserId) {
+ continue;
+ }
mUsageStatsService.reportEvent(Event.DEVICE_EVENT_PACKAGE_NAME, profiles[i], event);
}
}
@@ -8519,32 +8517,6 @@
}
}
- void setRunningRemoteAnimation(int pid, boolean runningRemoteAnimation) {
- if (pid == Process.myPid()) {
- Slog.wtf(TAG, "system can't run remote animation");
- return;
- }
- synchronized (ActivityManagerService.this) {
- final ProcessRecord pr;
- synchronized (mPidsSelfLocked) {
- pr = mPidsSelfLocked.get(pid);
- if (pr == null) {
- Slog.w(TAG, "setRunningRemoteAnimation called on unknown pid: " + pid);
- return;
- }
- }
- if (pr.runningRemoteAnimation == runningRemoteAnimation) {
- return;
- }
- pr.runningRemoteAnimation = runningRemoteAnimation;
- if (DEBUG_OOM_ADJ) {
- Slog.i(TAG, "Setting runningRemoteAnimation=" + pr.runningRemoteAnimation
- + " for pid=" + pid);
- }
- updateOomAdjLocked(pr, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
- }
- }
-
public final void enterSafeMode() {
synchronized(this) {
// It only makes sense to do this before the system is ready
@@ -18099,11 +18071,6 @@
}
@Override
- public void setRunningRemoteAnimation(int pid, boolean runningRemoteAnimation) {
- ActivityManagerService.this.setRunningRemoteAnimation(pid, runningRemoteAnimation);
- }
-
- @Override
public List<ProcessMemoryState> getMemoryStateForProcesses() {
List<ProcessMemoryState> processMemoryStates = new ArrayList<>();
synchronized (mPidsSelfLocked) {
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 563b2f3..ea30842 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -20,6 +20,7 @@
import static com.android.server.Watchdog.NATIVE_STACKS_OF_INTEREST;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ANR;
+import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.ActivityManagerService.MY_PID;
@@ -1348,6 +1349,25 @@
}
}
+ @Override
+ public void setRunningRemoteAnimation(boolean runningRemoteAnimation) {
+ if (pid == Process.myPid()) {
+ Slog.wtf(TAG, "system can't run remote animation");
+ return;
+ }
+ synchronized (mService) {
+ if (this.runningRemoteAnimation == runningRemoteAnimation) {
+ return;
+ }
+ this.runningRemoteAnimation = runningRemoteAnimation;
+ if (DEBUG_OOM_ADJ) {
+ Slog.i(TAG, "Setting runningRemoteAnimation=" + runningRemoteAnimation
+ + " for pid=" + pid);
+ }
+ mService.updateOomAdjLocked(this, true, OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY);
+ }
+ }
+
public long getInputDispatchingTimeout() {
return mWindowProcessController.getInputDispatchingTimeout();
}
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index cb6cf74..6010b1dc 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -15,9 +15,6 @@
*/
package com.android.server.audio;
-import static com.android.server.audio.AudioService.CONNECTION_STATE_CONNECTED;
-import static com.android.server.audio.AudioService.CONNECTION_STATE_DISCONNECTED;
-
import android.annotation.NonNull;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothDevice;
@@ -95,13 +92,28 @@
/*package*/ AudioDeviceBroker(@NonNull Context context, @NonNull AudioService service) {
mContext = context;
mAudioService = service;
- setupMessaging(context);
mBtHelper = new BtHelper(this);
mDeviceInventory = new AudioDeviceInventory(this);
+ init();
+ }
+
+ /** for test purposes only, inject AudioDeviceInventory */
+ AudioDeviceBroker(@NonNull Context context, @NonNull AudioService service,
+ @NonNull AudioDeviceInventory mockDeviceInventory) {
+ mContext = context;
+ mAudioService = service;
+ mBtHelper = new BtHelper(this);
+ mDeviceInventory = mockDeviceInventory;
+
+ init();
+ }
+
+ private void init() {
+ setupMessaging(mContext);
+
mForcedUseForComm = AudioSystem.FORCE_NONE;
mForcedUseForCommExt = mForcedUseForComm;
-
}
/*package*/ Context getContext() {
@@ -232,17 +244,42 @@
mSupprNoisy = suppressNoisyIntent;
mVolume = vol;
}
+
+ // redefine equality op so we can match messages intended for this device
+ @Override
+ public boolean equals(Object o) {
+ return mDevice.equals(o);
+ }
}
+
/*package*/ void postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
@NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state,
int profile, boolean suppressNoisyIntent, int a2dpVolume) {
final BtDeviceConnectionInfo info = new BtDeviceConnectionInfo(device, state, profile,
suppressNoisyIntent, a2dpVolume);
- // TODO add a check to try to remove unprocessed messages for the same device (the old
- // check didn't work), and make sure it doesn't conflict with config change message
- sendLMsgNoDelay(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT, SENDMSG_QUEUE, info);
+ // when receiving a request to change the connection state of a device, this last request
+ // is the source of truth, so cancel all previous requests
+ removeAllA2dpConnectionEvents(device);
+
+ sendLMsgNoDelay(
+ state == BluetoothProfile.STATE_CONNECTED
+ ? MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION
+ : MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION,
+ SENDMSG_QUEUE, info);
+ }
+
+ /** remove all previously scheduled connection and disconnection events for the given device */
+ private void removeAllA2dpConnectionEvents(@NonNull BluetoothDevice device) {
+ mBrokerHandler.removeMessages(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION,
+ device);
+ mBrokerHandler.removeMessages(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION,
+ device);
+ mBrokerHandler.removeMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED,
+ device);
+ mBrokerHandler.removeMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED,
+ device);
}
private static final class HearingAidDeviceConnectionInfo {
@@ -430,13 +467,16 @@
sendMsgNoDelay(MSG_BROADCAST_AUDIO_BECOMING_NOISY, SENDMSG_REPLACE);
}
- /*package*/ void postA2dpSinkConnection(int state,
+ /*package*/ void postA2dpSinkConnection(@AudioService.BtProfileConnectionState int state,
@NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo, int delay) {
- sendILMsg(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE, SENDMSG_QUEUE,
+ sendILMsg(state == BluetoothA2dp.STATE_CONNECTED
+ ? MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED
+ : MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED,
+ SENDMSG_QUEUE,
state, btDeviceInfo, delay);
}
- /*package*/ void postA2dpSourceConnection(int state,
+ /*package*/ void postA2dpSourceConnection(@AudioService.BtProfileConnectionState int state,
@NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo, int delay) {
sendILMsg(MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE, SENDMSG_QUEUE,
state, btDeviceInfo, delay);
@@ -522,25 +562,6 @@
}
}
- @GuardedBy("mDeviceStateLock")
- /*package*/ void handleSetA2dpSinkConnectionState(@BluetoothProfile.BtProfileState int state,
- @NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo) {
- final int intState = (state == BluetoothA2dp.STATE_CONNECTED)
- ? CONNECTION_STATE_CONNECTED : CONNECTION_STATE_DISCONNECTED;
- final int delay = mDeviceInventory.checkSendBecomingNoisyIntent(
- AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, intState,
- AudioSystem.DEVICE_NONE);
- final String addr = btDeviceInfo == null ? "null" : btDeviceInfo.getBtDevice().getAddress();
-
- if (AudioService.DEBUG_DEVICES) {
- Log.d(TAG, "handleSetA2dpSinkConnectionState btDevice= " + btDeviceInfo
- + " state= " + state
- + " is dock: " + btDeviceInfo.getBtDevice().isBluetoothDock());
- }
- sendILMsg(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE, SENDMSG_QUEUE,
- state, btDeviceInfo, delay);
- }
-
/*package*/ void postSetA2dpSourceConnectionState(@BluetoothProfile.BtProfileState int state,
@NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo) {
final int intState = (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0;
@@ -575,8 +596,10 @@
// must be called synchronized on mConnectedDevices
/*package*/ boolean hasScheduledA2dpSinkConnectionState(BluetoothDevice btDevice) {
- return mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE,
- new BtHelper.BluetoothA2dpDeviceInfo(btDevice));
+ return (mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED,
+ new BtHelper.BluetoothA2dpDeviceInfo(btDevice))
+ || mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED,
+ new BtHelper.BluetoothA2dpDeviceInfo(btDevice)));
}
/*package*/ void setA2dpDockTimeout(String address, int a2dpCodec, int delayMs) {
@@ -711,7 +734,8 @@
mDeviceInventory.onReportNewRoutes();
}
break;
- case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE:
+ case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED:
+ case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED:
synchronized (mDeviceStateLock) {
mDeviceInventory.onSetA2dpSinkConnectionState(
(BtHelper.BluetoothA2dpDeviceInfo) msg.obj, msg.arg1);
@@ -836,7 +860,8 @@
}
}
break;
- case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT: {
+ case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION:
+ case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION: {
final BtDeviceConnectionInfo info = (BtDeviceConnectionInfo) msg.obj;
AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
"setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent "
@@ -887,7 +912,7 @@
private static final int MSG_I_BROADCAST_BT_CONNECTION_STATE = 3;
private static final int MSG_IIL_SET_FORCE_USE = 4;
private static final int MSG_IIL_SET_FORCE_BT_A2DP_USE = 5;
- private static final int MSG_IL_SET_A2DP_SINK_CONNECTION_STATE = 6;
+ private static final int MSG_TOGGLE_HDMI = 6;
private static final int MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE = 7;
private static final int MSG_IL_SET_HEARING_AID_CONNECTION_STATE = 8;
private static final int MSG_BT_HEADSET_CNCT_FAILED = 9;
@@ -898,7 +923,6 @@
private static final int MSG_II_SET_HEARING_AID_VOLUME = 14;
private static final int MSG_I_SET_AVRCP_ABSOLUTE_VOLUME = 15;
private static final int MSG_I_DISCONNECT_BT_SCO = 16;
- private static final int MSG_TOGGLE_HDMI = 17;
private static final int MSG_L_A2DP_ACTIVE_DEVICE_CHANGE = 18;
private static final int MSG_DISCONNECT_A2DP = 19;
private static final int MSG_DISCONNECT_A2DP_SINK = 20;
@@ -908,25 +932,30 @@
private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_A2DP_SINK = 24;
private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_HEARING_AID = 25;
private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_HEADSET = 26;
+ private static final int MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED = 27;
+ private static final int MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED = 28;
// process external command to (dis)connect an A2DP device
- private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT = 27;
+ private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION = 29;
+ private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION = 30;
// process external command to (dis)connect a hearing aid device
- private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 28;
+ private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 31;
// a ScoClient died in BtHelper
- private static final int MSG_L_SCOCLIENT_DIED = 29;
+ private static final int MSG_L_SCOCLIENT_DIED = 32;
private static boolean isMessageHandledUnderWakelock(int msgId) {
switch(msgId) {
case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE:
- case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE:
+ case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED:
+ case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED:
case MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE:
case MSG_IL_SET_HEARING_AID_CONNECTION_STATE:
case MSG_IL_BTA2DP_DOCK_TIMEOUT:
case MSG_L_A2DP_DEVICE_CONFIG_CHANGE:
case MSG_TOGGLE_HDMI:
case MSG_L_A2DP_ACTIVE_DEVICE_CHANGE:
- case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT:
+ case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION:
+ case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION:
case MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT:
return true;
default:
@@ -1007,7 +1036,8 @@
switch (msg) {
case MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE:
- case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE:
+ case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED:
+ case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED:
case MSG_IL_SET_HEARING_AID_CONNECTION_STATE:
case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE:
case MSG_IL_BTA2DP_DOCK_TIMEOUT:
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index a9a8ef2..90973a8 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -41,14 +41,16 @@
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
/**
* Class to manage the inventory of all connected devices.
* This class is thread-safe.
+ * (non final for mocking/spying)
*/
-public final class AudioDeviceInventory {
+public class AudioDeviceInventory {
private static final String TAG = "AS.AudioDeviceInventory";
@@ -56,11 +58,7 @@
// Key for map created from DeviceInfo.makeDeviceListKey()
private final ArrayMap<String, DeviceInfo> mConnectedDevices = new ArrayMap<>();
- private final @NonNull AudioDeviceBroker mDeviceBroker;
-
- AudioDeviceInventory(@NonNull AudioDeviceBroker broker) {
- mDeviceBroker = broker;
- }
+ private @NonNull AudioDeviceBroker mDeviceBroker;
// cache of the address of the last dock the device was connected to
private String mDockAddress;
@@ -70,6 +68,20 @@
final RemoteCallbackList<IAudioRoutesObserver> mRoutesObservers =
new RemoteCallbackList<IAudioRoutesObserver>();
+ /*package*/ AudioDeviceInventory(@NonNull AudioDeviceBroker broker) {
+ mDeviceBroker = broker;
+ }
+
+ //-----------------------------------------------------------
+ /** for mocking only */
+ /*package*/ AudioDeviceInventory() {
+ mDeviceBroker = null;
+ }
+
+ /*package*/ void setDeviceBroker(@NonNull AudioDeviceBroker broker) {
+ mDeviceBroker = broker;
+ }
+
//------------------------------------------------------------
/**
* Class to store info about connected devices.
@@ -146,8 +158,10 @@
}
}
+ // only public for mocking/spying
@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
- /*package*/ void onSetA2dpSinkConnectionState(@NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo,
+ @VisibleForTesting
+ public void onSetA2dpSinkConnectionState(@NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo,
@AudioService.BtProfileConnectionState int state) {
final BluetoothDevice btDevice = btInfo.getBtDevice();
int a2dpVolume = btInfo.getVolume();
@@ -159,30 +173,40 @@
if (!BluetoothAdapter.checkBluetoothAddress(address)) {
address = "";
}
- AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
- "A2DP sink connected: device addr=" + address + " state=" + state
- + " vol=" + a2dpVolume));
final int a2dpCodec = btInfo.getCodec();
+ AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
+ "A2DP sink connected: device addr=" + address + " state=" + state
+ + " codec=" + a2dpCodec
+ + " vol=" + a2dpVolume));
+
synchronized (mConnectedDevices) {
final String key = DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
btDevice.getAddress());
final DeviceInfo di = mConnectedDevices.get(key);
boolean isConnected = di != null;
- if (isConnected && state != BluetoothProfile.STATE_CONNECTED) {
- if (btDevice.isBluetoothDock()) {
- if (state == BluetoothProfile.STATE_DISCONNECTED) {
- // introduction of a delay for transient disconnections of docks when
- // power is rapidly turned off/on, this message will be canceled if
- // we reconnect the dock under a preset delay
- makeA2dpDeviceUnavailableLater(address,
- AudioDeviceBroker.BTA2DP_DOCK_TIMEOUT_MS);
- // the next time isConnected is evaluated, it will be false for the dock
+ if (isConnected) {
+ if (state == BluetoothProfile.STATE_CONNECTED) {
+ // device is already connected, but we are receiving a connection again,
+ // it could be for a codec change
+ if (a2dpCodec != di.mDeviceCodecFormat) {
+ mDeviceBroker.postBluetoothA2dpDeviceConfigChange(btDevice);
}
} else {
- makeA2dpDeviceUnavailableNow(address, di.mDeviceCodecFormat);
+ if (btDevice.isBluetoothDock()) {
+ if (state == BluetoothProfile.STATE_DISCONNECTED) {
+ // introduction of a delay for transient disconnections of docks when
+ // power is rapidly turned off/on, this message will be canceled if
+ // we reconnect the dock under a preset delay
+ makeA2dpDeviceUnavailableLater(address,
+ AudioDeviceBroker.BTA2DP_DOCK_TIMEOUT_MS);
+ // the next time isConnected is evaluated, it will be false for the dock
+ }
+ } else {
+ makeA2dpDeviceUnavailableNow(address, di.mDeviceCodecFormat);
+ }
}
} else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) {
if (btDevice.isBluetoothDock()) {
@@ -282,11 +306,9 @@
+ " event=" + BtHelper.a2dpDeviceEventToString(event)));
synchronized (mConnectedDevices) {
- //TODO original CL is not consistent between BluetoothDevice and BluetoothA2dpDeviceInfo
- // for this type of message
if (mDeviceBroker.hasScheduledA2dpSinkConnectionState(btDevice)) {
AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(
- "A2dp config change ignored"));
+ "A2dp config change ignored (scheduled connection change)"));
return;
}
final String key = DeviceInfo.makeDeviceListKey(
@@ -534,8 +556,10 @@
return mCurAudioRoutes;
}
+ // only public for mocking/spying
@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
- /*package*/ void setBluetoothA2dpDeviceConnectionState(
+ @VisibleForTesting
+ public void setBluetoothA2dpDeviceConnectionState(
@NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state,
int profile, boolean suppressNoisyIntent, int musicDevice, int a2dpVolume) {
int delay;
@@ -544,9 +568,12 @@
}
synchronized (mConnectedDevices) {
if (profile == BluetoothProfile.A2DP && !suppressNoisyIntent) {
- int intState = (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0;
+ @AudioService.ConnectionState int asState =
+ (state == BluetoothA2dp.STATE_CONNECTED)
+ ? AudioService.CONNECTION_STATE_CONNECTED
+ : AudioService.CONNECTION_STATE_DISCONNECTED;
delay = checkSendBecomingNoisyIntentInt(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
- intState, musicDevice);
+ asState, musicDevice);
} else {
delay = 0;
}
@@ -785,7 +812,7 @@
return 0;
}
mDeviceBroker.postBroadcastBecomingNoisy();
- delay = 1000;
+ delay = AudioService.BECOMING_NOISY_DELAY_MS;
}
return delay;
@@ -943,4 +970,21 @@
intent.putExtra(AudioManager.EXTRA_MAX_CHANNEL_COUNT, maxChannels);
}
}
+
+ //----------------------------------------------------------
+ // For tests only
+
+ /**
+ * Check if device is in the list of connected devices
+ * @param device
+ * @return true if connected
+ */
+ @VisibleForTesting
+ public boolean isA2dpDeviceConnected(@NonNull BluetoothDevice device) {
+ final String key = DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
+ device.getAddress());
+ synchronized (mConnectedDevices) {
+ return (mConnectedDevices.get(key) != null);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 7458bee..5bc2261 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -128,6 +128,7 @@
import android.widget.Toast;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.Preconditions;
import com.android.server.EventLogTags;
@@ -190,6 +191,13 @@
private static final int UNMUTE_STREAM_DELAY = 350;
/**
+ * Delay before disconnecting a device that would cause BECOMING_NOISY intent to be sent,
+ * to give a chance to applications to pause.
+ */
+ @VisibleForTesting
+ public static final int BECOMING_NOISY_DELAY_MS = 1000;
+
+ /**
* Only used in the result from {@link #checkForRingerModeChange(int, int, int)}
*/
private static final int FLAG_ADJUST_VOLUME = 1;
@@ -3950,7 +3958,9 @@
|| adjust == AudioManager.ADJUST_TOGGLE_MUTE;
}
- /*package*/ boolean isInCommunication() {
+ /** only public for mocking/spying, do not call outside of AudioService */
+ @VisibleForTesting
+ public boolean isInCommunication() {
boolean IsInCall = false;
TelecomManager telecomManager =
@@ -4119,7 +4129,9 @@
return false;
}
- /*package*/ int getDeviceForStream(int stream) {
+ /** only public for mocking/spying, do not call outside of AudioService */
+ @VisibleForTesting
+ public int getDeviceForStream(int stream) {
int device = getDevicesForStream(stream);
if ((device & (device - 1)) != 0) {
// Multiple device selection is either:
@@ -4164,7 +4176,9 @@
}
}
- /*package*/ void postObserveDevicesForAllStreams() {
+ /** only public for mocking/spying, do not call outside of AudioService */
+ @VisibleForTesting
+ public void postObserveDevicesForAllStreams() {
sendMsg(mAudioHandler,
MSG_OBSERVE_DEVICES_FOR_ALL_STREAMS,
SENDMSG_QUEUE, 0 /*arg1*/, 0 /*arg2*/, null /*obj*/,
@@ -4275,7 +4289,9 @@
AudioSystem.DEVICE_OUT_ALL_USB |
AudioSystem.DEVICE_OUT_HDMI;
- /*package*/ void postAccessoryPlugMediaUnmute(int newDevice) {
+ /** only public for mocking/spying, do not call outside of AudioService */
+ @VisibleForTesting
+ public void postAccessoryPlugMediaUnmute(int newDevice) {
sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE,
newDevice, 0, null, 0);
}
@@ -4825,7 +4841,9 @@
}
}
- /*package*/ void postSetVolumeIndexOnDevice(int streamType, int vssVolIndex, int device,
+ /** only public for mocking/spying, do not call outside of AudioService */
+ @VisibleForTesting
+ public void postSetVolumeIndexOnDevice(int streamType, int vssVolIndex, int device,
String caller) {
sendMsg(mAudioHandler,
MSG_SET_DEVICE_STREAM_VOLUME,
@@ -5183,7 +5201,9 @@
* @return true if there is currently a registered dynamic mixing policy that affects media
* and is not a render + loopback policy
*/
- /*package*/ boolean hasMediaDynamicPolicy() {
+ // only public for mocking/spying
+ @VisibleForTesting
+ public boolean hasMediaDynamicPolicy() {
synchronized (mAudioPolicies) {
if (mAudioPolicies.isEmpty()) {
return false;
@@ -5516,7 +5536,9 @@
return mMediaFocusControl.getFocusRampTimeMs(focusGain, attr);
}
- /*package*/ boolean hasAudioFocusUsers() {
+ /** only public for mocking/spying, do not call outside of AudioService */
+ @VisibleForTesting
+ public boolean hasAudioFocusUsers() {
return mMediaFocusControl.hasAudioFocusUsers();
}
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index 1a63f8f..9f1a6bd 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -139,6 +139,12 @@
public int getCodec() {
return mCodec;
}
+
+ // redefine equality op so we can match messages intended for this device
+ @Override
+ public boolean equals(Object o) {
+ return mBtDevice.equals(o);
+ }
}
// A2DP device events
@@ -441,9 +447,9 @@
return;
}
final BluetoothDevice btDevice = deviceList.get(0);
- final @BluetoothProfile.BtProfileState int state = mA2dp.getConnectionState(btDevice);
- mDeviceBroker.handleSetA2dpSinkConnectionState(
- state, new BluetoothA2dpDeviceInfo(btDevice));
+ // the device is guaranteed CONNECTED
+ mDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(btDevice,
+ BluetoothA2dp.STATE_CONNECTED, BluetoothProfile.A2DP_SINK, true, -1);
}
/*package*/ synchronized void onA2dpSinkProfileConnected(BluetoothProfile profile) {
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index 5b04379..8d1a802 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -16,6 +16,7 @@
package com.android.server.connectivity;
+import android.annotation.NonNull;
import android.content.Context;
import android.net.IDnsResolver;
import android.net.INetd;
@@ -116,7 +117,7 @@
// not, ConnectivityService disconnects the NetworkAgent's AsyncChannel.
public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
- public NetworkInfo networkInfo;
+ @NonNull public NetworkInfo networkInfo;
// This Network object should always be used if possible, so as to encourage reuse of the
// enclosed socket factory and connection pool. Avoid creating other Network objects.
// This Network object is always valid.
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 4957eed..73d160d 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -772,7 +772,6 @@
case WifiManager.WIFI_AP_STATE_FAILED:
default:
disableWifiIpServingLocked(ifname, curState);
- mEntitlementMgr.stopProvisioningIfNeeded(TETHERING_WIFI);
break;
}
}
diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java
index 78a48da..c45a314 100644
--- a/services/core/java/com/android/server/display/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/DisplayModeDirector.java
@@ -728,6 +728,7 @@
private SensorManager mSensorManager;
private Sensor mLightSensor;
+ private LightSensorEventListener mLightSensorListener = new LightSensorEventListener();
// Take it as low brightness before valid sensor data comes
private float mAmbientLux = -1.0f;
private AmbientFilter mAmbientFilter;
@@ -907,19 +908,40 @@
mSensorManager.registerListener(mLightSensorListener,
mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler);
} else {
+ mLightSensorListener.removeCallbacks();
mSensorManager.unregisterListener(mLightSensorListener);
}
}
- private final SensorEventListener mLightSensorListener = new SensorEventListener() {
+ private final class LightSensorEventListener implements SensorEventListener {
+ final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS;
+ private float mLastSensorData;
+
@Override
public void onSensorChanged(SensorEvent event) {
- long now = SystemClock.uptimeMillis();
- mAmbientFilter.addValue(now, event.values[0]);
- mAmbientLux = mAmbientFilter.getEstimate(now);
+ mLastSensorData = event.values[0];
+ if (DEBUG) {
+ Slog.d(TAG, "On sensor changed: " + mLastSensorData);
+ }
- synchronized (mLock) {
- onBrightnessChangedLocked();
+ boolean zoneChanged = isDifferentZone(mLastSensorData, mAmbientLux);
+ if (zoneChanged && mLastSensorData < mAmbientLux) {
+ // Easier to see flicker at lower brightness environment. Forget the history to
+ // get immediate response.
+ mAmbientFilter.clear();
+ }
+
+ long now = SystemClock.uptimeMillis();
+ mAmbientFilter.addValue(now, mLastSensorData);
+
+ mHandler.removeCallbacks(mInjectSensorEventRunnable);
+ processSensorData(now);
+
+ if (zoneChanged && mLastSensorData > mAmbientLux) {
+ // Sensor may not report new event if there is no brightness change.
+ // Need to keep querying the temporal filter for the latest estimation,
+ // until enter in higher lux zone or is interrupted by a new sensor event.
+ mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS);
}
}
@@ -927,6 +949,47 @@
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// Not used.
}
+
+ public void removeCallbacks() {
+ mHandler.removeCallbacks(mInjectSensorEventRunnable);
+ }
+
+ private void processSensorData(long now) {
+ mAmbientLux = mAmbientFilter.getEstimate(now);
+
+ synchronized (mLock) {
+ onBrightnessChangedLocked();
+ }
+ }
+
+ private boolean isDifferentZone(float lux1, float lux2) {
+ for (int z = 0; z < mAmbientBrightnessThresholds.length; z++) {
+ final float boundary = mAmbientBrightnessThresholds[z];
+
+ // Test each boundary. See if the current value and the new value are at
+ // different sides.
+ if ((lux1 <= boundary && lux2 > boundary)
+ || (lux1 > boundary && lux2 <= boundary)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private Runnable mInjectSensorEventRunnable = new Runnable() {
+ @Override
+ public void run() {
+ long now = SystemClock.uptimeMillis();
+ // No need to really inject the last event into a temporal filter.
+ processSensorData(now);
+
+ // Inject next event if there is a possible zone change.
+ if (isDifferentZone(mLastSensorData, mAmbientLux)) {
+ mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS);
+ }
+ }
+ };
};
private final class ScreenStateReceiver extends BroadcastReceiver {
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 9510db0..f1f6d50 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -182,7 +182,7 @@
@IntDef({CHALLENGE_NONE,
CHALLENGE_FROM_CALLER,
CHALLENGE_INTERNAL})
- @interface ChallengeType {};
+ @interface ChallengeType {}
// Order of holding lock: mSeparateChallengeLock -> mSpManager -> this
// Do not call into ActivityManager while holding mSpManager lock.
@@ -1853,26 +1853,11 @@
return VerifyCredentialResponse.ERROR;
}
- boolean shouldReEnrollBaseZero = storedHash.type == CREDENTIAL_TYPE_PATTERN
- && storedHash.isBaseZeroPattern;
-
- byte[] credentialToVerify;
- if (shouldReEnrollBaseZero) {
- credentialToVerify = LockPatternUtils.patternByteArrayToBaseZero(credential);
- } else {
- credentialToVerify = credential;
- }
-
- response = verifyCredential(userId, storedHash, credentialToVerify,
+ response = verifyCredential(userId, storedHash, credential,
challengeType, challenge, progressCallback);
if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) {
mStrongAuth.reportSuccessfulStrongAuthUnlock(userId);
- if (shouldReEnrollBaseZero) {
- setLockCredentialInternal(credential, storedHash.type, credentialToVerify,
- DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, userId, false,
- /* isLockTiedToParent= */ false);
- }
}
return response;
@@ -1937,46 +1922,6 @@
// of unlocking the user, so yell if calling from the main thread.
StrictMode.noteDiskRead();
- if (storedHash.version == CredentialHash.VERSION_LEGACY) {
- final byte[] hash;
- if (storedHash.type == CREDENTIAL_TYPE_PATTERN) {
- hash = LockPatternUtils.patternToHash(
- LockPatternUtils.byteArrayToPattern(credential));
- } else {
- hash = mLockPatternUtils.legacyPasswordToHash(credential, userId).getBytes();
- }
- if (Arrays.equals(hash, storedHash.hash)) {
- if (storedHash.type == CREDENTIAL_TYPE_PATTERN) {
- unlockKeystore(LockPatternUtils.patternByteArrayToBaseZero(credential), userId);
- } else {
- unlockKeystore(credential, userId);
- }
- // Users with legacy credentials don't have credential-backed
- // FBE keys, so just pass through a fake token/secret
- Slog.i(TAG, "Unlocking user with fake token: " + userId);
- final byte[] fakeToken = String.valueOf(userId).getBytes();
- unlockUser(userId, fakeToken, fakeToken);
-
- // migrate credential to GateKeeper
- setLockCredentialInternal(credential, storedHash.type, null,
- storedHash.type == CREDENTIAL_TYPE_PATTERN
- ? DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
- : DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC
- /* TODO(roosa): keep the same password quality */,
- userId, false, /* isLockTiedToParent= */ false);
- if (challengeType == CHALLENGE_NONE) {
- notifyActivePasswordMetricsAvailable(storedHash.type, credential, userId);
- // Use credentials to create recoverable keystore snapshot.
- sendCredentialsOnUnlockIfRequired(storedHash.type, credential, userId);
- return VerifyCredentialResponse.OK;
- }
- // Fall through to get the auth token. Technically this should never happen,
- // as a user that had a legacy credential would have to unlock their device
- // before getting to a flow with a challenge, but supporting for consistency.
- } else {
- return VerifyCredentialResponse.ERROR;
- }
- }
GateKeeperResponse gateKeeperResponse = getGateKeeperService()
.verifyChallenge(userId, challenge, storedHash.hash, credential);
VerifyCredentialResponse response = convertResponse(gateKeeperResponse);
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
index 84ae7c7..29b8aa2 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java
@@ -77,10 +77,7 @@
private static final String SYSTEM_DIRECTORY = "/system/";
private static final String LOCK_PATTERN_FILE = "gatekeeper.pattern.key";
- private static final String BASE_ZERO_LOCK_PATTERN_FILE = "gatekeeper.gesture.key";
- private static final String LEGACY_LOCK_PATTERN_FILE = "gesture.key";
private static final String LOCK_PASSWORD_FILE = "gatekeeper.password.key";
- private static final String LEGACY_LOCK_PASSWORD_FILE = "password.key";
private static final String CHILD_PROFILE_LOCK_FILE = "gatekeeper.profile.key";
private static final String SYNTHETIC_PASSWORD_DIRECTORY = "spblob/";
@@ -96,59 +93,43 @@
@VisibleForTesting
public static class CredentialHash {
- static final int VERSION_LEGACY = 0;
- static final int VERSION_GATEKEEPER = 1;
+ /** Deprecated private static final int VERSION_LEGACY = 0; */
+ private static final int VERSION_GATEKEEPER = 1;
- private CredentialHash(byte[] hash, @CredentialType int type, int version) {
- this(hash, type, version, false /* isBaseZeroPattern */);
- }
-
- private CredentialHash(
- byte[] hash, @CredentialType int type, int version, boolean isBaseZeroPattern) {
+ private CredentialHash(byte[] hash, @CredentialType int type) {
if (type != LockPatternUtils.CREDENTIAL_TYPE_NONE) {
if (hash == null) {
- throw new RuntimeException("Empty hash for CredentialHash");
+ throw new IllegalArgumentException("Empty hash for CredentialHash");
}
} else /* type == LockPatternUtils.CREDENTIAL_TYPE_NONE */ {
if (hash != null) {
- throw new RuntimeException("None type CredentialHash should not have hash");
+ throw new IllegalArgumentException(
+ "None type CredentialHash should not have hash");
}
}
this.hash = hash;
this.type = type;
- this.version = version;
- this.isBaseZeroPattern = isBaseZeroPattern;
- }
-
- private static CredentialHash createBaseZeroPattern(byte[] hash) {
- return new CredentialHash(hash, LockPatternUtils.CREDENTIAL_TYPE_PATTERN,
- VERSION_GATEKEEPER, true /* isBaseZeroPattern */);
}
static CredentialHash create(byte[] hash, int type) {
if (type == LockPatternUtils.CREDENTIAL_TYPE_NONE) {
- throw new RuntimeException("Bad type for CredentialHash");
+ throw new IllegalArgumentException("Bad type for CredentialHash");
}
- return new CredentialHash(hash, type, VERSION_GATEKEEPER);
+ return new CredentialHash(hash, type);
}
static CredentialHash createEmptyHash() {
- return new CredentialHash(null, LockPatternUtils.CREDENTIAL_TYPE_NONE,
- VERSION_GATEKEEPER);
+ return new CredentialHash(null, LockPatternUtils.CREDENTIAL_TYPE_NONE);
}
byte[] hash;
@CredentialType int type;
- int version;
- boolean isBaseZeroPattern;
public byte[] toBytes() {
- Preconditions.checkState(!isBaseZeroPattern, "base zero patterns are not serializable");
-
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(os);
- dos.write(version);
+ dos.write(VERSION_GATEKEEPER);
dos.write(type);
if (hash != null && hash.length > 0) {
dos.writeInt(hash.length);
@@ -166,7 +147,7 @@
public static CredentialHash fromBytes(byte[] bytes) {
try {
DataInputStream is = new DataInputStream(new ByteArrayInputStream(bytes));
- int version = is.read();
+ /* int version = */ is.read();
int type = is.read();
int hashSize = is.readInt();
byte[] hash = null;
@@ -174,7 +155,7 @@
hash = new byte[hashSize];
is.readFully(hash);
}
- return new CredentialHash(hash, type, version);
+ return new CredentialHash(hash, type);
} catch (IOException e) {
throw new RuntimeException(e);
}
@@ -269,14 +250,7 @@
private CredentialHash readPasswordHashIfExists(int userId) {
byte[] stored = readFile(getLockPasswordFilename(userId));
if (!ArrayUtils.isEmpty(stored)) {
- return new CredentialHash(stored, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
- CredentialHash.VERSION_GATEKEEPER);
- }
-
- stored = readFile(getLegacyLockPasswordFilename(userId));
- if (!ArrayUtils.isEmpty(stored)) {
- return new CredentialHash(stored, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD,
- CredentialHash.VERSION_LEGACY);
+ return new CredentialHash(stored, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD);
}
return null;
}
@@ -284,39 +258,22 @@
private CredentialHash readPatternHashIfExists(int userId) {
byte[] stored = readFile(getLockPatternFilename(userId));
if (!ArrayUtils.isEmpty(stored)) {
- return new CredentialHash(stored, LockPatternUtils.CREDENTIAL_TYPE_PATTERN,
- CredentialHash.VERSION_GATEKEEPER);
- }
-
- stored = readFile(getBaseZeroLockPatternFilename(userId));
- if (!ArrayUtils.isEmpty(stored)) {
- return CredentialHash.createBaseZeroPattern(stored);
- }
-
- stored = readFile(getLegacyLockPatternFilename(userId));
- if (!ArrayUtils.isEmpty(stored)) {
- return new CredentialHash(stored, LockPatternUtils.CREDENTIAL_TYPE_PATTERN,
- CredentialHash.VERSION_LEGACY);
+ return new CredentialHash(stored, LockPatternUtils.CREDENTIAL_TYPE_PATTERN);
}
return null;
}
public CredentialHash readCredentialHash(int userId) {
CredentialHash passwordHash = readPasswordHashIfExists(userId);
- CredentialHash patternHash = readPatternHashIfExists(userId);
- if (passwordHash != null && patternHash != null) {
- if (passwordHash.version == CredentialHash.VERSION_GATEKEEPER) {
- return passwordHash;
- } else {
- return patternHash;
- }
- } else if (passwordHash != null) {
+ if (passwordHash != null) {
return passwordHash;
- } else if (patternHash != null) {
- return patternHash;
- } else {
- return CredentialHash.createEmptyHash();
}
+
+ CredentialHash patternHash = readPatternHashIfExists(userId);
+ if (patternHash != null) {
+ return patternHash;
+ }
+ return CredentialHash.createEmptyHash();
}
public void removeChildProfileLock(int userId) {
@@ -342,14 +299,11 @@
}
public boolean hasPassword(int userId) {
- return hasFile(getLockPasswordFilename(userId)) ||
- hasFile(getLegacyLockPasswordFilename(userId));
+ return hasFile(getLockPasswordFilename(userId));
}
public boolean hasPattern(int userId) {
- return hasFile(getLockPatternFilename(userId)) ||
- hasFile(getBaseZeroLockPatternFilename(userId)) ||
- hasFile(getLegacyLockPatternFilename(userId));
+ return hasFile(getLockPatternFilename(userId));
}
public boolean hasCredential(int userId) {
@@ -470,20 +424,6 @@
}
@VisibleForTesting
- String getLegacyLockPatternFilename(int userId) {
- return getLockCredentialFilePathForUser(userId, LEGACY_LOCK_PATTERN_FILE);
- }
-
- @VisibleForTesting
- String getLegacyLockPasswordFilename(int userId) {
- return getLockCredentialFilePathForUser(userId, LEGACY_LOCK_PASSWORD_FILE);
- }
-
- private String getBaseZeroLockPatternFilename(int userId) {
- return getLockCredentialFilePathForUser(userId, BASE_ZERO_LOCK_PATTERN_FILE);
- }
-
- @VisibleForTesting
String getChildProfileLockFile(int userId) {
return getLockCredentialFilePathForUser(userId, CHILD_PROFILE_LOCK_FILE);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 217c0bd..6fe924e 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -5229,7 +5229,7 @@
@Override
public void run() {
synchronized (mNotificationLock) {
- final NotificationRecord r = findNotificationByKeyLocked(mKey);
+ final NotificationRecord r = findInCurrentAndSnoozedNotificationByKeyLocked(mKey);
if (r != null) {
snoozeLocked(r);
}
@@ -5239,33 +5239,34 @@
@GuardedBy("mNotificationLock")
void snoozeLocked(NotificationRecord r) {
if (r.sbn.isGroup()) {
- final List<NotificationRecord> groupNotifications = findGroupNotificationsLocked(
+ final List<NotificationRecord> groupNotifications =
+ findCurrentAndSnoozedGroupNotificationsLocked(
r.sbn.getPackageName(), r.sbn.getGroupKey(), r.sbn.getUserId());
if (r.getNotification().isGroupSummary()) {
- // snooze summary and all children
+ // snooze all children
for (int i = 0; i < groupNotifications.size(); i++) {
- snoozeNotificationLocked(groupNotifications.get(i));
+ if (mKey != groupNotifications.get(i).getKey()) {
+ snoozeNotificationLocked(groupNotifications.get(i));
+ }
}
} else {
// if there is a valid summary for this group, and we are snoozing the only
// child, also snooze the summary
if (mSummaryByGroupKey.containsKey(r.sbn.getGroupKey())) {
- if (groupNotifications.size() != 2) {
- snoozeNotificationLocked(r);
- } else {
+ if (groupNotifications.size() == 2) {
// snooze summary and the one child
for (int i = 0; i < groupNotifications.size(); i++) {
- snoozeNotificationLocked(groupNotifications.get(i));
+ if (mKey != groupNotifications.get(i).getKey()) {
+ snoozeNotificationLocked(groupNotifications.get(i));
+ }
}
}
- } else {
- snoozeNotificationLocked(r);
}
}
- } else {
- // just snooze the one notification
- snoozeNotificationLocked(r);
}
+ // snooze the notification
+ snoozeNotificationLocked(r);
+
}
@GuardedBy("mNotificationLock")
@@ -7050,6 +7051,15 @@
}
@GuardedBy("mNotificationLock")
+ @NonNull
+ List<NotificationRecord> findCurrentAndSnoozedGroupNotificationsLocked(String pkg,
+ String groupKey, int userId) {
+ List<NotificationRecord> records = mSnoozeHelper.getNotifications(pkg, groupKey, userId);
+ records.addAll(findGroupNotificationsLocked(pkg, groupKey, userId));
+ return records;
+ }
+
+ @GuardedBy("mNotificationLock")
@NonNull List<NotificationRecord> findGroupNotificationsLocked(String pkg,
String groupKey, int userId) {
List<NotificationRecord> records = new ArrayList<>();
@@ -7059,6 +7069,15 @@
return records;
}
+ @GuardedBy("mNotificationLock")
+ private NotificationRecord findInCurrentAndSnoozedNotificationByKeyLocked(String key) {
+ NotificationRecord r = findNotificationByKeyLocked(key);
+ if (r == null) {
+ r = mSnoozeHelper.getNotification(key);
+ }
+ return r;
+
+ }
@GuardedBy("mNotificationLock")
private @NonNull List<NotificationRecord> findGroupNotificationByListLocked(
diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java
index abc9841..91f497c 100644
--- a/services/core/java/com/android/server/notification/SnoozeHelper.java
+++ b/services/core/java/com/android/server/notification/SnoozeHelper.java
@@ -17,7 +17,6 @@
import android.annotation.NonNull;
import android.app.AlarmManager;
-import android.app.Notification;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -104,6 +103,46 @@
return Collections.EMPTY_LIST;
}
+ @NonNull
+ ArrayList<NotificationRecord> getNotifications(String pkg,
+ String groupKey, Integer userId) {
+ ArrayList<NotificationRecord> records = new ArrayList<>();
+ if (mSnoozedNotifications.containsKey(userId)
+ && mSnoozedNotifications.get(userId).containsKey(pkg)) {
+ ArrayMap<String, NotificationRecord> packages =
+ mSnoozedNotifications.get(userId).get(pkg);
+ for (int i = 0; i < packages.size(); i++) {
+ String currentGroupKey = packages.valueAt(i).sbn.getGroup();
+ if (currentGroupKey.equals(groupKey)) {
+ records.add(packages.valueAt(i));
+ }
+ }
+ }
+ return records;
+ }
+
+ protected NotificationRecord getNotification(String key) {
+ List<NotificationRecord> snoozedForUser = new ArrayList<>();
+ IntArray userIds = mUserProfiles.getCurrentProfileIds();
+ if (userIds != null) {
+ final int userIdsSize = userIds.size();
+ for (int i = 0; i < userIdsSize; i++) {
+ final ArrayMap<String, ArrayMap<String, NotificationRecord>> snoozedPkgs =
+ mSnoozedNotifications.get(userIds.get(i));
+ if (snoozedPkgs != null) {
+ final int snoozedPkgsSize = snoozedPkgs.size();
+ for (int j = 0; j < snoozedPkgsSize; j++) {
+ final ArrayMap<String, NotificationRecord> records = snoozedPkgs.valueAt(j);
+ if (records != null) {
+ return records.get(key);
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
protected @NonNull List<NotificationRecord> getSnoozed() {
List<NotificationRecord> snoozedForUser = new ArrayList<>();
IntArray userIds = mUserProfiles.getCurrentProfileIds();
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 984f22f..c712431 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -281,20 +281,7 @@
mAbortIdleOptimization.set(false);
long lowStorageThreshold = getLowStorageThreshold(context);
- // Optimize primary apks.
- int result = optimizePackages(pm, pkgs, lowStorageThreshold,
- /*isForPrimaryDex=*/ true);
- if (result == OPTIMIZE_ABORT_BY_JOB_SCHEDULER) {
- return result;
- }
- if (supportSecondaryDex()) {
- result = reconcileSecondaryDexFiles(pm.getDexManager());
- if (result == OPTIMIZE_ABORT_BY_JOB_SCHEDULER) {
- return result;
- }
- result = optimizePackages(pm, pkgs, lowStorageThreshold,
- /*isForPrimaryDex=*/ false);
- }
+ int result = idleOptimizePackages(pm, pkgs, lowStorageThreshold);
return result;
}
@@ -342,11 +329,20 @@
return 0;
}
- private int optimizePackages(PackageManagerService pm, ArraySet<String> pkgs,
- long lowStorageThreshold, boolean isForPrimaryDex) {
+ private int idleOptimizePackages(PackageManagerService pm, ArraySet<String> pkgs,
+ long lowStorageThreshold) {
ArraySet<String> updatedPackages = new ArraySet<>();
try {
+ final boolean supportSecondaryDex = supportSecondaryDex();
+
+ if (supportSecondaryDex) {
+ int result = reconcileSecondaryDexFiles(pm.getDexManager());
+ if (result == OPTIMIZE_ABORT_BY_JOB_SCHEDULER) {
+ return result;
+ }
+ }
+
// Only downgrade apps when space is low on device.
// Threshold is selected above the lowStorageThreshold so that we can pro-actively clean
// up disk before user hits the actual lowStorageThreshold.
@@ -359,43 +355,61 @@
pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
Log.d(TAG, "Unsused Packages " + String.join(",", unusedPackages));
- for (String pkg : unusedPackages) {
- int abortCode = abortIdleOptimizations(/*lowStorageThreshold*/ -1);
- if (abortCode != OPTIMIZE_CONTINUE) {
- // Should be aborted by the scheduler.
- return abortCode;
- }
- if (downgradePackage(pm, pkg, isForPrimaryDex)) {
- updatedPackages.add(pkg);
- }
- }
-
if (!unusedPackages.isEmpty()) {
+ for (String pkg : unusedPackages) {
+ int abortCode = abortIdleOptimizations(/*lowStorageThreshold*/ -1);
+ if (abortCode != OPTIMIZE_CONTINUE) {
+ // Should be aborted by the scheduler.
+ return abortCode;
+ }
+ if (downgradePackage(pm, pkg, /*isForPrimaryDex*/ true)) {
+ updatedPackages.add(pkg);
+ }
+ if (supportSecondaryDex) {
+ downgradePackage(pm, pkg, /*isForPrimaryDex*/ false);
+ }
+ }
+
pkgs = new ArraySet<>(pkgs);
pkgs.removeAll(unusedPackages);
}
}
- for (String pkg : pkgs) {
- int abortCode = abortIdleOptimizations(lowStorageThreshold);
- if (abortCode != OPTIMIZE_CONTINUE) {
- // Either aborted by the scheduler or no space left.
- return abortCode;
- }
-
- boolean dexOptPerformed = optimizePackage(pm, pkg, isForPrimaryDex);
- if (dexOptPerformed) {
- updatedPackages.add(pkg);
- }
+ int primaryResult = optimizePackages(pm, pkgs, lowStorageThreshold,
+ /*isForPrimaryDex*/ true, updatedPackages);
+ if (primaryResult != OPTIMIZE_PROCESSED) {
+ return primaryResult;
}
- return OPTIMIZE_PROCESSED;
+ if (!supportSecondaryDex) {
+ return OPTIMIZE_PROCESSED;
+ }
+
+ int secondaryResult = optimizePackages(pm, pkgs, lowStorageThreshold,
+ /*isForPrimaryDex*/ false, updatedPackages);
+ return secondaryResult;
} finally {
// Always let the pinner service know about changes.
notifyPinService(updatedPackages);
}
}
+ private int optimizePackages(PackageManagerService pm, ArraySet<String> pkgs,
+ long lowStorageThreshold, boolean isForPrimaryDex, ArraySet<String> updatedPackages) {
+ for (String pkg : pkgs) {
+ int abortCode = abortIdleOptimizations(lowStorageThreshold);
+ if (abortCode != OPTIMIZE_CONTINUE) {
+ // Either aborted by the scheduler or no space left.
+ return abortCode;
+ }
+
+ boolean dexOptPerformed = optimizePackage(pm, pkg, isForPrimaryDex);
+ if (dexOptPerformed) {
+ updatedPackages.add(pkg);
+ }
+ }
+ return OPTIMIZE_PROCESSED;
+ }
/**
* Try to downgrade the package to a smaller compilation filter.
diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java
index 8f38026..5eaddf9 100644
--- a/services/core/java/com/android/server/pm/InstantAppRegistry.java
+++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java
@@ -686,7 +686,7 @@
// Prune first installed instant apps
synchronized (mService.mLock) {
- allUsers = PackageManagerService.sUserManager.getUserIds();
+ allUsers = mService.mUserManager.getUserIds();
final int packageCount = mService.mPackages.size();
for (int i = 0; i < packageCount; i++) {
diff --git a/services/core/java/com/android/server/pm/PackageAbiHelper.java b/services/core/java/com/android/server/pm/PackageAbiHelper.java
index 6f46564..c21d0cf 100644
--- a/services/core/java/com/android/server/pm/PackageAbiHelper.java
+++ b/services/core/java/com/android/server/pm/PackageAbiHelper.java
@@ -26,7 +26,7 @@
import java.util.Set;
@VisibleForTesting
-interface PackageAbiHelper {
+public interface PackageAbiHelper {
/**
* Derive and get the location of native libraries for the given package,
* which varies depending on where and how the package was installed.
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 8960dfb..89ddc15 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -92,6 +92,7 @@
import static android.os.storage.StorageManager.FLAG_STORAGE_EXTERNAL;
import static android.permission.PermissionManager.KILL_APP_REASON_GIDS_CHANGED;
+import static com.android.internal.annotations.VisibleForTesting.Visibility;
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_MANAGED_PROFILE;
import static com.android.internal.app.IntentForwarderActivity.FORWARD_INTENT_TO_PARENT;
import static com.android.internal.content.NativeLibraryHelper.LIB_DIR_NAME;
@@ -117,7 +118,6 @@
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
-import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
import android.app.IActivityManager;
@@ -314,7 +314,6 @@
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.permission.PermissionsState;
import com.android.server.policy.PermissionPolicyInternal;
-import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback;
import com.android.server.security.VerityUtils;
import com.android.server.storage.DeviceStorageMonitorInternal;
import com.android.server.utils.TimingsTraceAndSlog;
@@ -663,7 +662,7 @@
// Lock for state used when installing and doing other long running
// operations. Methods that must be called with this lock held have
// the suffix "LI".
- final Object mInstallLock = new Object();
+ final Object mInstallLock;
// ----------------------------------------------------------------
@@ -697,6 +696,9 @@
*/
boolean mPromoteSystemApps;
+ private final PackageManagerInternal mPmInternal;
+
+
@GuardedBy("mLock")
final Settings mSettings;
@@ -752,25 +754,195 @@
private final Injector mInjector;
/**
- * Unit tests will instantiate and / or extend to mock dependencies / behaviors.
+ * Unit tests will instantiate, extend and/or mock to mock dependencies / behaviors.
+ *
+ * NOTE: All getters should return the same instance for every call.
*/
- @VisibleForTesting
- static class Injector {
- private final UserManagerInternal mUserManager;
- private final PackageAbiHelper mAbiHelper;
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ public static class Injector {
- Injector(UserManagerInternal userManager, PackageAbiHelper abiHelper) {
- mUserManager = userManager;
- mAbiHelper = abiHelper;
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ interface Producer<T> {
+ /** Produce an instance of type {@link T} */
+ T produce(Injector injector, PackageManagerService packageManager);
}
- public UserManagerInternal getUserManager() {
- return mUserManager;
+ static class LocalServicesProducer<T> implements Producer<T> {
+ private final Class<T> mProducingClass;
+ LocalServicesProducer(Class<T> clazz) {
+ this.mProducingClass = clazz;
+ }
+ public T produce(Injector injector, PackageManagerService packageManager) {
+ return LocalServices.getService(mProducingClass);
+ }
+ }
+
+ static class SystemServiceProducer<T> implements Producer<T> {
+ private final Class<T> mProducingClass;
+ SystemServiceProducer(Class<T> clazz) {
+ this.mProducingClass = clazz;
+ }
+ public T produce(Injector injector, PackageManagerService packageManager) {
+ return packageManager.mContext.getSystemService(mProducingClass);
+ }
+ }
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ static class Singleton<T> {
+ private final Producer<T> mProducer;
+ private volatile T mInstance = null;
+ Singleton(Producer<T> producer) {
+ this.mProducer = producer;
+ }
+ T get(Injector injector, PackageManagerService packageManagerService) {
+ if (mInstance == null) {
+ mInstance = mProducer.produce(injector, packageManagerService);
+ }
+ return mInstance;
+ }
+ }
+
+ private PackageManagerService mPackageManager;
+
+ private final PackageAbiHelper mAbiHelper;
+ private final Context mContext;
+ private final Object mLock;
+ private final Installer mInstaller;
+ private final Object mInstallLock;
+
+ // ----- producers -----
+ private final Singleton<ComponentResolver> mComponentResolverProducer;
+ private final Singleton<PermissionManagerServiceInternal> mPermissionManagerProducer;
+ private final Singleton<UserManagerService> mUserManagerProducer;
+ private final Singleton<Settings> mSettingsProducer;
+ private final Singleton<ActivityTaskManagerInternal> mActivityTaskManagerProducer;
+ private final Singleton<DeviceIdleController.LocalService> mLocalDeviceIdleController;
+ private final Singleton<StorageManagerInternal> mStorageManagerInternalProducer;
+ private final Singleton<NetworkPolicyManagerInternal> mNetworkPolicyManagerProducer;
+ private final Singleton<PermissionPolicyInternal> mPermissionPolicyProducer;
+ private final Singleton<DeviceStorageMonitorInternal> mDeviceStorageMonitorProducer;
+ private final Singleton<DisplayManager> mDisplayManagerProducer;
+ private final Singleton<StorageManager> mStorageManagerProducer;
+ private final Singleton<AppOpsManager> mAppOpsManagerProducer;
+
+ Injector(Context context, Object lock, Installer installer,
+ Object installLock, PackageAbiHelper abiHelper,
+ Producer<ComponentResolver> componentResolverProducer,
+ Producer<PermissionManagerServiceInternal> permissionManagerProducer,
+ Producer<UserManagerService> userManagerProducer,
+ Producer<Settings> settingsProducer,
+ Producer<ActivityTaskManagerInternal> activityTaskManagerProducer,
+ Producer<DeviceIdleController.LocalService> deviceIdleControllerProducer,
+ Producer<StorageManagerInternal> storageManagerInternalProducer,
+ Producer<NetworkPolicyManagerInternal> networkPolicyManagerProducer,
+ Producer<PermissionPolicyInternal> permissionPolicyProvider,
+ Producer<DeviceStorageMonitorInternal> deviceStorageMonitorProducer,
+ Producer<DisplayManager> displayManagerProducer,
+ Producer<StorageManager> storageManagerProducer,
+ Producer<AppOpsManager> appOpsManagerProducer) {
+ mContext = context;
+ mLock = lock;
+ mInstaller = installer;
+ mAbiHelper = abiHelper;
+ mInstallLock = installLock;
+ mComponentResolverProducer = new Singleton<>(componentResolverProducer);
+ mPermissionManagerProducer = new Singleton<>(permissionManagerProducer);
+ mUserManagerProducer = new Singleton<>(userManagerProducer);
+ mSettingsProducer = new Singleton<>(settingsProducer);
+ mActivityTaskManagerProducer = new Singleton<>(activityTaskManagerProducer);
+ mLocalDeviceIdleController = new Singleton<>(deviceIdleControllerProducer);
+ mStorageManagerInternalProducer = new Singleton<>(storageManagerInternalProducer);
+ mNetworkPolicyManagerProducer = new Singleton<>(networkPolicyManagerProducer);
+ mPermissionPolicyProducer = new Singleton<>(permissionPolicyProvider);
+ mDeviceStorageMonitorProducer = new Singleton<>(deviceStorageMonitorProducer);
+ mDisplayManagerProducer = new Singleton<>(displayManagerProducer);
+ mStorageManagerProducer = new Singleton<>(storageManagerProducer);
+ mAppOpsManagerProducer = new Singleton<>(appOpsManagerProducer);
+ }
+
+ /**
+ * Bootstraps this injector with the {@link PackageManagerService instance to which it
+ * belongs.
+ */
+ public void bootstrap(PackageManagerService pm) {
+ this.mPackageManager = pm;
+ }
+
+ public UserManagerInternal getUserManagerInternal() {
+ return getUserManagerService().getInternalForInjectorOnly();
}
public PackageAbiHelper getAbiHelper() {
return mAbiHelper;
}
+
+ public Object getInstallLock() {
+ return mInstallLock;
+ }
+
+ public UserManagerService getUserManagerService() {
+ return mUserManagerProducer.get(this, mPackageManager);
+ }
+
+ public Object getLock() {
+ return mLock;
+ }
+
+ public Installer getInstaller() {
+ return mInstaller;
+ }
+
+ public ComponentResolver getComponentResolver() {
+ return mComponentResolverProducer.get(this, mPackageManager);
+ }
+
+ public PermissionManagerServiceInternal getPermissionManagerServiceInternal() {
+ return mPermissionManagerProducer.get(this, mPackageManager);
+ }
+
+ public Context getContext() {
+ return mContext;
+ }
+
+ public Settings getSettings() {
+ return mSettingsProducer.get(this, mPackageManager);
+ }
+
+ public ActivityTaskManagerInternal getActivityTaskManagerInternal() {
+ return mActivityTaskManagerProducer.get(this, mPackageManager);
+ }
+
+ public DeviceIdleController.LocalService getLocalDeviceIdleController() {
+ return mLocalDeviceIdleController.get(this, mPackageManager);
+ }
+
+ public StorageManagerInternal getStorageManagerInternal() {
+ return mStorageManagerInternalProducer.get(this, mPackageManager);
+ }
+
+ public NetworkPolicyManagerInternal getNetworkPolicyManagerInternal() {
+ return mNetworkPolicyManagerProducer.get(this, mPackageManager);
+ }
+
+ public PermissionPolicyInternal getPermissionPolicyInternal() {
+ return mPermissionPolicyProducer.get(this, mPackageManager);
+ }
+
+ public DeviceStorageMonitorInternal getDeviceStorageMonitorInternal() {
+ return mDeviceStorageMonitorProducer.get(this, mPackageManager);
+ }
+
+ public DisplayManager getDisplayManager() {
+ return mDisplayManagerProducer.get(this, mPackageManager);
+ }
+
+ public StorageManager getStorageManager() {
+ return mStorageManagerProducer.get(this, mPackageManager);
+ }
+
+ public AppOpsManager getAppOpsManager() {
+ return mAppOpsManagerProducer.get(this, mPackageManager);
+ }
}
private final AppsFilter mAppsFilter;
@@ -987,13 +1159,6 @@
// List of packages names to keep cached, even if they are uninstalled for all users
private List<String> mKeepUninstalledPackages;
- private UserManagerInternal mUserManagerInternal;
- private ActivityManagerInternal mActivityManagerInternal;
- private ActivityTaskManagerInternal mActivityTaskManagerInternal;
- private StorageManagerInternal mStorageManagerInternal;
-
- private DeviceIdleController.LocalService mDeviceIdleController;
-
private File mCacheDir;
private Future<?> mPrepareAppDataFuture;
@@ -1084,7 +1249,8 @@
final BroadcastOptions options = BroadcastOptions.makeBasic();
options.setTemporaryAppWhitelistDuration(whitelistTimeout);
- DeviceIdleController.LocalService idleController = getDeviceIdleController();
+ DeviceIdleController.LocalService idleController =
+ mInjector.getLocalDeviceIdleController();
idleController.addPowerSaveTempWhitelistApp(Process.myUid(),
mIntentFilterVerifierComponent.getPackageName(), whitelistTimeout,
UserHandle.USER_SYSTEM, true, "intent filter verifier");
@@ -1351,7 +1517,7 @@
private static final long DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD =
2 * 60 * 60 * 1000L; /* two hours */
- static UserManagerService sUserManager;
+ UserManagerService mUserManager;
// Stores a list of users whose package restrictions file needs to be updated
private ArraySet<Integer> mDirtyUsers = new ArraySet<>();
@@ -1948,8 +2114,7 @@
// Send broadcast package appeared if external for all users
if (isExternal(res.pkg)) {
if (!update) {
- final StorageManager storage =
- mContext.getSystemService(StorageManager.class);
+ final StorageManager storage = mInjector.getStorageManager();
VolumeInfo volume =
storage.findVolumeByUuid(
res.pkg.applicationInfo.storageUuid.toString());
@@ -2140,7 +2305,7 @@
// Clean up any users or apps that were removed or recreated
// while this volume was missing
- sUserManager.reconcileUsers(volumeUuid);
+ mUserManager.reconcileUsers(volumeUuid);
reconcileApps(volumeUuid);
// Clean up any install sessions that expired or were
@@ -2225,9 +2390,9 @@
void scheduleWritePackageRestrictionsLocked(int userId) {
final int[] userIds = (userId == UserHandle.USER_ALL)
- ? sUserManager.getUserIds() : new int[]{userId};
+ ? mUserManager.getUserIds() : new int[]{userId};
for (int nextUserId : userIds) {
- if (!sUserManager.exists(nextUserId)) return;
+ if (!mUserManager.exists(nextUserId)) return;
mDirtyUsers.add(nextUserId);
if (!mHandler.hasMessages(WRITE_PACKAGE_RESTRICTIONS)) {
mHandler.sendEmptyMessageDelayed(WRITE_PACKAGE_RESTRICTIONS, WRITE_SETTINGS_DELAY);
@@ -2239,10 +2404,39 @@
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
- final Object packageLock = new Object();
+ final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",
+ Trace.TRACE_TAG_PACKAGE_MANAGER);
+ t.traceBegin("create package manager");
+ final Object lock = new Object();
+ final Object installLock = new Object();
- PackageManagerService m = new PackageManagerService(context, installer,
- factoryTest, onlyCore, packageLock);
+ Injector injector = new Injector(
+ context, lock, installer, installLock, new PackageAbiHelperImpl(),
+ (i, pm) ->
+ new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock),
+ (i, pm) ->
+ PermissionManagerService.create(context, lock),
+ (i, pm) ->
+ new UserManagerService(context, pm,
+ new UserDataPreparer(installer, installLock, context, onlyCore),
+ lock),
+ (i, pm) ->
+ new Settings(Environment.getDataDirectory(),
+ i.getPermissionManagerServiceInternal().getPermissionSettings(),
+ lock),
+ new Injector.LocalServicesProducer<>(ActivityTaskManagerInternal.class),
+ new Injector.LocalServicesProducer<>(DeviceIdleController.LocalService.class),
+ new Injector.LocalServicesProducer<>(StorageManagerInternal.class),
+ new Injector.LocalServicesProducer<>(NetworkPolicyManagerInternal.class),
+ new Injector.LocalServicesProducer<>(PermissionPolicyInternal.class),
+ new Injector.LocalServicesProducer<>(DeviceStorageMonitorInternal.class),
+ new Injector.SystemServiceProducer<>(DisplayManager.class),
+ new Injector.SystemServiceProducer<>(StorageManager.class),
+ new Injector.SystemServiceProducer<>(AppOpsManager.class));
+
+ PackageManagerService m = new PackageManagerService(injector, factoryTest, onlyCore);
+ t.traceEnd(); // "create package manager"
+
m.enableSystemUserPackages();
ServiceManager.addService("package", m);
final PackageManagerNative pmn = m.new PackageManagerNative();
@@ -2294,9 +2488,8 @@
}
}
- private static void getDefaultDisplayMetrics(Context context, DisplayMetrics metrics) {
- DisplayManager displayManager = (DisplayManager) context.getSystemService(
- Context.DISPLAY_SERVICE);
+ private static void getDefaultDisplayMetrics(
+ DisplayManager displayManager, DisplayMetrics metrics) {
displayManager.getDisplay(Display.DEFAULT_DISPLAY).getMetrics(metrics);
}
@@ -2333,12 +2526,13 @@
}
}
- public PackageManagerService(Context context, Installer installer, boolean factoryTest,
- boolean onlyCore, Object packageLock) {
+ public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",
Trace.TRACE_TAG_PACKAGE_MANAGER);
- t.traceBegin("create package manager");
- mLock = packageLock;
+ mInjector = injector;
+ mInjector.bootstrap(this);
+ mLock = injector.getLock();
+ mInstallLock = injector.getInstallLock();
LockGuard.installLock(mLock, LockGuard.INDEX_PACKAGES);
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
SystemClock.uptimeMillis());
@@ -2347,38 +2541,24 @@
Slog.w(TAG, "**** ro.build.version.sdk not set!");
}
- mContext = context;
+ mContext = injector.getContext();
mFactoryTest = factoryTest;
mOnlyCore = onlyCore;
mMetrics = new DisplayMetrics();
- mInstaller = installer;
+ mInstaller = injector.getInstaller();
// Create sub-components that provide services / data. Order here is important.
t.traceBegin("createSubComponents");
- // CHECKSTYLE:OFF IndentationCheck
- synchronized (mInstallLock) {
- synchronized (mLock) {
- // Expose private service for system components to use.
- LocalServices.addService(
- PackageManagerInternal.class, new PackageManagerInternalImpl());
- sUserManager = new UserManagerService(context, this,
- new UserDataPreparer(mInstaller, mInstallLock, mContext, mOnlyCore),
- mLock);
- mComponentResolver = new ComponentResolver(sUserManager,
- LocalServices.getService(PackageManagerInternal.class),
- mLock);
- mPermissionManager = PermissionManagerService.create(context,
- mLock /*externalLock*/);
- mPermissionManagerService =
- (IPermissionManager) ServiceManager.getService("permissionmgr");
- mSettings = new Settings(Environment.getDataDirectory(),
- mPermissionManager.getPermissionSettings(), mLock);
- }
- }
- // TODO(b/137961986): We should pass this via constructor, but would first need to create
- // a packages lock that could also be passed in.
- mInjector = new Injector(getUserManagerInternal(), new PackageAbiHelperImpl());
+ // Expose private service for system components to use.
+ mPmInternal = new PackageManagerInternalImpl();
+ LocalServices.addService(PackageManagerInternal.class, mPmInternal);
+ mUserManager = injector.getUserManagerService();
+ mComponentResolver = injector.getComponentResolver();
+ mPermissionManager = injector.getPermissionManagerServiceInternal();
+ mSettings = injector.getSettings();
+ mPermissionManagerService = (IPermissionManager) ServiceManager.getService("permissionmgr");
+
// CHECKSTYLE:ON IndentationCheck
t.traceEnd();
@@ -2418,15 +2598,16 @@
mSeparateProcesses = null;
}
- mPackageDexOptimizer = new PackageDexOptimizer(installer, mInstallLock, context,
+ mPackageDexOptimizer = new PackageDexOptimizer(mInstaller, mInstallLock, mContext,
"*dexopt*");
- mDexManager = new DexManager(mContext, this, mPackageDexOptimizer, installer, mInstallLock);
- mArtManagerService = new ArtManagerService(mContext, this, installer, mInstallLock);
+ mDexManager =
+ new DexManager(mContext, this, mPackageDexOptimizer, mInstaller, mInstallLock);
+ mArtManagerService = new ArtManagerService(mContext, this, mInstaller, mInstallLock);
mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper());
mViewCompiler = new ViewCompiler(mInstallLock, mInstaller);
- getDefaultDisplayMetrics(context, mMetrics);
+ getDefaultDisplayMetrics(mInjector.getDisplayManager(), mMetrics);
t.traceBegin("get system config");
SystemConfig systemConfig = SystemConfig.getInstance();
@@ -2435,8 +2616,8 @@
mProtectedPackages = new ProtectedPackages(mContext);
- mApexManager = ApexManager.create(context);
- mAppsFilter = AppsFilter.create(context);
+ mApexManager = ApexManager.create(mContext);
+ mAppsFilter = AppsFilter.create(mContext);
// CHECKSTYLE:OFF IndentationCheck
synchronized (mInstallLock) {
@@ -2482,7 +2663,7 @@
t.traceEnd();
t.traceBegin("read user settings");
- mFirstBoot = !mSettings.readLPw(sUserManager.getUsers(false));
+ mFirstBoot = !mSettings.readLPw(mUserManager.getUsers(false));
t.traceEnd();
// Clean up orphaned packages for which the code path doesn't exist
@@ -3136,8 +3317,8 @@
// If this is the first boot or an update from pre-M, and it is a normal
// boot, then we need to initialize the default preferred apps across
// all defined users.
- if (!onlyCore && (mPromoteSystemApps || mFirstBoot)) {
- for (UserInfo user : sUserManager.getUsers(true)) {
+ if (!mOnlyCore && (mPromoteSystemApps || mFirstBoot)) {
+ for (UserInfo user : mUserManager.getUsers(true)) {
mSettings.applyDefaultPreferredAppsLPw(user.id);
primeDomainVerificationsLPw(user.id);
}
@@ -3197,7 +3378,7 @@
// Note that we do *not* clear the application profiles. These remain valid
// across OTAs and are used to drive profile verification (post OTA) and
// profile compilation (without waiting to collect a fresh set of profiles).
- if (mIsUpgrade && !onlyCore) {
+ if (mIsUpgrade && !mOnlyCore) {
Slog.i(TAG, "Build fingerprint changed; clearing code caches");
for (int i = 0; i < mSettings.mPackages.size(); i++) {
final PackageSetting ps = mSettings.mPackages.valueAt(i);
@@ -3214,7 +3395,7 @@
// Grandfather existing (installed before Q) non-system apps to hide
// their icons in launcher.
- if (!onlyCore && mIsPreQUpgrade) {
+ if (!mOnlyCore && mIsPreQUpgrade) {
Slog.i(TAG, "Whitelisting all existing apps to hide their icons");
int size = mSettings.mPackages.size();
for (int i = 0; i < size; i++) {
@@ -3286,7 +3467,7 @@
}
}
- mInstallerService = new PackageInstallerService(context, this, mApexManager);
+ mInstallerService = new PackageInstallerService(mContext, this, mApexManager);
final Pair<ComponentName, String> instantAppResolverComponent =
getInstantAppResolverLPr();
if (instantAppResolverComponent != null) {
@@ -3342,8 +3523,6 @@
PackageParser.readConfigUseRoundIcon(mContext.getResources());
mServiceStartWithDelay = SystemClock.uptimeMillis() + (60 * 1000L);
-
- t.traceEnd(); // "create package manager"
}
/**
@@ -4025,7 +4204,7 @@
}
private PackageInfo generatePackageInfo(PackageSetting ps, int flags, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
if (ps == null) {
return null;
}
@@ -4128,7 +4307,7 @@
@Override
public boolean isPackageAvailable(String packageName, int userId) {
- if (!sUserManager.exists(userId)) return false;
+ if (!mUserManager.exists(userId)) return false;
final int callingUid = Binder.getCallingUid();
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
false /*requireFullPermission*/, false /*checkShell*/, "is package available");
@@ -4171,7 +4350,7 @@
*/
private PackageInfo getPackageInfoInternal(String packageName, long versionCode,
int flags, int filterCallingUid, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
flags = updateFlagsForPackage(flags, userId, packageName);
mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId,
false /* requireFullPermission */, false /* checkShell */, "get package info");
@@ -4472,7 +4651,7 @@
@Override
public int getPackageUid(String packageName, int flags, int userId) {
- if (!sUserManager.exists(userId)) return -1;
+ if (!mUserManager.exists(userId)) return -1;
final int callingUid = Binder.getCallingUid();
flags = updateFlagsForPackage(flags, userId, packageName);
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
@@ -4502,7 +4681,7 @@
@Override
public int[] getPackageGids(String packageName, int flags, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
final int callingUid = Binder.getCallingUid();
flags = updateFlagsForPackage(flags, userId, packageName);
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
@@ -4546,7 +4725,7 @@
@GuardedBy("mLock")
private ApplicationInfo generateApplicationInfoFromSettingsLPw(String packageName, int flags,
int filterCallingUid, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps != null) {
if (filterSharedLibPackageLPr(ps, filterCallingUid, userId, flags)) {
@@ -4585,7 +4764,7 @@
*/
private ApplicationInfo getApplicationInfoInternal(String packageName, int flags,
int filterCallingUid, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
flags = updateFlagsForApplication(flags, userId, packageName);
if (!isRecentsAccessingChildProfiles(Binder.getCallingUid(), userId)) {
@@ -4699,7 +4878,7 @@
* until the requested bytes are available.
*/
public void freeStorage(String volumeUuid, long bytes, int storageFlags) throws IOException {
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final StorageManager storage = mInjector.getStorageManager();
final File file = storage.findPathForUuid(volumeUuid);
if (file.getUsableSpace() >= bytes) return;
@@ -4782,14 +4961,14 @@
private boolean pruneUnusedStaticSharedLibraries(long neededSpace, long maxCachePeriod)
throws IOException {
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final StorageManager storage = mInjector.getStorageManager();
final File volume = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL);
List<VersionedPackage> packagesToDelete = null;
final long now = System.currentTimeMillis();
synchronized (mLock) {
- final int[] allUsers = sUserManager.getUserIds();
+ final int[] allUsers = mUserManager.getUserIds();
final int libCount = mSharedLibraries.size();
for (int i = 0; i < libCount; i++) {
final LongSparseArray<SharedLibraryInfo> versionedLib
@@ -4861,7 +5040,7 @@
// give them what they want
} else {
// Caller expressed no opinion, so match based on user state
- if (getUserManagerInternal().isUserUnlockingOrUnlocked(userId)) {
+ if (mUserManager.isUserUnlockingOrUnlocked(userId)) {
flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE;
} else {
flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE;
@@ -4870,43 +5049,6 @@
return flags;
}
- private UserManagerInternal getUserManagerInternal() {
- if (mUserManagerInternal == null) {
- mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
- }
- return mUserManagerInternal;
- }
-
- private ActivityManagerInternal getActivityManagerInternal() {
- if (mActivityManagerInternal == null) {
- mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
- }
- return mActivityManagerInternal;
- }
-
- private ActivityTaskManagerInternal getActivityTaskManagerInternal() {
- if (mActivityTaskManagerInternal == null) {
- mActivityTaskManagerInternal =
- LocalServices.getService(ActivityTaskManagerInternal.class);
- }
- return mActivityTaskManagerInternal;
- }
-
- private DeviceIdleController.LocalService getDeviceIdleController() {
- if (mDeviceIdleController == null) {
- mDeviceIdleController =
- LocalServices.getService(DeviceIdleController.LocalService.class);
- }
- return mDeviceIdleController;
- }
-
- private StorageManagerInternal getStorageManagerInternal() {
- if (mStorageManagerInternal == null) {
- mStorageManagerInternal = LocalServices.getService(StorageManagerInternal.class);
- }
- return mStorageManagerInternal;
- }
-
/**
* Update given flags when being used to request {@link PackageInfo}.
*/
@@ -4921,7 +5063,7 @@
"MATCH_ANY_USER flag requires INTERACT_ACROSS_USERS permission at "
+ Debug.getCallers(5));
} else if ((flags & PackageManager.MATCH_UNINSTALLED_PACKAGES) != 0 && isCallerSystemUser
- && sUserManager.hasManagedProfile(UserHandle.USER_SYSTEM)) {
+ && mUserManager.hasManagedProfile(UserHandle.USER_SYSTEM)) {
// If the caller wants all packages and has a restricted profile associated with it,
// then match all users. This is to make sure that launchers that need to access work
// profile apps don't start breaking. TODO: Remove this hack when launchers stop using
@@ -5018,7 +5160,7 @@
*/
private ActivityInfo getActivityInfoInternal(ComponentName component, int flags,
int filterCallingUid, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
flags = updateFlagsForComponent(flags, userId, component);
if (!isRecentsAccessingChildProfiles(Binder.getCallingUid(), userId)) {
@@ -5049,7 +5191,7 @@
}
private boolean isRecentsAccessingChildProfiles(int callingUid, int targetUserId) {
- if (!getActivityTaskManagerInternal().isCallerRecents(callingUid)) {
+ if (!mInjector.getActivityTaskManagerInternal().isCallerRecents(callingUid)) {
return false;
}
final long token = Binder.clearCallingIdentity();
@@ -5058,7 +5200,7 @@
if (ActivityManager.getCurrentUser() != callingUserId) {
return false;
}
- return sUserManager.isSameProfileGroup(callingUserId, targetUserId);
+ return mUserManager.isSameProfileGroup(callingUserId, targetUserId);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -5098,7 +5240,7 @@
@Override
public ActivityInfo getReceiverInfo(ComponentName component, int flags, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
final int callingUid = Binder.getCallingUid();
flags = updateFlagsForComponent(flags, userId, component);
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
@@ -5124,7 +5266,7 @@
@Override
public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName,
int flags, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
Preconditions.checkArgumentNonnegative(userId, "userId must be >= 0");
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return null;
@@ -5206,7 +5348,7 @@
Preconditions.checkNotNull(packageName, "packageName cannot be null");
Preconditions.checkArgumentNonnegative(userId, "userId must be >= 0");
- if (!sUserManager.exists(userId)) {
+ if (!mUserManager.exists(userId)) {
return null;
}
@@ -5313,7 +5455,7 @@
@Override
public ServiceInfo getServiceInfo(ComponentName component, int flags, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
final int callingUid = Binder.getCallingUid();
flags = updateFlagsForComponent(flags, userId, component);
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
@@ -5338,7 +5480,7 @@
@Override
public ProviderInfo getProviderInfo(ComponentName component, int flags, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
final int callingUid = Binder.getCallingUid();
flags = updateFlagsForComponent(flags, userId, component);
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
@@ -6038,7 +6180,7 @@
try {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveIntent");
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
final int callingUid = Binder.getCallingUid();
flags = updateFlagsForResolve(flags, userId, intent, filterCallingUid, resolveForStart);
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
@@ -6063,7 +6205,7 @@
throw new SecurityException(
"findPersistentPreferredActivity can only be run by the system");
}
- if (!sUserManager.exists(userId)) {
+ if (!mUserManager.exists(userId)) {
return null;
}
final int callingUid = Binder.getCallingUid();
@@ -6376,7 +6518,7 @@
Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName()
+ " is holding mPackages", new Throwable());
}
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
final int callingUid = Binder.getCallingUid();
// Do NOT hold the packages lock; this calls up into the settings provider which
// could cause a deadlock.
@@ -6605,7 +6747,7 @@
private UserInfo getProfileParent(int userId) {
final long identity = Binder.clearCallingIdentity();
try {
- return sUserManager.getProfileParent(userId);
+ return mUserManager.getProfileParent(userId);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -6664,7 +6806,7 @@
private @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,
String resolvedType, int flags, int filterCallingUid, int userId,
boolean resolveForStart, boolean allowDynamicSplits) {
- if (!sUserManager.exists(userId)) return Collections.emptyList();
+ if (!mUserManager.exists(userId)) return Collections.emptyList();
final String instantAppPkgName = getInstantAppPackageName(filterCallingUid);
mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId,
false /* requireFullPermission */, false /* checkShell */,
@@ -6938,7 +7080,7 @@
private CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent,
String resolvedType, int flags, int sourceUserId, int parentUserId) {
- if (!sUserManager.hasUserRestriction(UserManager.ALLOW_PARENT_PROFILE_APP_LINKING,
+ if (!mUserManager.hasUserRestriction(UserManager.ALLOW_PARENT_PROFILE_APP_LINKING,
sourceUserId)) {
return null;
}
@@ -6999,7 +7141,7 @@
private boolean isUserEnabled(int userId) {
long callingId = Binder.clearCallingIdentity();
try {
- UserInfo userInfo = sUserManager.getUserInfo(userId);
+ UserInfo userInfo = mUserManager.getUserInfo(userId);
return userInfo != null && userInfo.isEnabled();
} finally {
Binder.restoreCallingIdentity(callingId);
@@ -7404,7 +7546,7 @@
long ident = Binder.clearCallingIdentity();
boolean targetIsProfile;
try {
- targetIsProfile = sUserManager.getUserInfo(targetUserId).isManagedProfile();
+ targetIsProfile = mUserManager.getUserInfo(targetUserId).isManagedProfile();
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -7443,7 +7585,7 @@
private @NonNull List<ResolveInfo> queryIntentActivityOptionsInternal(ComponentName caller,
Intent[] specifics, String[] specificTypes, Intent intent,
String resolvedType, int flags, int userId) {
- if (!sUserManager.exists(userId)) return Collections.emptyList();
+ if (!mUserManager.exists(userId)) return Collections.emptyList();
final int callingUid = Binder.getCallingUid();
flags = updateFlagsForResolve(flags, userId, intent, callingUid,
false /*includeInstantApps*/);
@@ -7626,7 +7768,7 @@
private @NonNull List<ResolveInfo> queryIntentReceiversInternal(Intent intent,
String resolvedType, int flags, int userId, boolean allowDynamicSplits) {
- if (!sUserManager.exists(userId)) return Collections.emptyList();
+ if (!mUserManager.exists(userId)) return Collections.emptyList();
final int callingUid = Binder.getCallingUid();
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
false /*requireFullPermission*/, false /*checkShell*/,
@@ -7716,7 +7858,7 @@
private ResolveInfo resolveServiceInternal(Intent intent, String resolvedType, int flags,
int userId, int callingUid) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
flags = updateFlagsForResolve(
flags, userId, intent, callingUid, false /*includeInstantApps*/);
List<ResolveInfo> query = queryIntentServicesInternal(
@@ -7742,7 +7884,7 @@
private @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent,
String resolvedType, int flags, int userId, int callingUid,
boolean includeInstantApps) {
- if (!sUserManager.exists(userId)) return Collections.emptyList();
+ if (!mUserManager.exists(userId)) return Collections.emptyList();
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
false /*requireFullPermission*/, false /*checkShell*/,
"query intent receivers");
@@ -7861,7 +8003,7 @@
private @NonNull List<ResolveInfo> queryIntentContentProvidersInternal(
Intent intent, String resolvedType, int flags, int userId) {
- if (!sUserManager.exists(userId)) return Collections.emptyList();
+ if (!mUserManager.exists(userId)) return Collections.emptyList();
final int callingUid = Binder.getCallingUid();
final String instantAppPkgName = getInstantAppPackageName(callingUid);
flags = updateFlagsForResolve(flags, userId, intent, callingUid,
@@ -7976,7 +8118,7 @@
if (getInstantAppPackageName(callingUid) != null) {
return ParceledListSlice.emptyList();
}
- if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
+ if (!mUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForPackage(flags, userId, null);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
final boolean listApex = (flags & MATCH_APEX) != 0;
@@ -8076,7 +8218,7 @@
@Override
public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
String[] permissions, int flags, int userId) {
- if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
+ if (!mUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForPackage(flags, userId, permissions);
mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, false /* checkShell */,
@@ -8118,7 +8260,7 @@
if (getInstantAppPackageName(callingUid) != null) {
return Collections.emptyList();
}
- if (!sUserManager.exists(userId)) return Collections.emptyList();
+ if (!mUserManager.exists(userId)) return Collections.emptyList();
flags = updateFlagsForApplication(flags, userId, null);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
@@ -8348,7 +8490,7 @@
}
private ProviderInfo resolveContentProviderInternal(String name, int flags, int userId) {
- if (!sUserManager.exists(userId)) return null;
+ if (!mUserManager.exists(userId)) return null;
flags = updateFlagsForComponent(flags, userId, name);
final int callingUid = Binder.getCallingUid();
final ProviderInfo providerInfo = mComponentResolver.queryProvider(name, flags, userId);
@@ -8387,7 +8529,7 @@
final int callingUid = Binder.getCallingUid();
final int userId = processName != null ? UserHandle.getUserId(uid)
: UserHandle.getCallingUserId();
- if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
+ if (!mUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForComponent(flags, userId, processName);
ArrayList<ProviderInfo> finalList = null;
final List<ProviderInfo> matchList =
@@ -9763,7 +9905,7 @@
}
private int[] resolveUserIds(int userId) {
- return (userId == UserHandle.USER_ALL) ? sUserManager.getUserIds() : new int[] { userId };
+ return (userId == UserHandle.USER_ALL) ? mUserManager.getUserIds() : new int[] { userId };
}
private void clearAppDataLIF(PackageParser.Package pkg, int userId, int flags) {
@@ -10159,7 +10301,7 @@
if (!pkg.isSystem() || pkg.isUpdatedSystemApp()) {
final int flags = pkg.isUpdatedSystemApp()
? PackageManager.DELETE_KEEP_DATA : 0;
- deletePackageLIF(pkg.packageName, null, true, sUserManager.getUserIds(),
+ deletePackageLIF(pkg.packageName, null, true, mUserManager.getUserIds(),
flags , null, true, null);
}
Slog.e(TAG, "updateAllSharedLibrariesLPw failed: " + e.getMessage());
@@ -10728,7 +10870,7 @@
boolean isUnderFactoryTest, long currentTime)
throws PackageManagerException {
final PackageAbiHelper packageAbiHelper = injector.getAbiHelper();
- final UserManagerInternal userManager = injector.getUserManager();
+ final UserManagerInternal userManager = injector.getUserManagerInternal();
final PackageParser.Package pkg = request.pkg;
PackageSetting pkgSetting = request.pkgSetting;
final PackageSetting disabledPkgSetting = request.disabledPkgSetting;
@@ -10834,7 +10976,7 @@
if (!createNewPackage) {
final boolean instantApp = (scanFlags & SCAN_AS_INSTANT_APP) != 0;
final boolean fullApp = (scanFlags & SCAN_AS_FULL_APP) != 0;
- setInstantAppForUser(userManager, pkgSetting, userId, instantApp, fullApp);
+ setInstantAppForUser(injector, pkgSetting, userId, instantApp, fullApp);
}
// TODO(patb): see if we can do away with disabled check here.
if (disabledPkgSetting != null
@@ -12296,10 +12438,10 @@
* automatically without needing an explicit launch.
* Send it a LOCKED_BOOT_COMPLETED/BOOT_COMPLETED if it would ordinarily have gotten ones.
*/
- private void sendBootCompletedBroadcastToSystemApp(String packageName, boolean includeStopped,
- int userId) {
+ private void sendBootCompletedBroadcastToSystemApp(
+ String packageName, boolean includeStopped, int userId) {
// If user is not running, the app didn't miss any broadcast
- if (!mUserManagerInternal.isUserRunning(userId)) {
+ if (!mUserManager.isUserRunning(userId)) {
return;
}
final IActivityManager am = ActivityManager.getService();
@@ -12315,7 +12457,7 @@
android.app.AppOpsManager.OP_NONE, null, false, false, userId);
// Deliver BOOT_COMPLETED only if user is unlocked
- if (mUserManagerInternal.isUserUnlockingOrUnlocked(userId)) {
+ if (mUserManager.isUserUnlockingOrUnlocked(userId)) {
Intent bcIntent = new Intent(Intent.ACTION_BOOT_COMPLETED).setPackage(packageName);
if (includeStopped) {
bcIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
@@ -12593,7 +12735,7 @@
// only allow the existing package to be used if it's installed as a full
// application for at least one user
boolean installAllowed = false;
- for (int checkUserId : sUserManager.getUserIds()) {
+ for (int checkUserId : mUserManager.getUserIds()) {
installAllowed = !pkgSetting.getInstantApp(checkUserId);
if (installAllowed) {
break;
@@ -12614,8 +12756,7 @@
// upgrade app from instant to full; we don't allow app downgrade
installed = true;
}
- setInstantAppForUser(
- getUserManagerInternal(), pkgSetting, userId, instantApp, fullApp);
+ setInstantAppForUser(mInjector, pkgSetting, userId, instantApp, fullApp);
}
if (installed) {
@@ -12663,7 +12804,7 @@
}
}
- static void setInstantAppForUser(UserManagerInternal userManager, PackageSetting pkgSetting,
+ static void setInstantAppForUser(Injector injector, PackageSetting pkgSetting,
int userId, boolean instantApp, boolean fullApp) {
// no state specified; do nothing
if (!instantApp && !fullApp) {
@@ -12676,7 +12817,7 @@
pkgSetting.setInstantApp(false /*instantApp*/, userId);
}
} else {
- for (int currentUserId : userManager.getUserIds()) {
+ for (int currentUserId : injector.getUserManagerInternal().getUserIds()) {
if (instantApp && !pkgSetting.getInstantApp(currentUserId)) {
pkgSetting.setInstantApp(true /*instantApp*/, currentUserId);
} else if (fullApp && pkgSetting.getInstantApp(currentUserId)) {
@@ -12687,7 +12828,7 @@
}
boolean isUserRestricted(int userId, String restrictionKey) {
- Bundle restrictions = sUserManager.getUserRestrictions(userId);
+ Bundle restrictions = mUserManager.getUserRestrictions(userId);
if (restrictions.getBoolean(restrictionKey, false)) {
Log.w(TAG, "User is restricted: " + restrictionKey);
return true;
@@ -12925,7 +13066,7 @@
* @param affectedUser The user for which the changes are taking place.
*/
void unsuspendForSuspendingPackage(final String packageName, int affectedUser) {
- final int[] userIds = (affectedUser == UserHandle.USER_ALL) ? sUserManager.getUserIds()
+ final int[] userIds = (affectedUser == UserHandle.USER_ALL) ? mUserManager.getUserIds()
: new int[] {affectedUser};
for (int userId : userIds) {
unsuspendForSuspendingPackages(packageName::equals, userId);
@@ -13281,7 +13422,7 @@
* @return default verification response code
*/
private int getDefaultVerificationResponse(UserHandle user) {
- if (sUserManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS, user.getIdentifier())) {
+ if (mUserManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS, user.getIdentifier())) {
return PackageManager.VERIFICATION_REJECT;
}
return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
@@ -13327,7 +13468,7 @@
&& mInstantAppInstallerActivity.packageName.equals(
mRequiredVerifierPackage)) {
try {
- mContext.getSystemService(AppOpsManager.class)
+ mInjector.getAppOpsManager()
.checkPackage(installerUid, mRequiredVerifierPackage);
if (DEBUG_VERIFY) {
Slog.i(TAG, "disable verification for instant app");
@@ -13548,7 +13689,7 @@
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
throw new SecurityException("Instant applications don't have access to this method");
}
- mContext.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(),
+ mInjector.getAppOpsManager().checkPackage(Binder.getCallingUid(),
callerPackageName);
synchronized (mLock) {
PackageSetting ps = mSettings.mPackages.get(packageName);
@@ -13693,7 +13834,7 @@
final String packageName = res.pkg.applicationInfo.packageName;
final String seInfo = res.pkg.applicationInfo.seInfo;
- final int[] allUsers = sUserManager.getUserIds();
+ final int[] allUsers = mUserManager.getUserIds();
final int[] installedUsers;
final PackageSetting ps;
@@ -14366,7 +14507,8 @@
final List<ComponentName> sufficientVerifiers = matchVerifiers(pkgLite,
receivers, verificationState);
- DeviceIdleController.LocalService idleController = getDeviceIdleController();
+ DeviceIdleController.LocalService idleController =
+ mInjector.getLocalDeviceIdleController();
final long idleDuration = getVerificationTimeout();
/*
@@ -14438,7 +14580,7 @@
synchronized (mLock) {
PackageSetting ps = mSettings.getPackageLPr(pkgLite.packageName);
if (ps != null) {
- installedUsers = ps.queryInstalledUsers(sUserManager.getUserIds(),
+ installedUsers = ps.queryInstalledUsers(mUserManager.getUserIds(),
true);
} else {
installedUsers = new int[0];
@@ -14958,7 +15100,7 @@
final File codeFile = new File(Environment.getDataAppDirectory(volumeUuid),
move.dataAppName);
Slog.d(TAG, "Cleaning up " + move.packageName + " on " + volumeUuid);
- final int[] userIds = sUserManager.getUserIds();
+ final int[] userIds = mUserManager.getUserIds();
synchronized (mInstallLock) {
// Clean up both app data and code
// All package moves are frozen until finished
@@ -15239,7 +15381,7 @@
// Set install reason for users that are having the package newly installed.
if (userId == UserHandle.USER_ALL) {
- for (int currentUserId : sUserManager.getUserIds()) {
+ for (int currentUserId : mUserManager.getUserIds()) {
if (!previousUserIds.contains(currentUserId)) {
ps.setInstallReason(installReason, currentUserId);
}
@@ -15872,7 +16014,7 @@
final PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps != null) {
- res.newUsers = ps.queryInstalledUsers(sUserManager.getUserIds(), true);
+ res.newUsers = ps.queryInstalledUsers(mUserManager.getUserIds(), true);
ps.setUpdateAvailable(false /*updateAvailable*/);
}
final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0;
@@ -15883,7 +16025,7 @@
PackageSetting childPs = mSettings.getPackageLPr(childPkg.packageName);
if (childPs != null) {
childRes.newUsers = childPs.queryInstalledUsers(
- sUserManager.getUserIds(), true);
+ mUserManager.getUserIds(), true);
}
}
if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) {
@@ -16003,7 +16145,7 @@
try {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "commitPackages");
commitRequest = new CommitRequest(reconciledPackages,
- sUserManager.getUserIds());
+ mUserManager.getUserIds());
commitPackagesLocked(commitRequest);
success = true;
} finally {
@@ -16299,7 +16441,7 @@
PackageSetting childPs = mSettings.getPackageLPr(childPkg.packageName);
if (childPs != null) {
childRes.origUsers = childPs.queryInstalledUsers(
- sUserManager.getUserIds(), true);
+ mUserManager.getUserIds(), true);
}
if ((mPackages.containsKey(childPkg.packageName))) {
childRes.removedInfo = new PackageRemovedInfo(this);
@@ -16464,7 +16606,7 @@
systemApp = (ps.pkg.applicationInfo.flags &
ApplicationInfo.FLAG_SYSTEM) != 0;
}
- res.origUsers = ps.queryInstalledUsers(sUserManager.getUserIds(), true);
+ res.origUsers = ps.queryInstalledUsers(mUserManager.getUserIds(), true);
}
@@ -16723,7 +16865,7 @@
}
// In case of rollback, remember per-user/profile install state
- allUsers = sUserManager.getUserIds();
+ allUsers = mUserManager.getUserIds();
installedUsers = ps.queryInstalledUsers(allUsers, true);
@@ -17234,7 +17376,7 @@
return;
}
final boolean deleteAllUsers = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0;
- final int[] users = deleteAllUsers ? sUserManager.getUserIds() : new int[]{userId};
+ final int[] users = deleteAllUsers ? mUserManager.getUserIds() : new int[]{userId};
if (UserHandle.getUserId(uid) != userId || (deleteAllUsers && users.length > 1)) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
@@ -17484,7 +17626,7 @@
// Does it contain a device admin for any user?
int[] users;
if (userId == UserHandle.USER_ALL) {
- users = sUserManager.getUserIds();
+ users = mUserManager.getUserIds();
} else {
users = new int[]{userId};
}
@@ -17561,7 +17703,7 @@
// allow removing a package if it provides a lib others depend on.
pkg = mPackages.get(packageName);
- allUsers = sUserManager.getUserIds();
+ allUsers = mUserManager.getUserIds();
if (pkg != null && pkg.staticSharedLibName != null) {
SharedLibraryInfo libraryInfo = getSharedLibraryInfoLPr(pkg.staticSharedLibName,
@@ -17811,7 +17953,7 @@
outInfo.isStaticSharedLib = deletedPkg != null
&& deletedPkg.staticSharedLibName != null;
outInfo.populateUsers(deletedPs == null ? null
- : deletedPs.queryInstalledUsers(sUserManager.getUserIds(), true), deletedPs);
+ : deletedPs.queryInstalledUsers(mUserManager.getUserIds(), true), deletedPs);
}
removePackageLI(deletedPs.name, (flags & PackageManager.DELETE_CHATTY) != 0);
@@ -17910,7 +18052,8 @@
if (removedAppId != -1) {
// A user ID was deleted here. Go through all users and remove it
// from KeyStore.
- removeKeystoreDataIfNeeded(UserHandle.USER_ALL, removedAppId);
+ removeKeystoreDataIfNeeded(
+ mInjector.getUserManagerInternal(), UserHandle.USER_ALL, removedAppId);
}
}
@@ -18417,7 +18560,7 @@
if (!systemApp) {
// Do not uninstall the APK if an app should be cached
boolean keepUninstalledPackage = shouldKeepUninstalledPackageLPr(packageName);
- if (ps.isAnyInstalled(sUserManager.getUserIds()) || keepUninstalledPackage) {
+ if (ps.isAnyInstalled(mUserManager.getUserIds()) || keepUninstalledPackage) {
// Other users still have this package installed, so all
// we need to do is clear this user's data and save that
// it is uninstalled.
@@ -18531,7 +18674,7 @@
@GuardedBy("mLock")
private void markPackageUninstalledForUserLPw(PackageSetting ps, UserHandle user) {
final int[] userIds = (user == null || user.getIdentifier() == UserHandle.USER_ALL)
- ? sUserManager.getUserIds() : new int[] {user.getIdentifier()};
+ ? mUserManager.getUserIds() : new int[] {user.getIdentifier()};
for (int nextUserId : userIds) {
if (DEBUG_REMOVE) {
Slog.d(TAG, "Marking package:" + ps.name + " uninstalled for user:" + nextUserId);
@@ -18568,7 +18711,7 @@
destroyAppProfilesLIF(pkg);
- final int[] userIds = (userId == UserHandle.USER_ALL) ? sUserManager.getUserIds()
+ final int[] userIds = (userId == UserHandle.USER_ALL) ? mUserManager.getUserIds()
: new int[] {userId};
for (int nextUserId : userIds) {
if (DEBUG_REMOVE) {
@@ -18579,7 +18722,7 @@
destroyAppDataLIF(pkg, nextUserId,
FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL);
clearDefaultBrowserIfNeededForUser(ps.name, nextUserId);
- removeKeystoreDataIfNeeded(nextUserId, ps.appId);
+ removeKeystoreDataIfNeeded(mInjector.getUserManagerInternal(), nextUserId, ps.appId);
final SparseBooleanArray changedUsers = new SparseBooleanArray();
clearPackagePreferredActivitiesLPw(ps.name, changedUsers, nextUserId);
if (changedUsers.size() > 0) {
@@ -18712,9 +18855,9 @@
FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL);
final int appId = UserHandle.getAppId(pkg.applicationInfo.uid);
- removeKeystoreDataIfNeeded(userId, appId);
+ removeKeystoreDataIfNeeded(mInjector.getUserManagerInternal(), userId, appId);
- UserManagerInternal umInternal = getUserManagerInternal();
+ UserManagerInternal umInternal = mInjector.getUserManagerInternal();
final int flags;
if (umInternal.isUserUnlockingOrUnlocked(userId)) {
flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
@@ -18729,14 +18872,14 @@
}
private void resetNetworkPolicies(int userId) {
- LocalServices.getService(NetworkPolicyManagerInternal.class).resetUserState(userId);
+ mInjector.getNetworkPolicyManagerInternal().resetUserState(userId);
}
/**
* Remove entries from the keystore daemon. Will only remove it if the
* {@code appId} is valid.
*/
- private static void removeKeystoreDataIfNeeded(int userId, int appId) {
+ private static void removeKeystoreDataIfNeeded(UserManagerInternal um, int userId, int appId) {
if (appId < 0) {
return;
}
@@ -18744,7 +18887,7 @@
final KeyStore keyStore = KeyStore.getInstance();
if (keyStore != null) {
if (userId == UserHandle.USER_ALL) {
- for (final int individual : sUserManager.getUserIds()) {
+ for (final int individual : um.getUserIds()) {
keyStore.clearUid(UserHandle.getUid(individual, appId));
}
} else {
@@ -19145,8 +19288,8 @@
void clearIntentFilterVerificationsLPw(String packageName, int userId) {
if (userId == UserHandle.USER_ALL) {
if (mSettings.removeIntentFilterVerificationLPw(packageName,
- sUserManager.getUserIds())) {
- for (int oneUserId : sUserManager.getUserIds()) {
+ mUserManager.getUserIds())) {
+ for (int oneUserId : mUserManager.getUserIds()) {
scheduleWritePackageRestrictionsLocked(oneUserId);
}
}
@@ -19159,7 +19302,7 @@
/** Clears state for all users, and touches intent filter verification policy */
void clearDefaultBrowserIfNeeded(String packageName) {
- for (int oneUserId : sUserManager.getUserIds()) {
+ for (int oneUserId : mUserManager.getUserIds()) {
clearDefaultBrowserIfNeededForUser(packageName, oneUserId);
}
}
@@ -19526,7 +19669,7 @@
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
int callingUid = Binder.getCallingUid();
enforceOwnerRights(ownerPackage, callingUid);
- PackageManagerServiceUtils.enforceShellRestriction(
+ PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
if (intentFilter.countActions() == 0) {
Slog.w(TAG, "Cannot set a crossProfile intent filter with no filter actions");
@@ -19558,7 +19701,7 @@
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
final int callingUid = Binder.getCallingUid();
enforceOwnerRights(ownerPackage, callingUid);
- PackageManagerServiceUtils.enforceShellRestriction(
+ PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
synchronized (mLock) {
CrossProfileIntentResolver resolver =
@@ -19907,7 +20050,7 @@
@Override
public void setApplicationEnabledSetting(String appPackageName,
int newState, int flags, int userId, String callingPackage) {
- if (!sUserManager.exists(userId)) return;
+ if (!mUserManager.exists(userId)) return;
if (callingPackage == null) {
callingPackage = Integer.toString(Binder.getCallingUid());
}
@@ -19928,7 +20071,7 @@
@Override
public void setComponentEnabledSetting(ComponentName componentName,
int newState, int flags, int userId) {
- if (!sUserManager.exists(userId)) return;
+ if (!mUserManager.exists(userId)) return;
setEnabledSetting(componentName.getPackageName(),
componentName.getClassName(), newState, flags, userId, null);
}
@@ -20155,7 +20298,7 @@
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return;
}
- if (!sUserManager.exists(userId)) {
+ if (!mUserManager.exists(userId)) {
return;
}
mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission*/,
@@ -20196,7 +20339,7 @@
@Override
public void setPackageStoppedState(String packageName, boolean stopped, int userId) {
- if (!sUserManager.exists(userId)) return;
+ if (!mUserManager.exists(userId)) return;
final int callingUid = Binder.getCallingUid();
if (getInstantAppPackageName(callingUid) != null) {
return;
@@ -20246,7 +20389,7 @@
@Override
public int getApplicationEnabledSetting(String packageName, int userId) {
- if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED;
+ if (!mUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED;
int callingUid = Binder.getCallingUid();
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
false /* requireFullPermission */, false /* checkShell */, "get enabled");
@@ -20263,7 +20406,7 @@
@Override
public int getComponentEnabledSetting(@NonNull ComponentName component, int userId) {
if (component == null) return COMPONENT_ENABLED_STATE_DEFAULT;
- if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED;
+ if (!mUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED;
int callingUid = Binder.getCallingUid();
mPermissionManager.enforceCrossUserPermission(callingUid, userId,
false /*requireFullPermission*/, false /*checkShell*/, "getComponentEnabled");
@@ -20361,7 +20504,7 @@
}
}
- sUserManager.systemReady();
+ mUserManager.systemReady();
// Now that we've scanned all packages, and granted any default
// permissions, ensure permissions are updated. Beware of dragons if you
@@ -20370,7 +20513,7 @@
mPermissionManager.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, false);
final PermissionPolicyInternal permissionPolicyInternal =
- LocalServices.getService(PermissionPolicyInternal.class);
+ mInjector.getPermissionPolicyInternal();
permissionPolicyInternal.setOnInitializedCallback(userId -> {
// The SDK updated case is already handled when we run during the ctor.
synchronized (mPackages) {
@@ -20381,14 +20524,14 @@
}
// Watch for external volumes that come and go over time
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final StorageManager storage = mInjector.getStorageManager();
storage.registerListener(mStorageListener);
mInstallerService.systemReady();
mApexManager.systemReady();
mPackageDexOptimizer.systemReady();
- getStorageManagerInternal().addExternalStoragePolicy(
+ mInjector.getStorageManagerInternal().addExternalStoragePolicy(
new StorageManagerInternal.ExternalStorageMountPolicy() {
@Override
public int getMountMode(int uid, String packageName) {
@@ -20411,7 +20554,7 @@
});
// Now that we're mostly running, clean up stale users and apps
- sUserManager.reconcileUsers(StorageManager.UUID_PRIVATE_INTERNAL);
+ mUserManager.reconcileUsers(StorageManager.UUID_PRIVATE_INTERNAL);
reconcileApps(StorageManager.UUID_PRIVATE_INTERNAL);
mPermissionManager.systemReady();
@@ -20889,7 +21032,7 @@
pw.println(prefix + "No app verification established.");
pw.println();
}
- for (int userId : sUserManager.getUserIds()) {
+ for (int userId : mUserManager.getUserIds()) {
pw.println("App linkages for user " + userId + ":");
pw.println();
count = 0;
@@ -21054,7 +21197,7 @@
}
for (String packageName : apkList) {
setSystemAppHiddenUntilInstalled(packageName, true);
- for (UserInfo user : sUserManager.getUsers(false)) {
+ for (UserInfo user : mUserManager.getUsers(false)) {
setSystemAppInstallState(packageName, false, user.id);
}
}
@@ -21340,10 +21483,9 @@
}
// Reconcile app data for all started/unlocked users
- final StorageManager sm = mContext.getSystemService(StorageManager.class);
- final UserManager um = mContext.getSystemService(UserManager.class);
- UserManagerInternal umInternal = getUserManagerInternal();
- for (UserInfo user : um.getUsers()) {
+ final StorageManager sm = mInjector.getStorageManager();
+ UserManagerInternal umInternal = mInjector.getUserManagerInternal();
+ for (UserInfo user : mUserManager.getUsers(false /* includeDying */)) {
final int flags;
if (umInternal.isUserUnlockingOrUnlocked(user.id)) {
flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
@@ -21533,7 +21675,7 @@
* correct for all installed apps on all mounted volumes.
*/
void reconcileAppsData(int userId, int flags, boolean migrateAppsData) {
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final StorageManager storage = mInjector.getStorageManager();
for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
final String volumeUuid = vol.getFsUuid();
synchronized (mInstallLock) {
@@ -21662,9 +21804,8 @@
mSettings.writeKernelMappingLPr(ps);
}
- final UserManager um = mContext.getSystemService(UserManager.class);
- UserManagerInternal umInternal = getUserManagerInternal();
- for (UserInfo user : um.getUsers()) {
+ UserManagerInternal umInternal = mInjector.getUserManagerInternal();
+ for (UserInfo user : mUserManager.getUsers(false /*excludeDying*/)) {
final int flags;
if (umInternal.isUserUnlockingOrUnlocked(user.id)) {
flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
@@ -21995,7 +22136,7 @@
private void movePackageInternal(final String packageName, final String volumeUuid,
final int moveId, final int callingUid, UserHandle user)
throws PackageManagerException {
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final StorageManager storage = mInjector.getStorageManager();
final PackageManager pm = mContext.getPackageManager();
final String currentVolumeUuid;
@@ -22064,7 +22205,7 @@
label = String.valueOf(pm.getApplicationLabel(pkg.applicationInfo));
targetSdkVersion = pkg.applicationInfo.targetSdkVersion;
freezer = freezePackage(packageName, "movePackageInternal");
- installedUserIds = ps.queryInstalledUsers(sUserManager.getUserIds(), true);
+ installedUserIds = ps.queryInstalledUsers(mUserManager.getUserIds(), true);
}
final Bundle extras = new Bundle();
@@ -22231,7 +22372,7 @@
return;
}
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final StorageManager storage = mInjector.getStorageManager();
VolumeInfo volume = storage.findVolumeByUuid(pkg.applicationInfo.storageUuid.toString());
int packageExternalStorageType = getPackageExternalStorageType(volume, isExternal(pkg));
@@ -22269,7 +22410,7 @@
}
};
- final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final StorageManager storage = mInjector.getStorageManager();
storage.setPrimaryStorageUuid(volumeUuid, callback);
return realMoveId;
}
@@ -22415,7 +22556,7 @@
final long token = Binder.clearCallingIdentity();
try {
final DeviceStorageMonitorInternal
- dsm = LocalServices.getService(DeviceStorageMonitorInternal.class);
+ dsm = mInjector.getDeviceStorageMonitorInternal();
if (dsm != null) {
return dsm.isMemoryLow();
} else {
@@ -22445,7 +22586,7 @@
final UserInfo userInfo;
final long token = Binder.clearCallingIdentity();
try {
- userInfo = sUserManager.getUserInfo(userId);
+ userInfo = mUserManager.getUserInfo(userId);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -22570,7 +22711,7 @@
if (ps == null) {
return;
}
- if (!ps.isAnyInstalled(sUserManager.getUserIds())) {
+ if (!ps.isAnyInstalled(mUserManager.getUserIds())) {
// TODO Implement atomic delete if package is unused
// It is currently possible that the package will be deleted even if it is installed
// after this method returns.
@@ -23853,8 +23994,8 @@
return false;
}
}
- if (sUserManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userId)
- || sUserManager.hasUserRestriction(
+ if (mUserManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userId)
+ || mUserManager.hasUserRestriction(
UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY, userId)) {
return false;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index 4c7db9a..ef47410 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -47,6 +47,7 @@
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserHandle;
+import android.os.UserManagerInternal;
import android.service.pm.PackageServiceDumpProto;
import android.system.ErrnoException;
import android.system.Os;
@@ -375,10 +376,12 @@
}
}
- public static void enforceShellRestriction(String restriction, int callingUid, int userHandle) {
+ /** Enforces that if the caller is shell, it does not have the provided user restriction. */
+ public static void enforceShellRestriction(
+ UserManagerInternal userManager, String restriction, int callingUid, int userHandle) {
if (callingUid == Process.SHELL_UID) {
if (userHandle >= 0
- && PackageManagerService.sUserManager.hasUserRestriction(
+ && userManager.hasUserRestriction(
restriction, userHandle)) {
throw new SecurityException("Shell does not have permission to access user "
+ userHandle);
diff --git a/services/core/java/com/android/server/pm/ProtectedPackages.java b/services/core/java/com/android/server/pm/ProtectedPackages.java
index a374e14..231168e 100644
--- a/services/core/java/com/android/server/pm/ProtectedPackages.java
+++ b/services/core/java/com/android/server/pm/ProtectedPackages.java
@@ -92,6 +92,9 @@
if (mDeviceOwnerUserId == userId) {
return mDeviceOwnerPackage;
}
+ if (mProfileOwnerPackages == null) {
+ return null;
+ }
return mProfileOwnerPackages.get(userId);
}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index f4ba449..a707aa8 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -576,6 +576,14 @@
null, mHandler);
}
+ /**
+ * This method retrieves the {@link UserManagerInternal} only for the purpose of
+ * PackageManagerService construction.
+ */
+ UserManagerInternal getInternalForInjectorOnly() {
+ return mLocalService;
+ }
+
void cleanupPartialUsers() {
// Prune out any partially created, partially removed and ephemeral users.
ArrayList<UserInfo> partials = new ArrayList<>();
@@ -1549,11 +1557,7 @@
/** @return a specific user restriction that's in effect currently. */
@Override
public boolean hasUserRestriction(String restrictionKey, int userId) {
- if (!UserRestrictionsUtils.isValidRestriction(restrictionKey)) {
- return false;
- }
- Bundle restrictions = getEffectiveUserRestrictions(userId);
- return restrictions != null && restrictions.getBoolean(restrictionKey);
+ return mLocalService.hasUserRestriction(restrictionKey, userId);
}
/** @return if any user has the given restriction. */
@@ -4120,6 +4124,15 @@
return UserRestrictionsUtils.isSettingRestrictedForUser(mContext, setting, userId,
value, callingUid);
}
+
+ @Override
+ public boolean hasUserRestriction(String restrictionKey, int userId) {
+ if (!UserRestrictionsUtils.isValidRestriction(restrictionKey)) {
+ return false;
+ }
+ Bundle restrictions = getEffectiveUserRestrictions(userId);
+ return restrictions != null && restrictions.getBoolean(restrictionKey);
+ }
}
/* Remove all the users except of the system one. */
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 210a7af..e2644ff 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -1197,7 +1197,8 @@
final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName);
if (pkg == null || pkg.mExtras == null) {
- throw new IllegalArgumentException("Unknown package: " + packageName);
+ Log.e(TAG, "Unknown package: " + packageName);
+ return;
}
final BasePermission bp;
synchronized (mLock) {
@@ -1357,7 +1358,8 @@
final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName);
if (pkg == null || pkg.mExtras == null) {
- throw new IllegalArgumentException("Unknown package: " + packageName);
+ Log.e(TAG, "Unknown package: " + packageName);
+ return;
}
if (mPackageManagerInt.filterAppAccess(pkg, callingUid, userId)) {
throw new IllegalArgumentException("Unknown package: " + packageName);
@@ -3928,7 +3930,7 @@
throw new IllegalArgumentException("Invalid userId " + userId);
}
if (checkShell) {
- PackageManagerServiceUtils.enforceShellRestriction(
+ PackageManagerServiceUtils.enforceShellRestriction(mUserManagerInt,
UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, userId);
}
if (!requirePermissionWhenSameUser && userId == UserHandle.getUserId(callingUid)) return;
diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java
index 56d8396..4e9b724 100644
--- a/services/core/java/com/android/server/power/AttentionDetector.java
+++ b/services/core/java/com/android/server/power/AttentionDetector.java
@@ -161,7 +161,7 @@
context.getContentResolver().registerContentObserver(Settings.System.getUriFor(
Settings.System.ADAPTIVE_SLEEP),
- false, new ContentObserver(new Handler()) {
+ false, new ContentObserver(new Handler(context.getMainLooper())) {
@Override
public void onChange(boolean selfChange) {
updateEnabledFromSettings(context);
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index d599441..e57f436 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -2723,6 +2723,14 @@
return true;
}
}
+
+ if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE
+ && mDisplayPowerRequest.dozeScreenState == Display.STATE_ON) {
+ // Although we are in DOZE and would normally allow the device to suspend,
+ // the doze service has explicitly requested the display to remain in the ON
+ // state which means we should hold the display suspend blocker.
+ return true;
+ }
if (mScreenBrightnessBoostInProgress) {
return true;
}
@@ -4854,7 +4862,8 @@
}
}
- private final class LocalService extends PowerManagerInternal {
+ @VisibleForTesting
+ final class LocalService extends PowerManagerInternal {
@Override
public void setScreenBrightnessOverrideFromWindowManager(int screenBrightness) {
if (screenBrightness < PowerManager.BRIGHTNESS_DEFAULT
diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java
index 1552fd5..491c5ab 100644
--- a/services/core/java/com/android/server/power/ThermalManagerService.java
+++ b/services/core/java/com/android/server/power/ThermalManagerService.java
@@ -38,11 +38,13 @@
import android.os.ShellCommand;
import android.os.Temperature;
import android.util.ArrayMap;
+import android.util.EventLog;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.DumpUtils;
+import com.android.server.EventLogTags;
import com.android.server.FgThread;
import com.android.server.SystemService;
@@ -250,6 +252,8 @@
} finally {
mThermalEventListeners.finishBroadcast();
}
+ EventLog.writeEvent(EventLogTags.THERMAL_CHANGED, temperature.getName(),
+ temperature.getType(), temperature.getValue(), temperature.getStatus(), mStatus);
}
private void shutdownIfNeeded(Temperature temperature) {
@@ -860,10 +864,10 @@
mThermalHal11.linkToDeath(new DeathRecipient(),
THERMAL_HAL_DEATH_COOKIE);
mThermalHal11.registerThermalCallback(mThermalCallback11);
+ Slog.i(TAG, "Thermal HAL 1.1 service connected, limited thermal functions "
+ + "due to legacy API.");
} catch (NoSuchElementException | RemoteException e) {
- Slog.e(TAG,
- "Thermal HAL 1.1 service not connected, no thermal call back will be "
- + "called.");
+ Slog.e(TAG, "Thermal HAL 1.1 service not connected.");
mThermalHal11 = null;
}
return (mThermalHal11 != null);
@@ -978,8 +982,9 @@
mThermalHal20.linkToDeath(new DeathRecipient(), THERMAL_HAL_DEATH_COOKIE);
mThermalHal20.registerThermalChangedCallback(mThermalCallback20, false,
0 /* not used */);
+ Slog.i(TAG, "Thermal HAL 2.0 service connected.");
} catch (NoSuchElementException | RemoteException e) {
- Slog.e(TAG, "Thermal HAL 2.0 service not connected, trying 1.1.");
+ Slog.e(TAG, "Thermal HAL 2.0 service not connected.");
mThermalHal20 = null;
}
return (mThermalHal20 != null);
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index 1948b20..bf8c042 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -264,9 +264,10 @@
//TODO gradually add more role migrations statements here for remaining roles
// Make sure to implement LegacyRoleResolutionPolicy#getRoleHolders
// for a given role before adding a migration statement for it here
- maybeMigrateRole(RoleManager.ROLE_SMS, userId);
maybeMigrateRole(RoleManager.ROLE_ASSISTANT, userId);
+ maybeMigrateRole(RoleManager.ROLE_BROWSER, userId);
maybeMigrateRole(RoleManager.ROLE_DIALER, userId);
+ maybeMigrateRole(RoleManager.ROLE_SMS, userId);
maybeMigrateRole(RoleManager.ROLE_EMERGENCY, userId);
// Some package state has changed, so grant default roles again.
diff --git a/services/core/java/com/android/server/role/RoleUserState.java b/services/core/java/com/android/server/role/RoleUserState.java
index 6375b48..d33c10c 100644
--- a/services/core/java/com/android/server/role/RoleUserState.java
+++ b/services/core/java/com/android/server/role/RoleUserState.java
@@ -121,8 +121,6 @@
*/
public int getVersion() {
synchronized (mLock) {
- throwIfDestroyedLocked();
-
return mVersion;
}
}
@@ -134,8 +132,6 @@
*/
public void setVersion(int version) {
synchronized (mLock) {
- throwIfDestroyedLocked();
-
if (mVersion == version) {
return;
}
@@ -163,8 +159,6 @@
*/
public void setPackagesHash(@Nullable String packagesHash) {
synchronized (mLock) {
- throwIfDestroyedLocked();
-
if (Objects.equals(mPackagesHash, packagesHash)) {
return;
}
@@ -182,8 +176,6 @@
*/
public boolean isRoleAvailable(@NonNull String roleName) {
synchronized (mLock) {
- throwIfDestroyedLocked();
-
return mRoles.containsKey(roleName);
}
}
@@ -198,8 +190,6 @@
@Nullable
public ArraySet<String> getRoleHolders(@NonNull String roleName) {
synchronized (mLock) {
- throwIfDestroyedLocked();
-
ArraySet<String> packageNames = mRoles.get(roleName);
if (packageNames == null) {
return null;
@@ -217,8 +207,6 @@
*/
public boolean addRoleName(@NonNull String roleName) {
synchronized (mLock) {
- throwIfDestroyedLocked();
-
if (!mRoles.containsKey(roleName)) {
mRoles.put(roleName, new ArraySet<>());
Slog.i(LOG_TAG, "Added new role: " + roleName);
@@ -237,8 +225,6 @@
*/
public void setRoleNames(@NonNull List<String> roleNames) {
synchronized (mLock) {
- throwIfDestroyedLocked();
-
boolean changed = false;
for (int i = mRoles.size() - 1; i >= 0; i--) {
@@ -279,8 +265,6 @@
boolean changed;
synchronized (mLock) {
- throwIfDestroyedLocked();
-
ArraySet<String> roleHolders = mRoles.get(roleName);
if (roleHolders == null) {
Slog.e(LOG_TAG, "Cannot add role holder for unknown role, role: " + roleName
@@ -312,8 +296,6 @@
boolean changed;
synchronized (mLock) {
- throwIfDestroyedLocked();
-
ArraySet<String> roleHolders = mRoles.get(roleName);
if (roleHolders == null) {
Slog.e(LOG_TAG, "Cannot remove role holder for unknown role, role: " + roleName
@@ -338,14 +320,16 @@
*/
@NonNull
public List<String> getHeldRoles(@NonNull String packageName) {
- ArrayList<String> result = new ArrayList<>();
- int size = mRoles.size();
- for (int i = 0; i < size; i++) {
- if (mRoles.valueAt(i).contains(packageName)) {
- result.add(mRoles.keyAt(i));
+ synchronized (mLock) {
+ List<String> roleNames = new ArrayList<>();
+ int size = mRoles.size();
+ for (int i = 0; i < size; i++) {
+ if (mRoles.valueAt(i).contains(packageName)) {
+ roleNames.add(mRoles.keyAt(i));
+ }
}
+ return roleNames;
}
- return result;
}
/**
@@ -353,7 +337,9 @@
*/
@GuardedBy("mLock")
private void scheduleWriteFileLocked() {
- throwIfDestroyedLocked();
+ if (mDestroyed) {
+ return;
+ }
if (!mWriteScheduled) {
mWriteHandler.sendMessageDelayed(PooledLambda.obtainMessage(RoleUserState::writeFile,
@@ -537,8 +523,6 @@
String packagesHash;
ArrayMap<String, ArraySet<String>> roles;
synchronized (mLock) {
- throwIfDestroyedLocked();
-
version = mVersion;
packagesHash = mPackagesHash;
roles = snapshotRolesLocked();
@@ -602,20 +586,15 @@
*/
public void destroy() {
synchronized (mLock) {
- throwIfDestroyedLocked();
+ if (mDestroyed) {
+ throw new IllegalStateException("This RoleUserState has already been destroyed");
+ }
mWriteHandler.removeCallbacksAndMessages(null);
getFile(mUserId).delete();
mDestroyed = true;
}
}
- @GuardedBy("mLock")
- private void throwIfDestroyedLocked() {
- if (mDestroyed) {
- throw new IllegalStateException("This RoleUserState has already been destroyed");
- }
- }
-
@NonNull
private static File getFile(@UserIdInt int userId) {
return new File(Environment.getUserSystemDirectory(userId), ROLES_FILE_NAME);
diff --git a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
index ab3d7b7..89a5305 100644
--- a/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
+++ b/services/core/java/com/android/server/textclassifier/TextClassificationManagerService.java
@@ -457,12 +457,12 @@
Preconditions.checkArgument(userId != UserHandle.USER_NULL, "Null userId");
final int callingUserId = UserHandle.getCallingUserId();
if (callingUserId != userId) {
- context.enforceCallingPermission(
+ context.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
"Invalid userId. UserId=" + userId + ", CallingUserId=" + callingUserId);
}
} catch (Exception e) {
- throw new RemoteException("Invalid request", e,
+ throw new RemoteException("Invalid request: " + e.getMessage(), e,
/* enableSuppression */ true, /* writableStackTrace */ true);
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 20ccfa8..a3ab27e 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -1458,16 +1458,18 @@
@Nullable IRecentsAnimationRunner recentsAnimationRunner) {
enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()");
final int callingPid = Binder.getCallingPid();
+ final int callingUid = Binder.getCallingUid();
final long origId = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
final ComponentName recentsComponent = mRecentTasks.getRecentsComponent();
final int recentsUid = mRecentTasks.getRecentsComponentUid();
+ final WindowProcessController caller = getProcessController(callingPid, callingUid);
// Start a new recents animation
final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor,
getActivityStartController(), mWindowManager, intent, recentsComponent,
- recentsUid, callingPid);
+ recentsUid, caller);
if (recentsAnimationRunner == null) {
anim.preloadRecentsActivity();
} else {
@@ -4581,7 +4583,7 @@
public void registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition) {
mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
"registerRemoteAnimations");
- definition.setCallingPid(Binder.getCallingPid());
+ definition.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
synchronized (mGlobalLock) {
final ActivityRecord r = ActivityRecord.isInStackLocked(token);
if (r == null) {
@@ -4601,7 +4603,7 @@
RemoteAnimationAdapter adapter) {
mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
"registerRemoteAnimationForNextActivityStart");
- adapter.setCallingPid(Binder.getCallingPid());
+ adapter.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
synchronized (mGlobalLock) {
final long origId = Binder.clearCallingIdentity();
try {
@@ -4618,7 +4620,7 @@
RemoteAnimationDefinition definition) {
mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
"registerRemoteAnimations");
- definition.setCallingPid(Binder.getCallingPid());
+ definition.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
synchronized (mGlobalLock) {
final ActivityDisplay display = mRootActivityContainer.getActivityDisplay(displayId);
if (display == null) {
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index aefc152..7fde6de 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -207,6 +207,7 @@
boolean removed;
// Information about an application starting window if displayed.
+ // Note: these are de-referenced before the starting window animates away.
StartingData mStartingData;
WindowState startingWindow;
StartingSurface startingSurface;
@@ -1249,6 +1250,21 @@
return true;
}
+ /**
+ * @return {@code true} if starting window is in app's hierarchy.
+ */
+ boolean hasStartingWindow() {
+ if (startingDisplayed || mStartingData != null) {
+ return true;
+ }
+ for (int i = mChildren.size() - 1; i >= 0; i--) {
+ if (getChildAt(i).mAttrs.type == TYPE_APPLICATION_STARTING) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@Override
void addWindow(WindowState w) {
super.addWindow(w);
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index faf75b6..c8e806e 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -67,6 +67,7 @@
import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
+import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
@@ -136,6 +137,8 @@
import static com.android.server.wm.WindowManagerService.WINDOW_FREEZE_TIMEOUT_DURATION;
import static com.android.server.wm.WindowManagerService.dipToPixel;
import static com.android.server.wm.WindowManagerService.logSurface;
+import static com.android.server.wm.WindowState.EXCLUSION_LEFT;
+import static com.android.server.wm.WindowState.EXCLUSION_RIGHT;
import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP;
import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING;
import static com.android.server.wm.WindowStateAnimator.READY_TO_SHOW;
@@ -328,6 +331,8 @@
private final RemoteCallbackList<ISystemGestureExclusionListener>
mSystemGestureExclusionListeners = new RemoteCallbackList<>();
private final Region mSystemGestureExclusion = new Region();
+ private boolean mSystemGestureExclusionWasRestricted = false;
+ private final Region mSystemGestureExclusionUnrestricted = new Region();
private int mSystemGestureExclusionLimit;
/**
@@ -4871,9 +4876,13 @@
//
// In the case where we have no IME target we assign it where it's base layer would
// place it in the AboveAppWindowContainers.
- if (imeTarget != null && !(imeTarget.inSplitScreenWindowingMode()
- || imeTarget.mToken.isAppAnimating())
- && (imeTarget.getSurfaceControl() != null)) {
+ //
+ // Keep IME window in mAboveAppWindowsContainers as long as app's starting window exists
+ // so it get's layered above the starting window.
+ if (imeTarget != null
+ && !(imeTarget.mAppToken != null && imeTarget.mAppToken.hasStartingWindow())
+ && (!(imeTarget.inSplitScreenWindowingMode() || imeTarget.mToken.isAppAnimating())
+ && (imeTarget.getSurfaceControl() != null))) {
mImeWindowsContainers.assignRelativeLayer(t, imeTarget.getSurfaceControl(),
// TODO: We need to use an extra level on the app surface to ensure
// this is always above SurfaceView but always below attached window.
@@ -5161,16 +5170,21 @@
return false;
}
- final Region systemGestureExclusion = calculateSystemGestureExclusion();
+ final Region systemGestureExclusion = Region.obtain();
+ mSystemGestureExclusionWasRestricted = calculateSystemGestureExclusion(
+ systemGestureExclusion, mSystemGestureExclusionUnrestricted);
try {
if (mSystemGestureExclusion.equals(systemGestureExclusion)) {
return false;
}
mSystemGestureExclusion.set(systemGestureExclusion);
+ final Region unrestrictedOrNull = mSystemGestureExclusionWasRestricted
+ ? mSystemGestureExclusionUnrestricted : null;
for (int i = mSystemGestureExclusionListeners.beginBroadcast() - 1; i >= 0; --i) {
try {
mSystemGestureExclusionListeners.getBroadcastItem(i)
- .onSystemGestureExclusionChanged(mDisplayId, systemGestureExclusion);
+ .onSystemGestureExclusionChanged(mDisplayId, systemGestureExclusion,
+ unrestrictedOrNull);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to notify SystemGestureExclusionListener", e);
}
@@ -5182,8 +5196,22 @@
}
}
+ /**
+ * Calculates the system gesture exclusion.
+ *
+ * @param outExclusion will be set to the gesture exclusion region
+ * @param outExclusionUnrestricted will be set to the gesture exclusion region without
+ * any restrictions applied.
+ * @return whether any restrictions were applied, i.e. outExclusion and outExclusionUnrestricted
+ * differ.
+ */
@VisibleForTesting
- Region calculateSystemGestureExclusion() {
+ boolean calculateSystemGestureExclusion(Region outExclusion, @Nullable
+ Region outExclusionUnrestricted) {
+ outExclusion.setEmpty();
+ if (outExclusionUnrestricted != null) {
+ outExclusionUnrestricted.setEmpty();
+ }
final Region unhandled = Region.obtain();
unhandled.set(0, 0, mDisplayFrames.mDisplayWidth, mDisplayFrames.mDisplayHeight);
@@ -5192,7 +5220,6 @@
final Rect rightEdge = mInsetsStateController.getSourceProvider(TYPE_RIGHT_GESTURES)
.getSource().getFrame();
- final Region global = Region.obtain();
final Region touchableRegion = Region.obtain();
final Region local = Region.obtain();
final int[] remainingLeftRight =
@@ -5230,28 +5257,39 @@
if (needsGestureExclusionRestrictions(w, mLastDispatchedSystemUiVisibility)) {
// Processes the region along the left edge.
- remainingLeftRight[0] = addToGlobalAndConsumeLimit(local, global, leftEdge,
- remainingLeftRight[0]);
+ remainingLeftRight[0] = addToGlobalAndConsumeLimit(local, outExclusion, leftEdge,
+ remainingLeftRight[0], w, EXCLUSION_LEFT);
// Processes the region along the right edge.
- remainingLeftRight[1] = addToGlobalAndConsumeLimit(local, global, rightEdge,
- remainingLeftRight[1]);
+ remainingLeftRight[1] = addToGlobalAndConsumeLimit(local, outExclusion, rightEdge,
+ remainingLeftRight[1], w, EXCLUSION_RIGHT);
// Adds the middle (unrestricted area)
final Region middle = Region.obtain(local);
middle.op(leftEdge, Op.DIFFERENCE);
middle.op(rightEdge, Op.DIFFERENCE);
- global.op(middle, Op.UNION);
+ outExclusion.op(middle, Op.UNION);
middle.recycle();
} else {
- global.op(local, Op.UNION);
+ boolean loggable = needsGestureExclusionRestrictions(w, 0 /* lastSysUiVis */);
+ if (loggable) {
+ addToGlobalAndConsumeLimit(local, outExclusion, leftEdge,
+ Integer.MAX_VALUE, w, EXCLUSION_LEFT);
+ addToGlobalAndConsumeLimit(local, outExclusion, rightEdge,
+ Integer.MAX_VALUE, w, EXCLUSION_RIGHT);
+ }
+ outExclusion.op(local, Op.UNION);
+ }
+ if (outExclusionUnrestricted != null) {
+ outExclusionUnrestricted.op(local, Op.UNION);
}
unhandled.op(touchableRegion, Op.DIFFERENCE);
}, true /* topToBottom */);
local.recycle();
touchableRegion.recycle();
unhandled.recycle();
- return global;
+ return remainingLeftRight[0] < mSystemGestureExclusionLimit
+ || remainingLeftRight[1] < mSystemGestureExclusionLimit;
}
/**
@@ -5269,31 +5307,57 @@
}
/**
+ * @return Whether gesture exclusion area should be logged for the given window
+ */
+ static boolean logsGestureExclusionRestrictions(WindowState win) {
+ if (win.mWmService.mSystemGestureExclusionLogDebounceTimeoutMillis <= 0) {
+ return false;
+ }
+ final WindowManager.LayoutParams attrs = win.getAttrs();
+ final int type = attrs.type;
+ return type != TYPE_WALLPAPER
+ && type != TYPE_APPLICATION_STARTING
+ && type != TYPE_NAVIGATION_BAR
+ && (attrs.flags & FLAG_NOT_TOUCHABLE) == 0
+ && needsGestureExclusionRestrictions(win, 0 /* sysUiVisibility */)
+ && win.getDisplayContent().mDisplayPolicy.hasSideGestures();
+ }
+
+ /**
* Adds a local gesture exclusion area to the global area while applying a limit per edge.
*
* @param local The gesture exclusion area to add.
* @param global The destination.
* @param edge Only processes the part in that region.
* @param limit How much limit in pixels we have.
- * @return How much of the limit are remaining.
+ * @param win The WindowState that is being processed
+ * @param side The side that is being processed, either {@link WindowState#EXCLUSION_LEFT} or
+ * {@link WindowState#EXCLUSION_RIGHT}
+ * @return How much of the limit is remaining.
*/
private static int addToGlobalAndConsumeLimit(Region local, Region global, Rect edge,
- int limit) {
+ int limit, WindowState win, int side) {
final Region r = Region.obtain(local);
r.op(edge, Op.INTERSECT);
final int[] remaining = {limit};
+ final int[] requestedExclusion = {0};
forEachRectReverse(r, rect -> {
if (remaining[0] <= 0) {
return;
}
final int height = rect.height();
+ requestedExclusion[0] += height;
if (height > remaining[0]) {
rect.top = rect.bottom - remaining[0];
}
remaining[0] -= height;
global.op(rect, Op.UNION);
});
+
+ final int grantedExclusion = limit - remaining[0];
+ win.setLastExclusionHeights(side, requestedExclusion[0], grantedExclusion);
+
r.recycle();
return remaining[0];
}
@@ -5308,10 +5372,13 @@
}
if (!changed) {
+ final Region unrestrictedOrNull = mSystemGestureExclusionWasRestricted
+ ? mSystemGestureExclusionUnrestricted : null;
// If updateSystemGestureExclusion changed the exclusion, it will already have
// notified the listener. Otherwise, we'll do it here.
try {
- listener.onSystemGestureExclusionChanged(mDisplayId, mSystemGestureExclusion);
+ listener.onSystemGestureExclusionChanged(mDisplayId, mSystemGestureExclusion,
+ unrestrictedOrNull);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to notify SystemGestureExclusionListener during register", e);
}
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 1576873..a4476f0 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -480,9 +480,10 @@
@Override
public void onSwipeFromRight() {
- final Region excludedRegion;
+ final Region excludedRegion = Region.obtain();
synchronized (mLock) {
- excludedRegion = mDisplayContent.calculateSystemGestureExclusion();
+ mDisplayContent.calculateSystemGestureExclusion(
+ excludedRegion, null /* outUnrestricted */);
}
final boolean sideAllowed = mNavigationBarAlwaysShowOnSideGesture
|| mNavigationBarPosition == NAV_BAR_RIGHT;
@@ -490,13 +491,15 @@
&& !mSystemGestures.currentGestureStartedInRegion(excludedRegion)) {
requestTransientBars(mNavigationBar);
}
+ excludedRegion.recycle();
}
@Override
public void onSwipeFromLeft() {
- final Region excludedRegion;
+ final Region excludedRegion = Region.obtain();
synchronized (mLock) {
- excludedRegion = mDisplayContent.calculateSystemGestureExclusion();
+ mDisplayContent.calculateSystemGestureExclusion(
+ excludedRegion, null /* outUnrestricted */);
}
final boolean sideAllowed = mNavigationBarAlwaysShowOnSideGesture
|| mNavigationBarPosition == NAV_BAR_LEFT;
@@ -504,6 +507,7 @@
&& !mSystemGestures.currentGestureStartedInRegion(excludedRegion)) {
requestTransientBars(mNavigationBar);
}
+ excludedRegion.recycle();
}
@Override
@@ -676,6 +680,10 @@
return mHasStatusBar;
}
+ boolean hasSideGestures() {
+ return mHasNavigationBar && mSideGestureInset > 0;
+ }
+
public boolean navigationBarCanMove() {
return mNavigationBarCanMove;
}
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index 553b0ff..c8f7af5 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -147,12 +147,6 @@
return mIsClosing;
}
- private void hideInputSurface() {
- if (mInputSurface != null) {
- mTransaction.hide(mInputSurface).apply();
- }
- }
-
private void showInputSurface() {
if (mInputSurface == null) {
mInputSurface = mService.makeSurfaceBuilder(
@@ -198,8 +192,6 @@
mInputInterceptor = null;
}
- hideInputSurface();
-
// Send drag end broadcast if drag start has been sent.
if (mDragInProgress) {
final int myPid = Process.myPid();
@@ -239,6 +231,10 @@
}
// Clear the internal variables.
+ if (mInputSurface != null) {
+ mTransaction.remove(mInputSurface).apply();
+ mInputSurface = null;
+ }
if (mSurfaceControl != null) {
mTransaction.reparent(mSurfaceControl, null).apply();
mSurfaceControl = null;
diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java
index 0a3e7a4..036bef7 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimation.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimation.java
@@ -33,6 +33,7 @@
import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_TOP;
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RECENTS_ANIMATIONS;
+import android.annotation.Nullable;
import android.app.ActivityOptions;
import android.content.ComponentName;
import android.content.Intent;
@@ -60,7 +61,7 @@
private final Intent mTargetIntent;
private final ComponentName mRecentsComponent;
private final int mRecentsUid;
- private final int mCallingPid;
+ private final @Nullable WindowProcessController mCaller;
private final int mUserId;
private final int mTargetActivityType;
@@ -76,7 +77,8 @@
RecentsAnimation(ActivityTaskManagerService atm, ActivityStackSupervisor stackSupervisor,
ActivityStartController activityStartController, WindowManagerService wm,
- Intent targetIntent, ComponentName recentsComponent, int recentsUid, int callingPid) {
+ Intent targetIntent, ComponentName recentsComponent, int recentsUid,
+ @Nullable WindowProcessController caller) {
mService = atm;
mStackSupervisor = stackSupervisor;
mDefaultDisplay = mService.mRootActivityContainer.getDefaultDisplay();
@@ -85,7 +87,7 @@
mTargetIntent = targetIntent;
mRecentsComponent = recentsComponent;
mRecentsUid = recentsUid;
- mCallingPid = callingPid;
+ mCaller = caller;
mUserId = atm.getCurrentUserId();
mTargetActivityType = targetIntent.getComponent() != null
&& recentsComponent.equals(targetIntent.getComponent())
@@ -190,7 +192,9 @@
mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunching(mTargetIntent);
- mService.mH.post(() -> mService.mAmInternal.setRunningRemoteAnimation(mCallingPid, true));
+ if (mCaller != null) {
+ mCaller.setRunningRecentsAnimation(true);
+ }
mWindowManager.deferSurfaceLayout();
try {
@@ -286,8 +290,9 @@
mService.stopAppSwitches();
}
- mService.mH.post(
- () -> mService.mAmInternal.setRunningRemoteAnimation(mCallingPid, false));
+ if (mCaller != null) {
+ mCaller.setRunningRecentsAnimation(false);
+ }
mWindowManager.inSurfaceTransaction(() -> {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER,
@@ -453,7 +458,7 @@
/**
* Called only when the animation should be canceled prior to starting.
*/
- private void notifyAnimationCancelBeforeStart(IRecentsAnimationRunner recentsAnimationRunner) {
+ static void notifyAnimationCancelBeforeStart(IRecentsAnimationRunner recentsAnimationRunner) {
try {
recentsAnimationRunner.onAnimationCanceled(false /* deferredWithScreenshot */);
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index b4bfedd..a1bc406 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -129,7 +129,7 @@
writeStartDebugStatement();
}
});
- sendRunningRemoteAnimation(true);
+ setRunningRemoteAnimation(true);
}
void cancelAnimation(String reason) {
@@ -216,7 +216,7 @@
mService.closeSurfaceTransaction("RemoteAnimationController#finished");
}
}
- sendRunningRemoteAnimation(false);
+ setRunningRemoteAnimation(false);
if (DEBUG_REMOTE_ANIMATIONS) Slog.i(TAG, "Finishing remote animation");
}
@@ -235,12 +235,18 @@
}
}
- private void sendRunningRemoteAnimation(boolean running) {
+ private void setRunningRemoteAnimation(boolean running) {
final int pid = mRemoteAnimationAdapter.getCallingPid();
+ final int uid = mRemoteAnimationAdapter.getCallingUid();
if (pid == 0) {
throw new RuntimeException("Calling pid of remote animation was null");
}
- mService.sendSetRunningRemoteAnimation(pid, running);
+ final WindowProcessController wpc = mService.mAtmService.getProcessController(pid, uid);
+ if (wpc == null) {
+ Slog.w(TAG, "Unable to find process with pid=" + pid + " uid=" + uid);
+ return;
+ }
+ wpc.setRunningRemoteAnimation(running);
}
private void linkToDeathOfRunner() throws RemoteException {
@@ -417,7 +423,7 @@
mHandler.removeCallbacks(mTimeoutRunnable);
releaseFinishedCallback();
invokeAnimationCancelled();
- sendRunningRemoteAnimation(false);
+ setRunningRemoteAnimation(false);
}
}
diff --git a/services/core/java/com/android/server/wm/SafeActivityOptions.java b/services/core/java/com/android/server/wm/SafeActivityOptions.java
index ac90283..a7b5368 100644
--- a/services/core/java/com/android/server/wm/SafeActivityOptions.java
+++ b/services/core/java/com/android/server/wm/SafeActivityOptions.java
@@ -122,17 +122,20 @@
if (mOriginalOptions != null) {
checkPermissions(intent, aInfo, callerApp, supervisor, mOriginalOptions,
mOriginalCallingPid, mOriginalCallingUid);
- setCallingPidForRemoteAnimationAdapter(mOriginalOptions, mOriginalCallingPid);
+ setCallingPidUidForRemoteAnimationAdapter(mOriginalOptions, mOriginalCallingPid,
+ mOriginalCallingUid);
}
if (mCallerOptions != null) {
checkPermissions(intent, aInfo, callerApp, supervisor, mCallerOptions,
mRealCallingPid, mRealCallingUid);
- setCallingPidForRemoteAnimationAdapter(mCallerOptions, mRealCallingPid);
+ setCallingPidUidForRemoteAnimationAdapter(mCallerOptions, mRealCallingPid,
+ mRealCallingUid);
}
return mergeActivityOptions(mOriginalOptions, mCallerOptions);
}
- private void setCallingPidForRemoteAnimationAdapter(ActivityOptions options, int callingPid) {
+ private void setCallingPidUidForRemoteAnimationAdapter(ActivityOptions options,
+ int callingPid, int callingUid) {
final RemoteAnimationAdapter adapter = options.getRemoteAnimationAdapter();
if (adapter == null) {
return;
@@ -141,7 +144,7 @@
Slog.wtf(TAG, "Safe activity options constructed after clearing calling id");
return;
}
- adapter.setCallingPid(callingPid);
+ adapter.setCallingPidUid(callingPid, callingUid);
}
/**
diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
index b94a7dc..cb15f57 100644
--- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -42,184 +42,54 @@
import java.io.PrintWriter;
class ScreenRotationAnimation {
- static final String TAG = TAG_WITH_CLASS_NAME ? "ScreenRotationAnimation" : TAG_WM;
- static final boolean DEBUG_STATE = false;
- static final boolean DEBUG_TRANSFORMS = false;
- static final boolean TWO_PHASE_ANIMATION = false;
- static final boolean USE_CUSTOM_BLACK_FRAME = false;
+ private static final String TAG = TAG_WITH_CLASS_NAME ? "ScreenRotationAnimation" : TAG_WM;
/*
* Layers for screen rotation animation. We put these layers above
* WINDOW_FREEZE_LAYER so that screen freeze will cover all windows.
*/
- static final int SCREEN_FREEZE_LAYER_BASE = WINDOW_FREEZE_LAYER + TYPE_LAYER_MULTIPLIER;
- static final int SCREEN_FREEZE_LAYER_ENTER = SCREEN_FREEZE_LAYER_BASE;
- static final int SCREEN_FREEZE_LAYER_SCREENSHOT = SCREEN_FREEZE_LAYER_BASE + 1;
- static final int SCREEN_FREEZE_LAYER_EXIT = SCREEN_FREEZE_LAYER_BASE + 2;
- static final int SCREEN_FREEZE_LAYER_CUSTOM = SCREEN_FREEZE_LAYER_BASE + 3;
+ private static final int SCREEN_FREEZE_LAYER_BASE = WINDOW_FREEZE_LAYER + TYPE_LAYER_MULTIPLIER;
+ private static final int SCREEN_FREEZE_LAYER_ENTER = SCREEN_FREEZE_LAYER_BASE;
+ private static final int SCREEN_FREEZE_LAYER_SCREENSHOT = SCREEN_FREEZE_LAYER_BASE + 1;
+ private static final int SCREEN_FREEZE_LAYER_EXIT = SCREEN_FREEZE_LAYER_BASE + 2;
- final Context mContext;
- final DisplayContent mDisplayContent;
- SurfaceControl mSurfaceControl;
- BlackFrame mCustomBlackFrame;
- BlackFrame mExitingBlackFrame;
- BlackFrame mEnteringBlackFrame;
- int mWidth, mHeight;
+ private final Context mContext;
+ private final DisplayContent mDisplayContent;
+ private final float[] mTmpFloats = new float[9];
+ private final Transformation mRotateExitTransformation = new Transformation();
+ private final Transformation mRotateEnterTransformation = new Transformation();
+ // Complete transformations being applied.
+ private final Transformation mExitTransformation = new Transformation();
+ private final Transformation mEnterTransformation = new Transformation();
+ private final Matrix mFrameInitialMatrix = new Matrix();
+ private final Matrix mSnapshotInitialMatrix = new Matrix();
+ private final Matrix mSnapshotFinalMatrix = new Matrix();
+ private final Matrix mExitFrameFinalMatrix = new Matrix();
+ private final WindowManagerService mService;
+ private SurfaceControl mSurfaceControl;
+ private BlackFrame mEnteringBlackFrame;
+ private int mWidth, mHeight;
- int mOriginalRotation;
- int mOriginalWidth, mOriginalHeight;
- int mCurRotation;
- Rect mOriginalDisplayRect = new Rect();
- Rect mCurrentDisplayRect = new Rect();
+ private int mOriginalRotation;
+ private int mOriginalWidth, mOriginalHeight;
+ private int mCurRotation;
- // For all animations, "exit" is for the UI elements that are going
- // away (that is the snapshot of the old screen), and "enter" is for
- // the new UI elements that are appearing (that is the active windows
- // in their final orientation).
-
- // The starting animation for the exiting and entering elements. This
- // animation applies a transformation while the rotation is in progress.
- // It is started immediately, before the new entering UI is ready.
- Animation mStartExitAnimation;
- final Transformation mStartExitTransformation = new Transformation();
- Animation mStartEnterAnimation;
- final Transformation mStartEnterTransformation = new Transformation();
- Animation mStartFrameAnimation;
- final Transformation mStartFrameTransformation = new Transformation();
-
- // The finishing animation for the exiting and entering elements. This
- // animation needs to undo the transformation of the starting animation.
- // It starts running once the new rotation UI elements are ready to be
- // displayed.
- Animation mFinishExitAnimation;
- final Transformation mFinishExitTransformation = new Transformation();
- Animation mFinishEnterAnimation;
- final Transformation mFinishEnterTransformation = new Transformation();
- Animation mFinishFrameAnimation;
- final Transformation mFinishFrameTransformation = new Transformation();
-
+ private Rect mOriginalDisplayRect = new Rect();
+ private Rect mCurrentDisplayRect = new Rect();
// The current active animation to move from the old to the new rotated
// state. Which animation is run here will depend on the old and new
// rotations.
- Animation mRotateExitAnimation;
- final Transformation mRotateExitTransformation = new Transformation();
- Animation mRotateEnterAnimation;
- final Transformation mRotateEnterTransformation = new Transformation();
- Animation mRotateFrameAnimation;
- final Transformation mRotateFrameTransformation = new Transformation();
-
- // A previously running rotate animation. This will be used if we need
- // to switch to a new rotation before finishing the previous one.
- Animation mLastRotateExitAnimation;
- final Transformation mLastRotateExitTransformation = new Transformation();
- Animation mLastRotateEnterAnimation;
- final Transformation mLastRotateEnterTransformation = new Transformation();
- Animation mLastRotateFrameAnimation;
- final Transformation mLastRotateFrameTransformation = new Transformation();
-
- // Complete transformations being applied.
- final Transformation mExitTransformation = new Transformation();
- final Transformation mEnterTransformation = new Transformation();
- final Transformation mFrameTransformation = new Transformation();
-
- boolean mStarted;
- boolean mAnimRunning;
- boolean mFinishAnimReady;
- long mFinishAnimStartTime;
- boolean mForceDefaultOrientation;
-
- final Matrix mFrameInitialMatrix = new Matrix();
- final Matrix mSnapshotInitialMatrix = new Matrix();
- final Matrix mSnapshotFinalMatrix = new Matrix();
- final Matrix mExitFrameFinalMatrix = new Matrix();
- final Matrix mTmpMatrix = new Matrix();
- final float[] mTmpFloats = new float[9];
+ private Animation mRotateExitAnimation;
+ private Animation mRotateEnterAnimation;
+ private boolean mStarted;
+ private boolean mAnimRunning;
+ private boolean mFinishAnimReady;
+ private long mFinishAnimStartTime;
+ private boolean mForceDefaultOrientation;
+ private BlackFrame mExitingBlackFrame;
private boolean mMoreRotateEnter;
private boolean mMoreRotateExit;
- private boolean mMoreRotateFrame;
- private boolean mMoreFinishEnter;
- private boolean mMoreFinishExit;
- private boolean mMoreFinishFrame;
- private boolean mMoreStartEnter;
- private boolean mMoreStartExit;
- private boolean mMoreStartFrame;
- long mHalfwayPoint;
-
- private final WindowManagerService mService;
-
- public void printTo(String prefix, PrintWriter pw) {
- pw.print(prefix); pw.print("mSurface="); pw.print(mSurfaceControl);
- pw.print(" mWidth="); pw.print(mWidth);
- pw.print(" mHeight="); pw.println(mHeight);
- if (USE_CUSTOM_BLACK_FRAME) {
- pw.print(prefix); pw.print("mCustomBlackFrame="); pw.println(mCustomBlackFrame);
- if (mCustomBlackFrame != null) {
- mCustomBlackFrame.printTo(prefix + " ", pw);
- }
- }
- pw.print(prefix); pw.print("mExitingBlackFrame="); pw.println(mExitingBlackFrame);
- if (mExitingBlackFrame != null) {
- mExitingBlackFrame.printTo(prefix + " ", pw);
- }
- pw.print(prefix); pw.print("mEnteringBlackFrame="); pw.println(mEnteringBlackFrame);
- if (mEnteringBlackFrame != null) {
- mEnteringBlackFrame.printTo(prefix + " ", pw);
- }
- pw.print(prefix); pw.print("mCurRotation="); pw.print(mCurRotation);
- pw.print(" mOriginalRotation="); pw.println(mOriginalRotation);
- pw.print(prefix); pw.print("mOriginalWidth="); pw.print(mOriginalWidth);
- pw.print(" mOriginalHeight="); pw.println(mOriginalHeight);
- pw.print(prefix); pw.print("mStarted="); pw.print(mStarted);
- pw.print(" mAnimRunning="); pw.print(mAnimRunning);
- pw.print(" mFinishAnimReady="); pw.print(mFinishAnimReady);
- pw.print(" mFinishAnimStartTime="); pw.println(mFinishAnimStartTime);
- pw.print(prefix); pw.print("mStartExitAnimation="); pw.print(mStartExitAnimation);
- pw.print(" "); mStartExitTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mStartEnterAnimation="); pw.print(mStartEnterAnimation);
- pw.print(" "); mStartEnterTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mStartFrameAnimation="); pw.print(mStartFrameAnimation);
- pw.print(" "); mStartFrameTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFinishExitAnimation="); pw.print(mFinishExitAnimation);
- pw.print(" "); mFinishExitTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFinishEnterAnimation="); pw.print(mFinishEnterAnimation);
- pw.print(" "); mFinishEnterTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFinishFrameAnimation="); pw.print(mFinishFrameAnimation);
- pw.print(" "); mFinishFrameTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mRotateExitAnimation="); pw.print(mRotateExitAnimation);
- pw.print(" "); mRotateExitTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mRotateEnterAnimation="); pw.print(mRotateEnterAnimation);
- pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mRotateFrameAnimation="); pw.print(mRotateFrameAnimation);
- pw.print(" "); mRotateFrameTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mExitTransformation=");
- mExitTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mEnterTransformation=");
- mEnterTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFrameTransformation=");
- mFrameTransformation.printShortString(pw); pw.println();
- pw.print(prefix); pw.print("mFrameInitialMatrix=");
- mFrameInitialMatrix.printShortString(pw);
- pw.println();
- pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
- mSnapshotInitialMatrix.printShortString(pw);
- pw.print(" mSnapshotFinalMatrix="); mSnapshotFinalMatrix.printShortString(pw);
- pw.println();
- pw.print(prefix); pw.print("mExitFrameFinalMatrix=");
- mExitFrameFinalMatrix.printShortString(pw);
- pw.println();
- pw.print(prefix); pw.print("mForceDefaultOrientation="); pw.print(mForceDefaultOrientation);
- if (mForceDefaultOrientation) {
- pw.print(" mOriginalDisplayRect="); pw.print(mOriginalDisplayRect.toShortString());
- pw.print(" mCurrentDisplayRect="); pw.println(mCurrentDisplayRect.toShortString());
- }
- }
-
- public void writeToProto(ProtoOutputStream proto, long fieldId) {
- final long token = proto.start(fieldId);
- proto.write(STARTED, mStarted);
- proto.write(ANIMATION_RUNNING, mAnimRunning);
- proto.end(token);
- }
+ private long mHalfwayPoint;
public ScreenRotationAnimation(Context context, DisplayContent displayContent,
boolean fixedToUserRotation, boolean isSecure, WindowManagerService service) {
@@ -276,7 +146,7 @@
final Surface surface = mService.mSurfaceFactory.make();
surface.copyFrom(mSurfaceControl);
SurfaceControl.ScreenshotGraphicBuffer gb =
- mService.mDisplayManagerInternal.screenshot(displayId);
+ mService.mDisplayManagerInternal.screenshot(displayId);
if (gb != null) {
try {
surface.attachAndQueueBufferWithColorSpace(gb.getGraphicBuffer(),
@@ -301,12 +171,42 @@
Slog.w(TAG, "Unable to allocate freeze surface", e);
}
- if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
- " FREEZE " + mSurfaceControl + ": CREATE");
+ if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) {
+ Slog.i(TAG_WM,
+ " FREEZE " + mSurfaceControl + ": CREATE");
+ }
setRotation(t, originalRotation);
t.apply();
}
+ private static void createRotationMatrix(int rotation, int width, int height,
+ Matrix outMatrix) {
+ switch (rotation) {
+ case Surface.ROTATION_0:
+ outMatrix.reset();
+ break;
+ case Surface.ROTATION_90:
+ outMatrix.setRotate(90, 0, 0);
+ outMatrix.postTranslate(height, 0);
+ break;
+ case Surface.ROTATION_180:
+ outMatrix.setRotate(180, 0, 0);
+ outMatrix.postTranslate(width, height);
+ break;
+ case Surface.ROTATION_270:
+ outMatrix.setRotate(270, 0, 0);
+ outMatrix.postTranslate(0, width);
+ break;
+ }
+ }
+
+ public void writeToProto(ProtoOutputStream proto, long fieldId) {
+ final long token = proto.start(fieldId);
+ proto.write(STARTED, mStarted);
+ proto.write(ANIMATION_RUNNING, mAnimRunning);
+ proto.end(token);
+ }
+
boolean hasScreenshot() {
return mSurfaceControl != null;
}
@@ -326,40 +226,55 @@
mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y],
mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]);
t.setAlpha(mSurfaceControl, alpha);
- if (DEBUG_TRANSFORMS) {
- float[] srcPnts = new float[] { 0, 0, mWidth, mHeight };
- float[] dstPnts = new float[4];
- matrix.mapPoints(dstPnts, srcPnts);
- Slog.i(TAG, "Original : (" + srcPnts[0] + "," + srcPnts[1]
- + ")-(" + srcPnts[2] + "," + srcPnts[3] + ")");
- Slog.i(TAG, "Transformed: (" + dstPnts[0] + "," + dstPnts[1]
- + ")-(" + dstPnts[2] + "," + dstPnts[3] + ")");
- }
}
}
- public static void createRotationMatrix(int rotation, int width, int height,
- Matrix outMatrix) {
- switch (rotation) {
- case Surface.ROTATION_0:
- outMatrix.reset();
- break;
- case Surface.ROTATION_90:
- outMatrix.setRotate(90, 0, 0);
- outMatrix.postTranslate(height, 0);
- break;
- case Surface.ROTATION_180:
- outMatrix.setRotate(180, 0, 0);
- outMatrix.postTranslate(width, height);
- break;
- case Surface.ROTATION_270:
- outMatrix.setRotate(270, 0, 0);
- outMatrix.postTranslate(0, width);
- break;
+ public void printTo(String prefix, PrintWriter pw) {
+ pw.print(prefix); pw.print("mSurface="); pw.print(mSurfaceControl);
+ pw.print(" mWidth="); pw.print(mWidth);
+ pw.print(" mHeight="); pw.println(mHeight);
+ pw.print(prefix); pw.print("mExitingBlackFrame="); pw.println(mExitingBlackFrame);
+ if (mExitingBlackFrame != null) {
+ mExitingBlackFrame.printTo(prefix + " ", pw);
+ }
+ pw.print(prefix); pw.print("mEnteringBlackFrame="); pw.println(mEnteringBlackFrame);
+ if (mEnteringBlackFrame != null) {
+ mEnteringBlackFrame.printTo(prefix + " ", pw);
+ }
+ pw.print(prefix); pw.print("mCurRotation="); pw.print(mCurRotation);
+ pw.print(" mOriginalRotation="); pw.println(mOriginalRotation);
+ pw.print(prefix); pw.print("mOriginalWidth="); pw.print(mOriginalWidth);
+ pw.print(" mOriginalHeight="); pw.println(mOriginalHeight);
+ pw.print(prefix); pw.print("mStarted="); pw.print(mStarted);
+ pw.print(" mAnimRunning="); pw.print(mAnimRunning);
+ pw.print(" mFinishAnimReady="); pw.print(mFinishAnimReady);
+ pw.print(" mFinishAnimStartTime="); pw.println(mFinishAnimStartTime);
+ pw.print(prefix); pw.print("mRotateExitAnimation="); pw.print(mRotateExitAnimation);
+ pw.print(" "); mRotateExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mRotateEnterAnimation="); pw.print(mRotateEnterAnimation);
+ pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mExitTransformation=");
+ mExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mEnterTransformation=");
+ mEnterTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mFrameInitialMatrix=");
+ mFrameInitialMatrix.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
+ mSnapshotInitialMatrix.printShortString(pw);
+ pw.print(" mSnapshotFinalMatrix="); mSnapshotFinalMatrix.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mExitFrameFinalMatrix=");
+ mExitFrameFinalMatrix.printShortString(pw);
+ pw.println();
+ pw.print(prefix); pw.print("mForceDefaultOrientation="); pw.print(mForceDefaultOrientation);
+ if (mForceDefaultOrientation) {
+ pw.print(" mOriginalDisplayRect="); pw.print(mOriginalDisplayRect.toShortString());
+ pw.print(" mCurrentDisplayRect="); pw.println(mCurrentDisplayRect.toShortString());
}
}
- private void setRotation(SurfaceControl.Transaction t, int rotation) {
+ public void setRotation(SurfaceControl.Transaction t, int rotation) {
mCurRotation = rotation;
// Compute the transformation matrix that must be applied
@@ -368,17 +283,12 @@
int delta = DisplayContent.deltaRotation(rotation, Surface.ROTATION_0);
createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix);
- if (DEBUG_STATE) Slog.v(TAG, "**** ROTATION: " + delta);
setSnapshotTransform(t, mSnapshotInitialMatrix, 1.0f);
}
public boolean setRotation(SurfaceControl.Transaction t, int rotation,
long maxAnimationDuration, float animationScale, int finalWidth, int finalHeight) {
setRotation(t, rotation);
- if (TWO_PHASE_ANIMATION) {
- return startAnimation(t, maxAnimationDuration, animationScale,
- finalWidth, finalHeight, false, 0, 0);
- }
// Don't start animation yet.
return false;
@@ -400,37 +310,9 @@
mStarted = true;
- boolean firstStart = false;
-
// Figure out how the screen has moved from the original rotation.
int delta = DisplayContent.deltaRotation(mCurRotation, mOriginalRotation);
- if (TWO_PHASE_ANIMATION && mFinishExitAnimation == null
- && (!dismissing || delta != Surface.ROTATION_0)) {
- if (DEBUG_STATE) Slog.v(TAG, "Creating start and finish animations");
- firstStart = true;
- mStartExitAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_start_exit);
- mStartEnterAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_start_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mStartFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_start_frame);
- }
- mFinishExitAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_finish_exit);
- mFinishEnterAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_finish_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mFinishFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_finish_frame);
- }
- }
-
- if (DEBUG_STATE) Slog.v(TAG, "Rotation delta: " + delta + " finalWidth="
- + finalWidth + " finalHeight=" + finalHeight
- + " origWidth=" + mOriginalWidth + " origHeight=" + mOriginalHeight);
-
final boolean customAnim;
if (exitAnim != 0 && enterAnim != 0) {
customAnim = true;
@@ -444,40 +326,24 @@
com.android.internal.R.anim.screen_rotate_0_exit);
mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_0_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_0_frame);
- }
break;
case Surface.ROTATION_90:
mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_plus_90_exit);
mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_plus_90_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_plus_90_frame);
- }
break;
case Surface.ROTATION_180:
mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_180_exit);
mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_180_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_180_frame);
- }
break;
case Surface.ROTATION_270:
mRotateExitAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_minus_90_exit);
mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext,
com.android.internal.R.anim.screen_rotate_minus_90_enter);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation = AnimationUtils.loadAnimation(mContext,
- com.android.internal.R.anim.screen_rotate_minus_90_frame);
- }
break;
}
}
@@ -486,85 +352,16 @@
// means to allow supplying the last and next size. In this definition
// "%p" is the original (let's call it "previous") size, and "%" is the
// screen's current/new size.
- if (TWO_PHASE_ANIMATION && firstStart) {
- // Compute partial steps between original and final sizes. These
- // are used for the dimensions of the exiting and entering elements,
- // so they are never stretched too significantly.
- final int halfWidth = (finalWidth + mOriginalWidth) / 2;
- final int halfHeight = (finalHeight + mOriginalHeight) / 2;
-
- if (DEBUG_STATE) Slog.v(TAG, "Initializing start and finish animations");
- mStartEnterAnimation.initialize(finalWidth, finalHeight,
- halfWidth, halfHeight);
- mStartExitAnimation.initialize(halfWidth, halfHeight,
- mOriginalWidth, mOriginalHeight);
- mFinishEnterAnimation.initialize(finalWidth, finalHeight,
- halfWidth, halfHeight);
- mFinishExitAnimation.initialize(halfWidth, halfHeight,
- mOriginalWidth, mOriginalHeight);
- if (USE_CUSTOM_BLACK_FRAME) {
- mStartFrameAnimation.initialize(finalWidth, finalHeight,
- mOriginalWidth, mOriginalHeight);
- mFinishFrameAnimation.initialize(finalWidth, finalHeight,
- mOriginalWidth, mOriginalHeight);
- }
- }
mRotateEnterAnimation.initialize(finalWidth, finalHeight, mOriginalWidth, mOriginalHeight);
mRotateExitAnimation.initialize(finalWidth, finalHeight, mOriginalWidth, mOriginalHeight);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation.initialize(finalWidth, finalHeight, mOriginalWidth,
- mOriginalHeight);
- }
mAnimRunning = false;
mFinishAnimReady = false;
mFinishAnimStartTime = -1;
- if (TWO_PHASE_ANIMATION && firstStart) {
- mStartExitAnimation.restrictDuration(maxAnimationDuration);
- mStartExitAnimation.scaleCurrentDuration(animationScale);
- mStartEnterAnimation.restrictDuration(maxAnimationDuration);
- mStartEnterAnimation.scaleCurrentDuration(animationScale);
- mFinishExitAnimation.restrictDuration(maxAnimationDuration);
- mFinishExitAnimation.scaleCurrentDuration(animationScale);
- mFinishEnterAnimation.restrictDuration(maxAnimationDuration);
- mFinishEnterAnimation.scaleCurrentDuration(animationScale);
- if (USE_CUSTOM_BLACK_FRAME) {
- mStartFrameAnimation.restrictDuration(maxAnimationDuration);
- mStartFrameAnimation.scaleCurrentDuration(animationScale);
- mFinishFrameAnimation.restrictDuration(maxAnimationDuration);
- mFinishFrameAnimation.scaleCurrentDuration(animationScale);
- }
- }
mRotateExitAnimation.restrictDuration(maxAnimationDuration);
mRotateExitAnimation.scaleCurrentDuration(animationScale);
mRotateEnterAnimation.restrictDuration(maxAnimationDuration);
mRotateEnterAnimation.scaleCurrentDuration(animationScale);
- if (USE_CUSTOM_BLACK_FRAME) {
- mRotateFrameAnimation.restrictDuration(maxAnimationDuration);
- mRotateFrameAnimation.scaleCurrentDuration(animationScale);
- }
-
- final int layerStack = mDisplayContent.getDisplay().getLayerStack();
- if (USE_CUSTOM_BLACK_FRAME && mCustomBlackFrame == null) {
- // Compute the transformation matrix that must be applied
- // the the black frame to make it stay in the initial position
- // before the new screen rotation. This is different than the
- // snapshot transformation because the snapshot is always based
- // of the native orientation of the screen, not the orientation
- // we were last in.
- createRotationMatrix(delta, mOriginalWidth, mOriginalHeight, mFrameInitialMatrix);
-
- try {
- Rect outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
- mOriginalWidth*2, mOriginalHeight*2);
- Rect inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
- mCustomBlackFrame = new BlackFrame(mService.mTransactionFactory, t, outer, inner,
- SCREEN_FREEZE_LAYER_CUSTOM, mDisplayContent, false);
- mCustomBlackFrame.setMatrix(t, mFrameInitialMatrix);
- } catch (OutOfResourcesException e) {
- Slog.w(TAG, "Unable to allocate black surface", e);
- }
- }
if (!customAnim && mExitingBlackFrame == null) {
try {
@@ -585,8 +382,8 @@
outer = mCurrentDisplayRect;
inner = mOriginalDisplayRect;
} else {
- outer = new Rect(-mOriginalWidth*1, -mOriginalHeight*1,
- mOriginalWidth*2, mOriginalHeight*2);
+ outer = new Rect(-mOriginalWidth * 1, -mOriginalHeight * 1,
+ mOriginalWidth * 2, mOriginalHeight * 2);
inner = new Rect(0, 0, mOriginalWidth, mOriginalHeight);
}
mExitingBlackFrame = new BlackFrame(mService.mTransactionFactory, t, outer, inner,
@@ -599,8 +396,8 @@
if (customAnim && mEnteringBlackFrame == null) {
try {
- Rect outer = new Rect(-finalWidth*1, -finalHeight*1,
- finalWidth*2, finalHeight*2);
+ Rect outer = new Rect(-finalWidth * 1, -finalHeight * 1,
+ finalWidth * 2, finalHeight * 2);
Rect inner = new Rect(0, 0, finalWidth, finalHeight);
mEnteringBlackFrame = new BlackFrame(mService.mTransactionFactory, t, outer, inner,
SCREEN_FREEZE_LAYER_ENTER, mDisplayContent, false);
@@ -617,7 +414,6 @@
*/
public boolean dismiss(SurfaceControl.Transaction t, long maxAnimationDuration,
float animationScale, int finalWidth, int finalHeight, int exitAnim, int enterAnim) {
- if (DEBUG_STATE) Slog.v(TAG, "Dismiss!");
if (mSurfaceControl == null) {
// Can't do animation.
return false;
@@ -629,24 +425,20 @@
if (!mStarted) {
return false;
}
- if (DEBUG_STATE) Slog.v(TAG, "Setting mFinishAnimReady = true");
mFinishAnimReady = true;
return true;
}
public void kill() {
- if (DEBUG_STATE) Slog.v(TAG, "Kill!");
if (mSurfaceControl != null) {
if (SHOW_TRANSACTIONS ||
- SHOW_SURFACE_ALLOC) Slog.i(TAG_WM,
- " FREEZE " + mSurfaceControl + ": DESTROY");
+ SHOW_SURFACE_ALLOC) {
+ Slog.i(TAG_WM,
+ " FREEZE " + mSurfaceControl + ": DESTROY");
+ }
mService.mTransactionFactory.make().remove(mSurfaceControl).apply();
mSurfaceControl = null;
}
- if (mCustomBlackFrame != null) {
- mCustomBlackFrame.kill();
- mCustomBlackFrame = null;
- }
if (mExitingBlackFrame != null) {
mExitingBlackFrame.kill();
mExitingBlackFrame = null;
@@ -655,38 +447,6 @@
mEnteringBlackFrame.kill();
mEnteringBlackFrame = null;
}
- if (TWO_PHASE_ANIMATION) {
- if (mStartExitAnimation != null) {
- mStartExitAnimation.cancel();
- mStartExitAnimation = null;
- }
- if (mStartEnterAnimation != null) {
- mStartEnterAnimation.cancel();
- mStartEnterAnimation = null;
- }
- if (mFinishExitAnimation != null) {
- mFinishExitAnimation.cancel();
- mFinishExitAnimation = null;
- }
- if (mFinishEnterAnimation != null) {
- mFinishEnterAnimation.cancel();
- mFinishEnterAnimation = null;
- }
- }
- if (USE_CUSTOM_BLACK_FRAME) {
- if (mStartFrameAnimation != null) {
- mStartFrameAnimation.cancel();
- mStartFrameAnimation = null;
- }
- if (mRotateFrameAnimation != null) {
- mRotateFrameAnimation.cancel();
- mRotateFrameAnimation = null;
- }
- if (mFinishFrameAnimation != null) {
- mFinishFrameAnimation.cancel();
- mFinishFrameAnimation = null;
- }
- }
if (mRotateExitAnimation != null) {
mRotateExitAnimation.cancel();
mRotateExitAnimation = null;
@@ -698,7 +458,7 @@
}
public boolean isAnimating() {
- return hasAnimations() || (TWO_PHASE_ANIMATION && mFinishAnimReady);
+ return hasAnimations();
}
public boolean isRotating() {
@@ -706,13 +466,7 @@
}
private boolean hasAnimations() {
- return (TWO_PHASE_ANIMATION &&
- (mStartEnterAnimation != null || mStartExitAnimation != null
- || mFinishEnterAnimation != null || mFinishExitAnimation != null))
- || (USE_CUSTOM_BLACK_FRAME &&
- (mStartFrameAnimation != null || mRotateFrameAnimation != null
- || mFinishFrameAnimation != null))
- || mRotateEnterAnimation != null || mRotateExitAnimation != null;
+ return mRotateEnterAnimation != null || mRotateExitAnimation != null;
}
private boolean stepAnimation(long now) {
@@ -720,177 +474,45 @@
mHalfwayPoint = Long.MAX_VALUE;
}
if (mFinishAnimReady && mFinishAnimStartTime < 0) {
- if (DEBUG_STATE) Slog.v(TAG, "Step: finish anim now ready");
mFinishAnimStartTime = now;
}
- if (TWO_PHASE_ANIMATION) {
- mMoreStartExit = false;
- if (mStartExitAnimation != null) {
- mMoreStartExit = mStartExitAnimation.getTransformation(now, mStartExitTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start exit: " + mStartExitTransformation);
- }
-
- mMoreStartEnter = false;
- if (mStartEnterAnimation != null) {
- mMoreStartEnter = mStartEnterAnimation.getTransformation(now, mStartEnterTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start enter: " + mStartEnterTransformation);
- }
- }
- if (USE_CUSTOM_BLACK_FRAME) {
- mMoreStartFrame = false;
- if (mStartFrameAnimation != null) {
- mMoreStartFrame = mStartFrameAnimation.getTransformation(now, mStartFrameTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start frame: " + mStartFrameTransformation);
- }
- }
-
- long finishNow = mFinishAnimReady ? (now - mFinishAnimStartTime) : 0;
- if (DEBUG_STATE) Slog.v(TAG, "Step: finishNow=" + finishNow);
-
- if (TWO_PHASE_ANIMATION) {
- mMoreFinishExit = false;
- if (mFinishExitAnimation != null) {
- mMoreFinishExit = mFinishExitAnimation.getTransformation(finishNow, mFinishExitTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish exit: " + mFinishExitTransformation);
- }
-
- mMoreFinishEnter = false;
- if (mFinishEnterAnimation != null) {
- mMoreFinishEnter = mFinishEnterAnimation.getTransformation(finishNow, mFinishEnterTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish enter: " + mFinishEnterTransformation);
- }
- }
- if (USE_CUSTOM_BLACK_FRAME) {
- mMoreFinishFrame = false;
- if (mFinishFrameAnimation != null) {
- mMoreFinishFrame = mFinishFrameAnimation.getTransformation(finishNow, mFinishFrameTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish frame: " + mFinishFrameTransformation);
- }
- }
-
mMoreRotateExit = false;
if (mRotateExitAnimation != null) {
- mMoreRotateExit = mRotateExitAnimation.getTransformation(now, mRotateExitTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate exit: " + mRotateExitTransformation);
+ mMoreRotateExit = mRotateExitAnimation.getTransformation(now,
+ mRotateExitTransformation);
}
mMoreRotateEnter = false;
if (mRotateEnterAnimation != null) {
- mMoreRotateEnter = mRotateEnterAnimation.getTransformation(now, mRotateEnterTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate enter: " + mRotateEnterTransformation);
+ mMoreRotateEnter = mRotateEnterAnimation.getTransformation(now,
+ mRotateEnterTransformation);
}
- if (USE_CUSTOM_BLACK_FRAME) {
- mMoreRotateFrame = false;
- if (mRotateFrameAnimation != null) {
- mMoreRotateFrame = mRotateFrameAnimation.getTransformation(now, mRotateFrameTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate frame: " + mRotateFrameTransformation);
- }
- }
-
- if (!mMoreRotateExit && (!TWO_PHASE_ANIMATION || (!mMoreStartExit && !mMoreFinishExit))) {
- if (TWO_PHASE_ANIMATION) {
- if (mStartExitAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing start exit anim!");
- mStartExitAnimation.cancel();
- mStartExitAnimation = null;
- mStartExitTransformation.clear();
- }
- if (mFinishExitAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing finish exit anim!");
- mFinishExitAnimation.cancel();
- mFinishExitAnimation = null;
- mFinishExitTransformation.clear();
- }
- }
+ if (!mMoreRotateExit) {
if (mRotateExitAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, clearing rotate exit anim!");
mRotateExitAnimation.cancel();
mRotateExitAnimation = null;
mRotateExitTransformation.clear();
}
}
- if (!mMoreRotateEnter && (!TWO_PHASE_ANIMATION || (!mMoreStartEnter && !mMoreFinishEnter))) {
- if (TWO_PHASE_ANIMATION) {
- if (mStartEnterAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing start enter anim!");
- mStartEnterAnimation.cancel();
- mStartEnterAnimation = null;
- mStartEnterTransformation.clear();
- }
- if (mFinishEnterAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing finish enter anim!");
- mFinishEnterAnimation.cancel();
- mFinishEnterAnimation = null;
- mFinishEnterTransformation.clear();
- }
- }
+ if (!mMoreRotateEnter) {
if (mRotateEnterAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, clearing rotate enter anim!");
mRotateEnterAnimation.cancel();
mRotateEnterAnimation = null;
mRotateEnterTransformation.clear();
}
}
- if (USE_CUSTOM_BLACK_FRAME && !mMoreStartFrame && !mMoreRotateFrame && !mMoreFinishFrame) {
- if (mStartFrameAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing start frame anim!");
- mStartFrameAnimation.cancel();
- mStartFrameAnimation = null;
- mStartFrameTransformation.clear();
- }
- if (mFinishFrameAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing finish frame anim!");
- mFinishFrameAnimation.cancel();
- mFinishFrameAnimation = null;
- mFinishFrameTransformation.clear();
- }
- if (mRotateFrameAnimation != null) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, clearing rotate frame anim!");
- mRotateFrameAnimation.cancel();
- mRotateFrameAnimation = null;
- mRotateFrameTransformation.clear();
- }
- }
-
mExitTransformation.set(mRotateExitTransformation);
mEnterTransformation.set(mRotateEnterTransformation);
- if (TWO_PHASE_ANIMATION) {
- mExitTransformation.compose(mStartExitTransformation);
- mExitTransformation.compose(mFinishExitTransformation);
- mEnterTransformation.compose(mStartEnterTransformation);
- mEnterTransformation.compose(mFinishEnterTransformation);
- }
-
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final exit: " + mExitTransformation);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final enter: " + mEnterTransformation);
-
- if (USE_CUSTOM_BLACK_FRAME) {
- //mFrameTransformation.set(mRotateExitTransformation);
- //mFrameTransformation.compose(mStartExitTransformation);
- //mFrameTransformation.compose(mFinishExitTransformation);
- mFrameTransformation.set(mRotateFrameTransformation);
- mFrameTransformation.compose(mStartFrameTransformation);
- mFrameTransformation.compose(mFinishFrameTransformation);
- mFrameTransformation.getMatrix().preConcat(mFrameInitialMatrix);
- if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final frame: " + mFrameTransformation);
- }
-
- final boolean more = (TWO_PHASE_ANIMATION
- && (mMoreStartEnter || mMoreStartExit || mMoreFinishEnter || mMoreFinishExit))
- || (USE_CUSTOM_BLACK_FRAME
- && (mMoreStartFrame || mMoreRotateFrame || mMoreFinishFrame))
- || mMoreRotateEnter || mMoreRotateExit
+ final boolean more = mMoreRotateEnter || mMoreRotateExit
|| !mFinishAnimReady;
mSnapshotFinalMatrix.setConcat(mExitTransformation.getMatrix(), mSnapshotInitialMatrix);
- if (DEBUG_STATE) Slog.v(TAG, "Step: more=" + more);
-
return more;
}
@@ -900,27 +522,17 @@
}
if (mSurfaceControl != null) {
- if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
- if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, hiding screenshot surface");
+ if (!mMoreRotateExit) {
t.hide(mSurfaceControl);
}
}
- if (mCustomBlackFrame != null) {
- if (!mMoreStartFrame && !mMoreFinishFrame && !mMoreRotateFrame) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding black frame");
- mCustomBlackFrame.hide(t);
- } else {
- mCustomBlackFrame.setMatrix(t, mFrameTransformation.getMatrix());
- }
- }
-
if (mExitingBlackFrame != null) {
- if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding exiting frame");
+ if (!mMoreRotateExit) {
mExitingBlackFrame.hide(t);
} else {
- mExitFrameFinalMatrix.setConcat(mExitTransformation.getMatrix(), mFrameInitialMatrix);
+ mExitFrameFinalMatrix.setConcat(mExitTransformation.getMatrix(),
+ mFrameInitialMatrix);
mExitingBlackFrame.setMatrix(t, mExitFrameFinalMatrix);
if (mForceDefaultOrientation) {
mExitingBlackFrame.setAlpha(t, mExitTransformation.getAlpha());
@@ -929,8 +541,7 @@
}
if (mEnteringBlackFrame != null) {
- if (!mMoreStartEnter && !mMoreFinishEnter && !mMoreRotateEnter) {
- if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding entering frame");
+ if (!mMoreRotateEnter) {
mEnteringBlackFrame.hide(t);
} else {
mEnteringBlackFrame.setMatrix(t, mEnterTransformation.getMatrix());
@@ -943,38 +554,11 @@
public boolean stepAnimationLocked(long now) {
if (!hasAnimations()) {
- if (DEBUG_STATE) Slog.v(TAG, "Step: no animations running");
mFinishAnimReady = false;
return false;
}
if (!mAnimRunning) {
- if (DEBUG_STATE) Slog.v(TAG, "Step: starting start, finish, rotate");
- if (TWO_PHASE_ANIMATION) {
- if (mStartEnterAnimation != null) {
- mStartEnterAnimation.setStartTime(now);
- }
- if (mStartExitAnimation != null) {
- mStartExitAnimation.setStartTime(now);
- }
- if (mFinishEnterAnimation != null) {
- mFinishEnterAnimation.setStartTime(0);
- }
- if (mFinishExitAnimation != null) {
- mFinishExitAnimation.setStartTime(0);
- }
- }
- if (USE_CUSTOM_BLACK_FRAME) {
- if (mStartFrameAnimation != null) {
- mStartFrameAnimation.setStartTime(now);
- }
- if (mFinishFrameAnimation != null) {
- mFinishFrameAnimation.setStartTime(0);
- }
- if (mRotateFrameAnimation != null) {
- mRotateFrameAnimation.setStartTime(now);
- }
- }
if (mRotateEnterAnimation != null) {
mRotateEnterAnimation.setStartTime(now);
}
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
index cb50460..85176be 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
@@ -193,7 +193,9 @@
public void onAnimationStart(Animator animation) {
synchronized (mCancelLock) {
if (!a.mCancelled) {
- mFrameTransaction.show(a.mLeash);
+ // TODO: change this back to use show instead of alpha when b/138459974 is
+ // fixed.
+ mFrameTransaction.setAlpha(a.mLeash, 1);
}
}
}
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index 3d9dfeb..cd211a2 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -324,9 +324,9 @@
.setName(surface + " - animation-leash");
final SurfaceControl leash = builder.build();
t.setWindowCrop(leash, width, height);
- if (!hidden) {
- t.show(leash);
- }
+ t.show(leash);
+ // TODO: change this back to use show instead of alpha when b/138459974 is fixed.
+ t.setAlpha(leash, hidden ? 0 : 1);
t.reparent(surface, leash);
return leash;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 421fd28..3221aef 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -34,6 +34,7 @@
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
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_FORCE_DESKTOP_MODE_ON_EXTERNAL_DISPLAYS;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
@@ -848,6 +849,16 @@
int mSystemGestureExclusionLimitDp;
boolean mSystemGestureExcludedByPreQStickyImmersive;
+ /**
+ * The minimum duration between gesture exclusion logging for a given window in
+ * milliseconds.
+ *
+ * Events that happen in-between will be silently dropped.
+ *
+ * A non-positive value disables logging.
+ */
+ public long mSystemGestureExclusionLogDebounceTimeoutMillis;
+
public interface WindowChangeListener {
public void windowsChanged();
public void focusChanged();
@@ -1147,6 +1158,9 @@
mSystemGestureExclusionLimitDp = Math.max(MIN_GESTURE_EXCLUSION_LIMIT_DP,
DeviceConfig.getInt(DeviceConfig.NAMESPACE_WINDOW_MANAGER,
KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP, 0));
+ mSystemGestureExclusionLogDebounceTimeoutMillis =
+ DeviceConfig.getInt(DeviceConfig.NAMESPACE_WINDOW_MANAGER,
+ KEY_SYSTEM_GESTURE_EXCLUSION_LOG_DEBOUNCE_MILLIS, 0);
mSystemGestureExcludedByPreQStickyImmersive =
DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_WINDOW_MANAGER,
KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE, false);
@@ -1164,6 +1178,10 @@
mSystemGestureExcludedByPreQStickyImmersive = excludedByPreQSticky;
mRoot.forAllDisplays(DisplayContent::updateSystemGestureExclusionLimit);
}
+
+ mSystemGestureExclusionLogDebounceTimeoutMillis =
+ DeviceConfig.getInt(DeviceConfig.NAMESPACE_WINDOW_MANAGER,
+ KEY_SYSTEM_GESTURE_EXCLUSION_LOG_DEBOUNCE_MILLIS, 0);
}
});
@@ -2006,6 +2024,7 @@
int attrChanges = 0;
int flagChanges = 0;
+ int privateFlagChanges = 0;
if (attrs != null) {
displayPolicy.adjustWindowParamsLw(win, attrs, pid, uid);
// if they don't have the permission, mask out the status bar bits
@@ -2034,6 +2053,7 @@
}
flagChanges = win.mAttrs.flags ^ attrs.flags;
+ privateFlagChanges = win.mAttrs.privateFlags ^ attrs.privateFlags;
attrChanges = win.mAttrs.copyFrom(attrs);
if ((attrChanges & (WindowManager.LayoutParams.LAYOUT_CHANGED
| WindowManager.LayoutParams.SYSTEM_UI_VISIBILITY_CHANGED)) != 0) {
@@ -2050,7 +2070,7 @@
win.getDisplayContent().getDisplayId());
}
- if ((flagChanges & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0) {
+ if ((privateFlagChanges & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0) {
updateNonSystemOverlayWindowsVisibilityIfNeeded(
win, win.mWinAnimator.getShown());
}
@@ -4529,7 +4549,6 @@
public static final int SEAMLESS_ROTATION_TIMEOUT = 54;
public static final int RESTORE_POINTER_ICON = 55;
public static final int SET_HAS_OVERLAY_UI = 58;
- public static final int SET_RUNNING_REMOTE_ANIMATION = 59;
public static final int ANIMATION_FAILSAFE = 60;
public static final int RECOMPUTE_FOCUS = 61;
public static final int ON_POINTER_DOWN_OUTSIDE_FOCUS = 62;
@@ -4886,10 +4905,6 @@
mAmInternal.setHasOverlayUi(msg.arg1, msg.arg2 == 1);
break;
}
- case SET_RUNNING_REMOTE_ANIMATION: {
- mAmInternal.setRunningRemoteAnimation(msg.arg1, msg.arg2 == 1);
- break;
- }
case ANIMATION_FAILSAFE: {
synchronized (mGlobalLock) {
if (mRecentsAnimationController != null) {
@@ -7543,7 +7558,7 @@
return;
}
final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty();
- if (surfaceShown) {
+ if (surfaceShown && win.hideNonSystemOverlayWindowsWhenVisible()) {
if (!mHidingNonSystemOverlayWindows.contains(win)) {
mHidingNonSystemOverlayWindows.add(win);
}
@@ -7574,11 +7589,6 @@
return mSurfaceBuilderFactory.make(s);
}
- void sendSetRunningRemoteAnimation(int pid, boolean runningRemoteAnimation) {
- mH.obtainMessage(H.SET_RUNNING_REMOTE_ANIMATION, pid, runningRemoteAnimation ? 1 : 0)
- .sendToTarget();
- }
-
void startSeamlessRotation() {
// We are careful to reset this in case a window was removed before it finished
// seamless rotation.
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index d7a519c..cf8e1e8 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -58,6 +58,7 @@
import android.util.Log;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import android.view.IRemoteAnimationRunner;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.HeavyWeightSwitcherActivity;
@@ -180,6 +181,12 @@
// Registered display id as a listener to override config change
private int mDisplayId;
+ /** Whether our process is currently running a {@link RecentsAnimation} */
+ private boolean mRunningRecentsAnimation;
+
+ /** Whether our process is currently running a {@link IRemoteAnimationRunner} */
+ private boolean mRunningRemoteAnimation;
+
public WindowProcessController(ActivityTaskManagerService atm, ApplicationInfo info,
String name, int uid, int userId, Object owner, WindowProcessListener listener) {
mInfo = info;
@@ -1098,6 +1105,30 @@
}
}
+ void setRunningRecentsAnimation(boolean running) {
+ if (mRunningRecentsAnimation == running) {
+ return;
+ }
+ mRunningRecentsAnimation = running;
+ updateRunningRemoteOrRecentsAnimation();
+ }
+
+ void setRunningRemoteAnimation(boolean running) {
+ if (mRunningRemoteAnimation == running) {
+ return;
+ }
+ mRunningRemoteAnimation = running;
+ updateRunningRemoteOrRecentsAnimation();
+ }
+
+ private void updateRunningRemoteOrRecentsAnimation() {
+
+ // Posting on handler so WM lock isn't held when we call into AM.
+ mAtm.mH.sendMessage(PooledLambda.obtainMessage(
+ WindowProcessListener::setRunningRemoteAnimation, mListener,
+ mRunningRecentsAnimation || mRunningRemoteAnimation));
+ }
+
@Override
public String toString() {
return mOwner != null ? mOwner.toString() : null;
diff --git a/services/core/java/com/android/server/wm/WindowProcessListener.java b/services/core/java/com/android/server/wm/WindowProcessListener.java
index 527d54a..23d7a6a 100644
--- a/services/core/java/com/android/server/wm/WindowProcessListener.java
+++ b/services/core/java/com/android/server/wm/WindowProcessListener.java
@@ -17,6 +17,8 @@
package com.android.server.wm;
import android.util.proto.ProtoOutputStream;
+import android.view.IRemoteAnimationRunner;
+import android.view.RemoteAnimationAdapter;
/**
* Interface used by the owner/creator of a process that owns windows to listen to changes from the
@@ -60,4 +62,14 @@
/** App died :(...oh well */
void appDied();
void writeToProto(ProtoOutputStream proto, long fieldId);
+
+ /**
+ * Sets if the process is currently running a remote animation, which is taken a signal for
+ * determining oom adjustment and scheduling behavior.
+ *
+ * @param runningRemoteAnimation True if the process is running a remote animation, false
+ * otherwise.
+ * @see RemoteAnimationAdapter
+ */
+ void setRunningRemoteAnimation(boolean runningRemoteAnimation);
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 9f9ef24..e14514b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -20,6 +20,8 @@
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_DEFAULT;
import static android.app.AppOpsManager.OP_NONE;
+import static android.app.WindowConfiguration.isSplitScreenWindowingMode;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.os.PowerManager.DRAW_WAKE_LOCK;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.view.SurfaceControl.Transaction;
@@ -79,6 +81,7 @@
import static com.android.server.policy.WindowManagerPolicy.TRANSIT_EXIT;
import static com.android.server.policy.WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
import static com.android.server.wm.AnimationSpecProto.MOVE;
+import static com.android.server.wm.DisplayContent.logsGestureExclusionRestrictions;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM;
import static com.android.server.wm.IdentifierProto.HASH_CODE;
@@ -173,6 +176,7 @@
import android.util.DisplayMetrics;
import android.util.MergedConfiguration;
import android.util.Slog;
+import android.util.StatsLog;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
@@ -226,6 +230,9 @@
// to capture touch events in that area.
static final int RESIZE_HANDLE_WIDTH_IN_DP = 30;
+ static final int EXCLUSION_LEFT = 0;
+ static final int EXCLUSION_RIGHT = 1;
+
final WindowManagerPolicy mPolicy;
final Context mContext;
final Session mSession;
@@ -396,6 +403,13 @@
*/
private final List<Rect> mExclusionRects = new ArrayList<>();
+ // 0 = left, 1 = right
+ private final int[] mLastRequestedExclusionHeight = {0, 0};
+ private final int[] mLastGrantedExclusionHeight = {0, 0};
+ private final long[] mLastExclusionLogUptimeMillis = {0, 0};
+
+ private boolean mLastShownChangedReported;
+
// If a window showing a wallpaper: the requested offset for the
// wallpaper; if a wallpaper window: the currently applied offset.
float mWallpaperX = -1;
@@ -678,6 +692,20 @@
&& mAppToken != null && mAppToken.mTargetSdk < Build.VERSION_CODES.Q;
}
+ void setLastExclusionHeights(int side, int requested, int granted) {
+ boolean changed = mLastGrantedExclusionHeight[side] != granted
+ || mLastRequestedExclusionHeight[side] != requested;
+
+ if (changed) {
+ if (mLastShownChangedReported) {
+ logExclusionRestrictions(side);
+ }
+
+ mLastGrantedExclusionHeight[side] = granted;
+ mLastRequestedExclusionHeight[side] = requested;
+ }
+ }
+
interface PowerManagerWrapper {
void wakeUp(long time, @WakeReason int reason, String details);
@@ -2961,6 +2989,49 @@
mAnimatingExit = false;
}
+ void onSurfaceShownChanged(boolean shown) {
+ if (mLastShownChangedReported == shown) {
+ return;
+ }
+ mLastShownChangedReported = shown;
+
+ if (shown) {
+ initExclusionRestrictions();
+ } else {
+ logExclusionRestrictions(EXCLUSION_LEFT);
+ logExclusionRestrictions(EXCLUSION_RIGHT);
+ }
+ }
+
+ private void logExclusionRestrictions(int side) {
+ if (!logsGestureExclusionRestrictions(this)
+ || SystemClock.uptimeMillis() < mLastExclusionLogUptimeMillis[side]
+ + mWmService.mSystemGestureExclusionLogDebounceTimeoutMillis) {
+ // Drop the log if we have just logged; this is okay, because what we would have logged
+ // was true only for a short duration.
+ return;
+ }
+
+ final long now = SystemClock.uptimeMillis();
+ final long duration = now - mLastExclusionLogUptimeMillis[side];
+ mLastExclusionLogUptimeMillis[side] = now;
+
+ final int requested = mLastRequestedExclusionHeight[side];
+ final int granted = mLastGrantedExclusionHeight[side];
+
+ StatsLog.write(StatsLog.EXCLUSION_RECT_STATE_CHANGED,
+ mAttrs.packageName, requested, requested - granted /* rejected */,
+ side + 1 /* Sides are 1-indexed in atoms.proto */,
+ (getConfiguration().orientation == ORIENTATION_LANDSCAPE),
+ isSplitScreenWindowingMode(getWindowingMode()), (int) duration);
+ }
+
+ private void initExclusionRestrictions() {
+ final long now = SystemClock.uptimeMillis();
+ mLastExclusionLogUptimeMillis[EXCLUSION_LEFT] = now;
+ mLastExclusionLogUptimeMillis[EXCLUSION_RIGHT] = now;
+ }
+
@Override
public boolean isDefaultDisplay() {
final DisplayContent displayContent = getDisplayContent();
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index d90e66e..ae3a10a 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -329,9 +329,14 @@
}
mDrawState = COMMIT_DRAW_PENDING;
layoutNeeded = true;
- }
- if (postDrawTransaction != null) {
- mPostDrawTransaction.merge(postDrawTransaction);
+
+ if (postDrawTransaction != null) {
+ mPostDrawTransaction.merge(postDrawTransaction);
+ }
+ } else if (postDrawTransaction != null) {
+ // If draw state is not pending we may delay applying this transaction from the client,
+ // so apply it now.
+ postDrawTransaction.apply();
}
return layoutNeeded;
@@ -1296,7 +1301,7 @@
// if we are transparent.
if (mPendingDestroySurface != null && mDestroyPreservedSurfaceUponRedraw) {
final SurfaceControl pendingSurfaceControl = mPendingDestroySurface.mSurfaceControl;
- mPostDrawTransaction.hide(pendingSurfaceControl);
+ mPostDrawTransaction.reparent(pendingSurfaceControl, null);
mPostDrawTransaction.reparentChildren(pendingSurfaceControl,
mSurfaceController.mSurfaceControl);
}
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index a616e06..bcefa8f 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -499,6 +499,8 @@
mService.updateNonSystemOverlayWindowsVisibilityIfNeeded(mAnimator.mWin, surfaceShown);
+ mAnimator.mWin.onSurfaceShownChanged(surfaceShown);
+
if (mWindowSession != null) {
mWindowSession.onWindowSurfaceVisibilityChanged(this, mSurfaceShown, mWindowType);
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
index cfa9944..59996cc 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java
@@ -16,6 +16,7 @@
package com.android.server.devicepolicy;
import android.app.admin.IDevicePolicyManager;
+import android.content.ComponentName;
import com.android.server.SystemService;
@@ -56,4 +57,9 @@
public void clearSystemUpdatePolicyFreezePeriodRecord() {
}
+
+ public boolean setKeyGrantForApp(ComponentName admin, String callerPackage, String alias,
+ String packageName, boolean hasGrant) {
+ return false;
+ }
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index ba06369..f800cca 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -5727,6 +5727,59 @@
return false;
}
+ @Override
+ public boolean setKeyGrantForApp(
+ ComponentName who, String callerPackage, String alias, String packageName,
+ boolean hasGrant) {
+ enforceCanManageScope(who, callerPackage, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER,
+ DELEGATION_CERT_SELECTION);
+
+ if (TextUtils.isEmpty(alias)) {
+ throw new IllegalArgumentException("Alias to grant cannot be empty.");
+ }
+
+ if (TextUtils.isEmpty(packageName)) {
+ throw new IllegalArgumentException("Package to grant to cannot be empty.");
+ }
+
+ final int userId = mInjector.userHandleGetCallingUserId();
+ final int granteeUid;
+ try {
+ ApplicationInfo ai = mInjector.getIPackageManager().getApplicationInfo(
+ packageName, 0, userId);
+ if (ai == null) {
+ throw new IllegalArgumentException(
+ String.format("Provided package %s is not installed", packageName));
+ }
+ granteeUid = ai.uid;
+ } catch (RemoteException e) {
+ throw new IllegalStateException("Failure getting grantee uid", e);
+ }
+
+ final int callingUid = mInjector.binderGetCallingUid();
+ final long id = mInjector.binderClearCallingIdentity();
+ try {
+ final KeyChainConnection keyChainConnection =
+ KeyChain.bindAsUser(mContext, UserHandle.getUserHandleForUid(callingUid));
+ try {
+ IKeyChainService keyChain = keyChainConnection.getService();
+ keyChain.setGrant(granteeUid, alias, hasGrant);
+ return true;
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Setting grant for package.", e);
+ return false;
+ } finally {
+ keyChainConnection.close();
+ }
+ } catch (InterruptedException e) {
+ Log.w(LOG_TAG, "Interrupted while setting key grant", e);
+ Thread.currentThread().interrupt();
+ } finally {
+ mInjector.binderRestoreCallingIdentity(id);
+ }
+ return false;
+ }
+
/**
* Enforce one the following conditions are met:
* (1) The device has a Device Owner, and one of the following holds:
diff --git a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
index be93d6ba..e55c4a6 100644
--- a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
@@ -26,8 +26,12 @@
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.robolectric.Shadows.shadowOf;
import static org.testng.Assert.expectThrows;
@@ -121,7 +125,7 @@
public void testConstructor_doesNotRegisterUsers() throws Exception {
BackupManagerService backupManagerService = createService();
- assertThat(backupManagerService.getServiceUsers().size()).isEqualTo(0);
+ assertThat(backupManagerService.getUserServices().size()).isEqualTo(0);
}
/** Test that the constructor handles {@code null} parameters. */
@@ -152,7 +156,7 @@
backupManagerService.startServiceForUser(mUserOneId);
- SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getServiceUsers();
+ SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
assertThat(serviceUsers.size()).isEqualTo(1);
assertThat(serviceUsers.get(mUserOneId)).isNotNull();
}
@@ -164,7 +168,7 @@
backupManagerService.startServiceForUser(mUserOneId, mUserOneService);
- SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getServiceUsers();
+ SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
assertThat(serviceUsers.size()).isEqualTo(1);
assertThat(serviceUsers.get(mUserOneId)).isEqualTo(mUserOneService);
}
@@ -178,7 +182,7 @@
backupManagerService.stopServiceForUser(mUserOneId);
- SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getServiceUsers();
+ SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
assertThat(serviceUsers.size()).isEqualTo(1);
assertThat(serviceUsers.get(mUserOneId)).isNull();
assertThat(serviceUsers.get(mUserTwoId)).isEqualTo(mUserTwoService);
@@ -204,7 +208,7 @@
backupManagerService.stopServiceForUser(mUserOneId);
- SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getServiceUsers();
+ SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
assertThat(serviceUsers.size()).isEqualTo(0);
}
@@ -1500,6 +1504,48 @@
}
// ---------------------------------------------
+ // Lifecycle tests
+ // ---------------------------------------------
+
+
+ /** testOnStart_publishesService */
+ @Test
+ public void testOnStart_publishesService() {
+ Trampoline trampoline = mock(Trampoline.class);
+ BackupManagerService.Lifecycle lifecycle =
+ spy(new BackupManagerService.Lifecycle(mContext, trampoline));
+ doNothing().when(lifecycle).publishService(anyString(), any());
+
+ lifecycle.onStart();
+
+ verify(lifecycle).publishService(Context.BACKUP_SERVICE, trampoline);
+ }
+
+ /** testOnUnlockUser_forwards */
+ @Test
+ public void testOnUnlockUser_forwards() {
+ Trampoline trampoline = mock(Trampoline.class);
+ BackupManagerService.Lifecycle lifecycle =
+ new BackupManagerService.Lifecycle(mContext, trampoline);
+
+ lifecycle.onUnlockUser(UserHandle.USER_SYSTEM);
+
+ verify(trampoline).onUnlockUser(UserHandle.USER_SYSTEM);
+ }
+
+ /** testOnStopUser_forwards */
+ @Test
+ public void testOnStopUser_forwards() {
+ Trampoline trampoline = mock(Trampoline.class);
+ BackupManagerService.Lifecycle lifecycle =
+ new BackupManagerService.Lifecycle(mContext, trampoline);
+
+ lifecycle.onStopUser(UserHandle.USER_SYSTEM);
+
+ verify(trampoline).onStopUser(UserHandle.USER_SYSTEM);
+ }
+
+ // ---------------------------------------------
// Service tests
// ---------------------------------------------
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
index 4a33739..101bee2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/AppCompactorTest.java
@@ -21,12 +21,17 @@
import static com.google.common.truth.Truth.assertThat;
+import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
+import android.os.Process;
import android.platform.test.annotations.Presubmit;
import android.provider.DeviceConfig;
import android.text.TextUtils;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.server.ServiceThread;
import com.android.server.appop.AppOpsService;
import com.android.server.testables.TestableDeviceConfig;
@@ -54,6 +59,8 @@
@RunWith(MockitoJUnitRunner.class)
public final class AppCompactorTest {
+ private ServiceThread mThread;
+
@Mock
private AppOpsService mAppOpsService;
private AppCompactor mCompactorUnderTest;
@@ -70,7 +77,12 @@
mHandlerThread = new HandlerThread("");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- ActivityManagerService ams = new ActivityManagerService(new TestInjector());
+
+ mThread = new ServiceThread("TestServiceThread", Process.THREAD_PRIORITY_DEFAULT,
+ true /* allowIo */);
+ mThread.start();
+
+ ActivityManagerService ams = new ActivityManagerService(new TestInjector(), mThread);
mCompactorUnderTest = new AppCompactor(ams,
new AppCompactor.PropertyChangedCallbackForTest() {
@Override
@@ -85,6 +97,7 @@
@After
public void tearDown() {
mHandlerThread.quit();
+ mThread.quit();
mCountDown = null;
}
@@ -656,5 +669,10 @@
public Handler getUiHandler(ActivityManagerService service) {
return mHandler;
}
+
+ @Override
+ public Context getContext() {
+ return InstrumentationRegistry.getInstrumentation().getContext();
+ }
}
}
diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp
index b37e460..83e20fb 100644
--- a/services/tests/servicestests/Android.bp
+++ b/services/tests/servicestests/Android.bp
@@ -83,6 +83,8 @@
optimize: {
enabled: false,
},
+
+ data: [":JobTestApp"],
}
java_library {
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index 01f2f6b..c1bbb30 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -69,6 +69,7 @@
<uses-permission android:name="android.permission.READ_DEVICE_CONFIG" />
<uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" />
<uses-permission android:name="android.permission.HARDWARE_TEST"/>
+ <uses-permission android:name="android.permission.BLUETOOTH"/>
<!-- Uses API introduced in O (26) -->
<uses-sdk android:minSdkVersion="1"
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java
index 782dc3e..193f540 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityInputFilterTest.java
@@ -47,6 +47,8 @@
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
+import com.android.server.accessibility.gestures.TouchExplorer;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
index 2f9f9bb..6be5a37 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java
@@ -192,7 +192,8 @@
when(parceledListSlice.getList()).thenReturn(gestureSteps);
mConnection.dispatchGesture(0, parceledListSlice, Display.DEFAULT_DISPLAY);
- verify(mMockMotionEventInjector).injectEvents(gestureSteps, mMockServiceClient, 0);
+ verify(mMockMotionEventInjector).injectEvents(gestureSteps, mMockServiceClient, 0,
+ Display.DEFAULT_DISPLAY);
}
@Test
@@ -209,7 +210,8 @@
when(parceledListSlice.getList()).thenReturn(gestureSteps);
mConnection.dispatchGesture(0, parceledListSlice, Display.DEFAULT_DISPLAY);
- verify(mMockMotionEventInjector, never()).injectEvents(gestureSteps, mMockServiceClient, 0);
+ verify(mMockMotionEventInjector, never()).injectEvents(gestureSteps, mMockServiceClient, 0,
+ Display.DEFAULT_DISPLAY);
verify(mMockServiceClient).onPerformGestureResult(0, false);
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
index 2977414..f1142fd 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MotionEventInjectorTest.java
@@ -47,6 +47,7 @@
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
+import android.view.Display;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
@@ -709,7 +710,8 @@
private void injectEventsSync(List<GestureStep> gestureSteps,
IAccessibilityServiceClient serviceInterface, int sequence) {
- mMotionEventInjector.injectEvents(gestureSteps, serviceInterface, sequence);
+ mMotionEventInjector.injectEvents(gestureSteps, serviceInterface, sequence,
+ Display.DEFAULT_DISPLAY);
// Dispatch the message sent by the injector. Our simple handler doesn't guarantee stuff
// happens in order.
mMessageCapturingHandler.sendLastMessage();
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/gestures/AccessibilityGestureDetectorTest.java
similarity index 99%
rename from services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java
rename to services/tests/servicestests/src/com/android/server/accessibility/gestures/AccessibilityGestureDetectorTest.java
index cdcc338..2585a28 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityGestureDetectorTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/gestures/AccessibilityGestureDetectorTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server.accessibility;
+package com.android.server.accessibility.gestures;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.mock;
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/TouchExplorerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/gestures/TouchExplorerTest.java
similarity index 98%
rename from services/tests/servicestests/src/com/android/server/accessibility/TouchExplorerTest.java
rename to services/tests/servicestests/src/com/android/server/accessibility/gestures/TouchExplorerTest.java
index 2645461..274ca36 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/TouchExplorerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/gestures/TouchExplorerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.server.accessibility;
+package com.android.server.accessibility.gestures;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -31,6 +31,9 @@
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
+import com.android.server.accessibility.AccessibilityManagerService;
+import com.android.server.accessibility.EventStreamTransformation;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
index 5dafe07..d57fd4b 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java
@@ -18,13 +18,17 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
import android.app.ActivityManagerInternal;
import android.os.SystemClock;
import androidx.test.filters.MediumTest;
+import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -43,6 +47,8 @@
private static final long TEST_PROC_STATE_SEQ2 = 1112;
private static final long TEST_PROC_STATE_SEQ3 = 1113;
+ @Rule public ServiceThreadRule mServiceThreadRule = new ServiceThreadRule();
+
@Mock private ActivityManagerService.Injector mMockInjector;
private ActivityManagerService mAms;
@@ -52,7 +58,11 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
- mAms = new ActivityManagerService(mMockInjector);
+ doReturn(InstrumentationRegistry.getInstrumentation().getContext()).when(mMockInjector)
+ .getContext();
+ doReturn(mServiceThreadRule.getThread().getThreadHandler()).when(mMockInjector)
+ .getUiHandler(any());
+ mAms = new ActivityManagerService(mMockInjector, mServiceThreadRule.getThread());
mAmi = mAms.new LocalService();
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
index 3df6976..8a1f046 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java
@@ -70,13 +70,14 @@
import androidx.test.filters.MediumTest;
import androidx.test.filters.SmallTest;
-import com.android.server.appop.AppOpsService;
import com.android.server.am.ProcessList.IsolatedUidRange;
import com.android.server.am.ProcessList.IsolatedUidRangeAllocator;
+import com.android.server.appop.AppOpsService;
import com.android.server.wm.ActivityTaskManagerService;
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
@@ -114,6 +115,8 @@
UidRecord.CHANGE_ACTIVE
};
+ @Rule public ServiceThreadRule mServiceThreadRule = new ServiceThreadRule();
+
private Context mContext = getInstrumentation().getTargetContext();
@Mock private AppOpsService mAppOpsService;
@Mock private PackageManager mPackageManager;
@@ -131,7 +134,7 @@
mHandlerThread.start();
mHandler = new TestHandler(mHandlerThread.getLooper());
mInjector = new TestInjector();
- mAms = new ActivityManagerService(mInjector);
+ mAms = new ActivityManagerService(mInjector, mServiceThreadRule.getThread());
mAms.mWaitForNetworkTimeoutMs = 2000;
mAms.mActivityTaskManager = new ActivityTaskManagerService(mContext);
mAms.mActivityTaskManager.initialize(null, null, mHandler.getLooper());
diff --git a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
index 1dfce51..87cc0ff 100644
--- a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java
@@ -29,6 +29,7 @@
import com.android.server.wm.ActivityTaskManagerService;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import java.io.File;
@@ -41,6 +42,9 @@
@FlakyTest(bugId = 113616538)
public class AppErrorDialogTest {
+ @Rule
+ public ServiceThreadRule mServiceThreadRule = new ServiceThreadRule();
+
private Context mContext;
private ActivityManagerService mService;
@@ -55,14 +59,19 @@
@Override
public Handler getUiHandler(ActivityManagerService service) {
- return null;
+ return mServiceThreadRule.getThread().getThreadHandler();
}
@Override
public boolean isNetworkRestrictedForUid(int uid) {
return false;
}
- });
+
+ @Override
+ public Context getContext() {
+ return mContext;
+ }
+ }, mServiceThreadRule.getThread());
mService.mActivityTaskManager = new ActivityTaskManagerService(mContext);
mService.mActivityTaskManager.initialize(null, null, mContext.getMainLooper());
}
diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
index cbdc6c3..1eb02ad 100644
--- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
@@ -39,6 +39,7 @@
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -61,6 +62,8 @@
private static final float TEST_FLOAT = 3.14f;
private static final String TEST_STRING = "testString";
+ @Rule public ServiceThreadRule mServiceThreadRule = new ServiceThreadRule();
+
private ActivityManagerService mAms;
@Mock private Context mContext;
@@ -90,7 +93,7 @@
mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider());
when(mContext.getContentResolver()).thenReturn(mContentResolver);
- mAms = new ActivityManagerService(new TestInjector());
+ mAms = new ActivityManagerService(new TestInjector(), mServiceThreadRule.getThread());
mCoreSettingsObserver = new CoreSettingsObserver(mAms);
}
@@ -157,7 +160,7 @@
private class TestInjector extends Injector {
@Override
public Context getContext() {
- return mContext;
+ return getInstrumentation().getContext();
}
@Override
@@ -167,7 +170,7 @@
@Override
public Handler getUiHandler(ActivityManagerService service) {
- return null;
+ return mServiceThreadRule.getThread().getThreadHandler();
}
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ServiceThreadRule.java b/services/tests/servicestests/src/com/android/server/am/ServiceThreadRule.java
new file mode 100644
index 0000000..e86ce7e
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/am/ServiceThreadRule.java
@@ -0,0 +1,51 @@
+/*
+ * 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.am;
+
+import android.os.Process;
+
+import com.android.server.ServiceThread;
+
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+class ServiceThreadRule implements TestRule {
+
+ private ServiceThread mThread;
+
+ ServiceThread getThread() {
+ return mThread;
+ }
+
+ @Override
+ public Statement apply(Statement base, Description description) {
+ return new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ mThread = new ServiceThread("TestServiceThread", Process.THREAD_PRIORITY_DEFAULT,
+ true /* allowIo */);
+ mThread.start();
+ try {
+ base.evaluate();
+ } finally {
+ mThread.getThreadHandler().runWithScissors(mThread::quit, 0 /* timeout */);
+ }
+ }
+ };
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java
new file mode 100644
index 0000000..5c2ad94
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 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.audio;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.AudioSystem;
+import android.util.Log;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatchers;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class AudioDeviceBrokerTest {
+
+ private static final String TAG = "AudioDeviceBrokerTest";
+ private static final int MAX_MESSAGE_HANDLING_DELAY_MS = 100;
+
+ private Context mContext;
+ // the actual class under test
+ private AudioDeviceBroker mAudioDeviceBroker;
+
+ @Mock private AudioService mMockAudioService;
+ @Spy private AudioDeviceInventory mSpyDevInventory;
+
+ private BluetoothDevice mFakeBtDevice;
+
+ @Before
+ public void setUp() throws Exception {
+ mContext = InstrumentationRegistry.getTargetContext();
+
+ mMockAudioService = mock(AudioService.class);
+ mSpyDevInventory = spy(new AudioDeviceInventory());
+ mAudioDeviceBroker = new AudioDeviceBroker(mContext, mMockAudioService, mSpyDevInventory);
+ mSpyDevInventory.setDeviceBroker(mAudioDeviceBroker);
+
+ BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+ mFakeBtDevice = adapter.getRemoteDevice("00:01:02:03:04:05");
+ Assert.assertNotNull("invalid null BT device", mFakeBtDevice);
+ }
+
+ @After
+ public void tearDown() throws Exception { }
+
+ @Test
+ public void testSetUpAndTearDown() { }
+
+ /**
+ * Verify call to postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent() for connection
+ * calls into AudioDeviceInventory with the right params
+ * @throws Exception
+ */
+ @Test
+ public void testPostA2dpDeviceConnectionChange() throws Exception {
+ Log.i(TAG, "testPostA2dpDeviceConnectionChange");
+ Assert.assertNotNull("invalid null BT device", mFakeBtDevice);
+
+ mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice,
+ BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 1);
+ Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS);
+ verify(mSpyDevInventory, times(1)).setBluetoothA2dpDeviceConnectionState(
+ any(BluetoothDevice.class),
+ ArgumentMatchers.eq(BluetoothProfile.STATE_CONNECTED) /*state*/,
+ ArgumentMatchers.eq(BluetoothProfile.A2DP) /*profile*/,
+ ArgumentMatchers.eq(true) /*suppressNoisyIntent*/, anyInt() /*musicDevice*/,
+ ArgumentMatchers.eq(1) /*a2dpVolume*/
+ );
+ }
+
+ /**
+ * Verify call to postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent() for
+ * connection > pause > disconnection > connection
+ * keeps the device connected
+ * @throws Exception
+ */
+ @Test
+ public void testA2dpDeviceConnectionDisconnectionConnectionChange() throws Exception {
+ Log.i(TAG, "testA2dpDeviceConnectionDisconnectionConnectionChange");
+
+ doTestConnectionDisconnectionReconnection(0);
+ }
+
+ /**
+ * Verify device disconnection and reconnection within the BECOMING_NOISY window
+ * @throws Exception
+ */
+ @Test
+ public void testA2dpDeviceReconnectionWithinBecomingNoisyDelay() throws Exception {
+ Log.i(TAG, "testA2dpDeviceReconnectionWithinBecomingNoisyDelay");
+
+ doTestConnectionDisconnectionReconnection(AudioService.BECOMING_NOISY_DELAY_MS / 2);
+ }
+
+ private void doTestConnectionDisconnectionReconnection(int delayAfterDisconnection)
+ throws Exception {
+ when(mMockAudioService.getDeviceForStream(AudioManager.STREAM_MUSIC))
+ .thenReturn(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP);
+ when(mMockAudioService.isInCommunication()).thenReturn(false);
+ when(mMockAudioService.hasMediaDynamicPolicy()).thenReturn(false);
+ when(mMockAudioService.hasAudioFocusUsers()).thenReturn(false);
+
+ // first connection
+ mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice,
+ BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 1);
+ Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS);
+
+ // disconnection
+ mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice,
+ BluetoothProfile.STATE_DISCONNECTED, BluetoothProfile.A2DP, false, -1);
+ if (delayAfterDisconnection > 0) {
+ Thread.sleep(delayAfterDisconnection);
+ }
+
+ // reconnection
+ mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice,
+ BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 2);
+ Thread.sleep(AudioService.BECOMING_NOISY_DELAY_MS + MAX_MESSAGE_HANDLING_DELAY_MS);
+
+ // Verify disconnection has been cancelled and we're seeing two connections attempts,
+ // with the device connected at the end of the test
+ verify(mSpyDevInventory, times(2)).onSetA2dpSinkConnectionState(
+ any(BtHelper.BluetoothA2dpDeviceInfo.class),
+ ArgumentMatchers.eq(BluetoothProfile.STATE_CONNECTED));
+ Assert.assertTrue("Mock device not connected",
+ mSpyDevInventory.isA2dpDeviceConnected(mFakeBtDevice));
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
index 29cbf98..3da2fd3 100644
--- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
@@ -18,7 +18,6 @@
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
@@ -44,6 +43,7 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
+import android.os.ConditionVariable;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.Process;
@@ -70,7 +70,7 @@
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
-import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@SmallTest
@@ -136,7 +136,7 @@
SparseArray<UserBackupManagerService> serviceUsers = new SparseArray<>();
serviceUsers.append(UserHandle.USER_SYSTEM, mUserBackupManagerService);
serviceUsers.append(NON_USER_SYSTEM, mUserBackupManagerService);
- when(mBackupManagerServiceMock.getServiceUsers()).thenReturn(serviceUsers);
+ when(mBackupManagerServiceMock.getUserServices()).thenReturn(serviceUsers);
when(mUserManagerMock.getUserInfo(UserHandle.USER_SYSTEM)).thenReturn(mUserInfoMock);
when(mUserManagerMock.getUserInfo(NON_USER_SYSTEM)).thenReturn(mUserInfoMock);
@@ -182,37 +182,76 @@
}
@Test
- public void initializeService_successfullyInitializesBackupService() {
- mTrampoline.initializeService();
-
+ public void testIsBackupServiceActive_whenBackupsNotDisabledAndSuppressFileDoesNotExist() {
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
}
@Test
- public void initializeService_globallyDisabled_nonInitialized() {
+ public void testOnUnlockUser_forNonSystemUserWhenBackupsDisabled_doesNotStartUser() {
+ when(mBackupManagerServiceMock.getUserServices()).thenReturn(new SparseArray<>());
TrampolineTestable.sBackupDisabled = true;
TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
+ ConditionVariable unlocked = new ConditionVariable(false);
- trampoline.initializeService();
+ trampoline.onUnlockUser(NON_USER_SYSTEM);
+
+ trampoline.getBackupHandler().post(unlocked::open);
+ unlocked.block();
+ assertNull(trampoline.getUserService(NON_USER_SYSTEM));
+ }
+
+ @Test
+ public void testOnUnlockUser_forSystemUserWhenBackupsDisabled_doesNotStartUser() {
+ when(mBackupManagerServiceMock.getUserServices()).thenReturn(new SparseArray<>());
+ TrampolineTestable.sBackupDisabled = true;
+ TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
+ ConditionVariable unlocked = new ConditionVariable(false);
+
+ trampoline.onUnlockUser(UserHandle.USER_SYSTEM);
+
+ trampoline.getBackupHandler().post(unlocked::open);
+ unlocked.block();
+ assertNull(trampoline.getUserService(UserHandle.USER_SYSTEM));
+ }
+
+ @Test
+ public void testOnUnlockUser_whenBackupNotActivated_doesNotStartUser() {
+ when(mBackupManagerServiceMock.getUserServices()).thenReturn(new SparseArray<>());
+ TrampolineTestable.sBackupDisabled = false;
+ TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
+ trampoline.setBackupServiceActive(NON_USER_SYSTEM, false);
+ ConditionVariable unlocked = new ConditionVariable(false);
+
+ trampoline.onUnlockUser(NON_USER_SYSTEM);
+
+ trampoline.getBackupHandler().post(unlocked::open);
+ unlocked.block();
+ assertNull(trampoline.getUserService(NON_USER_SYSTEM));
+ verify(mBackupManagerServiceMock, never()).startServiceForUser(NON_USER_SYSTEM);
+ }
+
+ @Test
+ public void testIsBackupServiceActive_forSystemUserWhenBackupDisabled_returnsTrue()
+ throws Exception {
+ TrampolineTestable.sBackupDisabled = true;
+ Trampoline trampoline = new TrampolineTestable(mContextMock);
+ trampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
assertFalse(trampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
}
@Test
- public void initializeService_doesNotStartServiceForUsers() {
- mTrampoline.initializeService();
+ public void testIsBackupServiceActive_forNonSystemUserWhenBackupDisabled_returnsTrue()
+ throws Exception {
+ TrampolineTestable.sBackupDisabled = true;
+ Trampoline trampoline = new TrampolineTestable(mContextMock);
+ trampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
- verify(mBackupManagerServiceMock, never()).startServiceForUser(anyInt());
- }
-
- @Test
- public void isBackupServiceActive_calledBeforeInitialize_returnsFalse() {
- assertFalse(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
+ assertFalse(trampoline.isBackupServiceActive(NON_USER_SYSTEM));
}
@Test
public void isBackupServiceActive_forSystemUser_returnsTrueWhenActivated() throws Exception {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
@@ -220,7 +259,6 @@
@Test
public void isBackupServiceActive_forSystemUser_returnsFalseWhenDeactivated() throws Exception {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
assertFalse(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
@@ -229,7 +267,6 @@
@Test
public void isBackupServiceActive_forNonSystemUser_returnsFalseWhenSystemUserDeactivated()
throws Exception {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
@@ -239,7 +276,6 @@
@Test
public void isBackupServiceActive_forNonSystemUser_returnsFalseWhenNonSystemUserDeactivated()
throws Exception {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
// Don't activate non-system user.
@@ -250,7 +286,6 @@
public void
isBackupServiceActive_forNonSystemUser_returnsTrueWhenSystemAndNonSystemUserActivated()
throws Exception {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
@@ -261,7 +296,6 @@
public void
isBackupServiceActive_forUnstartedNonSystemUser_returnsTrueWhenSystemAndUserActivated()
throws Exception {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UNSTARTED_NON_USER_SYSTEM, true);
assertTrue(mTrampoline.isBackupServiceActive(UNSTARTED_NON_USER_SYSTEM));
@@ -269,7 +303,6 @@
@Test
public void setBackupServiceActive_forSystemUserAndCallerSystemUid_serviceCreated() {
- mTrampoline.initializeService();
TrampolineTestable.sCallingUid = Process.SYSTEM_UID;
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
@@ -279,7 +312,6 @@
@Test
public void setBackupServiceActive_forSystemUserAndCallerRootUid_serviceCreated() {
- mTrampoline.initializeService();
TrampolineTestable.sCallingUid = Process.ROOT_UID;
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
@@ -289,7 +321,6 @@
@Test
public void setBackupServiceActive_forSystemUserAndCallerNonRootNonSystem_throws() {
- mTrampoline.initializeService();
TrampolineTestable.sCallingUid = Process.FIRST_APPLICATION_UID;
try {
@@ -302,7 +333,6 @@
@Test
public void setBackupServiceActive_forManagedProfileAndCallerSystemUid_serviceCreated() {
when(mUserInfoMock.isManagedProfile()).thenReturn(true);
- mTrampoline.initializeService();
TrampolineTestable.sCallingUid = Process.SYSTEM_UID;
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
@@ -313,7 +343,6 @@
@Test
public void setBackupServiceActive_forManagedProfileAndCallerRootUid_serviceCreated() {
when(mUserInfoMock.isManagedProfile()).thenReturn(true);
- mTrampoline.initializeService();
TrampolineTestable.sCallingUid = Process.ROOT_UID;
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
@@ -324,7 +353,6 @@
@Test
public void setBackupServiceActive_forManagedProfileAndCallerNonRootNonSystem_throws() {
when(mUserInfoMock.isManagedProfile()).thenReturn(true);
- mTrampoline.initializeService();
TrampolineTestable.sCallingUid = Process.FIRST_APPLICATION_UID;
try {
@@ -339,7 +367,6 @@
doThrow(new SecurityException())
.when(mContextMock)
.enforceCallingOrSelfPermission(eq(Manifest.permission.BACKUP), anyString());
- mTrampoline.initializeService();
try {
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
@@ -354,7 +381,6 @@
.when(mContextMock)
.enforceCallingOrSelfPermission(
eq(Manifest.permission.INTERACT_ACROSS_USERS_FULL), anyString());
- mTrampoline.initializeService();
try {
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
@@ -367,7 +393,6 @@
public void setBackupServiceActive_backupDisabled_ignored() {
TrampolineTestable.sBackupDisabled = true;
TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
- trampoline.initializeService();
trampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
@@ -376,19 +401,15 @@
@Test
public void setBackupServiceActive_alreadyActive_ignored() {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
- assertEquals(1, mTrampoline.getCreateServiceCallsCount());
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
- assertEquals(1, mTrampoline.getCreateServiceCallsCount());
}
@Test
public void setBackupServiceActive_makeNonActive_alreadyNonActive_ignored() {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
@@ -397,7 +418,6 @@
@Test
public void setBackupServiceActive_makeActive_serviceCreatedAndSuppressFileDeleted() {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
@@ -406,7 +426,6 @@
@Test
public void setBackupServiceActive_makeNonActive_serviceDeletedAndSuppressFileCreated()
throws IOException {
- mTrampoline.initializeService();
assertTrue(mTrampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
@@ -416,7 +435,6 @@
@Test
public void setBackupActive_nonSystemUser_disabledForSystemUser_ignored() {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, false);
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
@@ -425,7 +443,6 @@
@Test
public void setBackupServiceActive_forOneNonSystemUser_doesNotActivateForAllNonSystemUsers() {
- mTrampoline.initializeService();
int otherUser = NON_USER_SYSTEM + 1;
File activateFile = new File(mTestDir, "activate-" + otherUser);
TrampolineTestable.sActivatedFiles.append(otherUser, activateFile);
@@ -440,7 +457,6 @@
@Test
public void setBackupServiceActive_forNonSystemUser_remembersActivated() {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
@@ -450,7 +466,6 @@
@Test
public void setBackupServiceActiveFalse_forNonSystemUser_remembersActivated() {
- mTrampoline.initializeService();
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, false);
@@ -460,8 +475,6 @@
@Test
public void setBackupServiceActiveTwice_forNonSystemUser_remembersLastActivated() {
- mTrampoline.initializeService();
-
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
mTrampoline.setBackupServiceActive(NON_USER_SYSTEM, false);
@@ -470,15 +483,7 @@
}
@Test
- public void dataChanged_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.dataChanged(PACKAGE_NAME);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void dataChangedForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
-
mTrampoline.dataChangedForUser(mUserId, PACKAGE_NAME);
verify(mBackupManagerServiceMock).dataChanged(mUserId, PACKAGE_NAME);
@@ -487,7 +492,6 @@
@Test
public void dataChanged_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.dataChanged(PACKAGE_NAME);
@@ -495,14 +499,7 @@
}
@Test
- public void clearBackupData_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.clearBackupData(TRANSPORT_NAME, PACKAGE_NAME);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void clearBackupDataForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.clearBackupDataForUser(mUserId, TRANSPORT_NAME, PACKAGE_NAME);
@@ -512,7 +509,6 @@
@Test
public void clearBackupData_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.clearBackupData(TRANSPORT_NAME, PACKAGE_NAME);
@@ -520,14 +516,7 @@
}
@Test
- public void agentConnected_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.agentConnected(PACKAGE_NAME, mAgentMock);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void agentConnectedForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.agentConnectedForUser(mUserId, PACKAGE_NAME, mAgentMock);
@@ -537,7 +526,6 @@
@Test
public void agentConnected_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.agentConnected(PACKAGE_NAME, mAgentMock);
@@ -545,14 +533,7 @@
}
@Test
- public void agentDisconnected_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.agentDisconnected(PACKAGE_NAME);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void agentDisconnectedForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.agentDisconnectedForUser(mUserId, PACKAGE_NAME);
@@ -562,7 +543,6 @@
@Test
public void agentDisconnected_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.agentDisconnected(PACKAGE_NAME);
@@ -570,14 +550,7 @@
}
@Test
- public void restoreAtInstall_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.restoreAtInstall(PACKAGE_NAME, 123);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void restoreAtInstallForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.restoreAtInstallForUser(mUserId, PACKAGE_NAME, 123);
@@ -587,7 +560,6 @@
@Test
public void restoreAtInstall_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.restoreAtInstall(PACKAGE_NAME, 123);
@@ -595,14 +567,7 @@
}
@Test
- public void setBackupEnabled_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.setBackupEnabled(true);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void setBackupEnabledForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.setBackupEnabledForUser(mUserId, true);
@@ -612,7 +577,6 @@
@Test
public void setBackupEnabled_forwardedToCallingUserId() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.setBackupEnabled(true);
@@ -620,14 +584,7 @@
}
@Test
- public void setAutoRestore_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.setAutoRestore(true);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void setAutoRestoreForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.setAutoRestoreForUser(mUserId, true);
@@ -637,7 +594,6 @@
@Test
public void setAutoRestore_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.setAutoRestore(true);
@@ -645,14 +601,7 @@
}
@Test
- public void isBackupEnabled_calledBeforeInitialize_ignored() throws Exception {
- assertFalse(mTrampoline.isBackupEnabled());
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void isBackupEnabledForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.isBackupEnabledForUser(mUserId);
@@ -662,7 +611,6 @@
@Test
public void isBackupEnabled_forwardedToCallingUserId() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.isBackupEnabled();
@@ -670,40 +618,19 @@
}
@Test
- public void setBackupPassword_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void setBackupPassword_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD);
verify(mBackupManagerServiceMock).setBackupPassword(CURRENT_PASSWORD, NEW_PASSWORD);
}
@Test
- public void hasBackupPassword_calledBeforeInitialize_ignored() throws Exception {
- assertFalse(mTrampoline.hasBackupPassword());
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void hasBackupPassword_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.hasBackupPassword();
verify(mBackupManagerServiceMock).hasBackupPassword();
}
@Test
- public void backupNow_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.backupNow();
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void backupNowForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.backupNowForUser(mUserId);
@@ -713,7 +640,6 @@
@Test
public void backupNow_forwardedToCallingUserId() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.backupNow();
@@ -721,16 +647,7 @@
}
@Test
- public void adbBackup_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.adbBackup(mUserId, mParcelFileDescriptorMock, true, true,
- true, true, true, true, true, true,
- PACKAGE_NAMES);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void adbBackup_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.adbBackup(mUserId, mParcelFileDescriptorMock, true, true,
true, true, true, true, true, true,
PACKAGE_NAMES);
@@ -739,14 +656,7 @@
}
@Test
- public void fullTransportBackup_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.fullTransportBackupForUser(mUserId, PACKAGE_NAMES);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void fullTransportBackupForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.fullTransportBackupForUser(mUserId, PACKAGE_NAMES);
@@ -754,29 +664,13 @@
}
@Test
- public void adbRestore_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.adbRestore(mUserId, mParcelFileDescriptorMock);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void adbRestore_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.adbRestore(mUserId, mParcelFileDescriptorMock);
verify(mBackupManagerServiceMock).adbRestore(mUserId, mParcelFileDescriptorMock);
}
@Test
- public void acknowledgeFullBackupOrRestore_calledBeforeInitialize_ignored()
- throws Exception {
- mTrampoline.acknowledgeFullBackupOrRestore(123, true, CURRENT_PASSWORD, ENCRYPTION_PASSWORD,
- mFullBackupRestoreObserverMock);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void acknowledgeFullBackupOrRestoreForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.acknowledgeFullBackupOrRestoreForUser(
mUserId,
@@ -799,7 +693,6 @@
@Test
public void acknowledgeFullBackupOrRestore_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.acknowledgeFullBackupOrRestore(123, true, CURRENT_PASSWORD, ENCRYPTION_PASSWORD,
mFullBackupRestoreObserverMock);
@@ -815,15 +708,8 @@
}
@Test
- public void getCurrentTransport_calledBeforeInitialize_ignored() throws Exception {
- assertNull(mTrampoline.getCurrentTransport());
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void getCurrentTransportForUser_forwarded() throws Exception {
when(mBackupManagerServiceMock.getCurrentTransport(mUserId)).thenReturn(TRANSPORT_NAME);
- mTrampoline.initializeService();
assertEquals(TRANSPORT_NAME, mTrampoline.getCurrentTransportForUser(mUserId));
verify(mBackupManagerServiceMock).getCurrentTransport(mUserId);
@@ -833,22 +719,14 @@
public void getCurrentTransport_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
when(mBackupManagerServiceMock.getCurrentTransport(mUserId)).thenReturn(TRANSPORT_NAME);
- mTrampoline.initializeService();
assertEquals(TRANSPORT_NAME, mTrampoline.getCurrentTransport());
verify(mBackupManagerServiceMock).getCurrentTransport(mUserId);
}
@Test
- public void listAllTransports_calledBeforeInitialize_ignored() throws Exception {
- assertNull(mTrampoline.listAllTransports());
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void listAllTransportsForUser_forwarded() throws Exception {
when(mBackupManagerServiceMock.listAllTransports(mUserId)).thenReturn(TRANSPORTS);
- mTrampoline.initializeService();
assertEquals(TRANSPORTS, mTrampoline.listAllTransportsForUser(mUserId));
verify(mBackupManagerServiceMock).listAllTransports(mUserId);
@@ -859,62 +737,31 @@
public void listAllTransports_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
when(mBackupManagerServiceMock.listAllTransports(mUserId)).thenReturn(TRANSPORTS);
- mTrampoline.initializeService();
assertEquals(TRANSPORTS, mTrampoline.listAllTransports());
verify(mBackupManagerServiceMock).listAllTransports(mUserId);
}
@Test
- public void listAllTransportComponentsForUser_calledBeforeInitialize_ignored()
- throws Exception {
- assertNull(mTrampoline.listAllTransportComponentsForUser(mUserId));
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void listAllTransportComponentsForUser_forwarded() throws Exception {
when(mBackupManagerServiceMock.listAllTransportComponents(mUserId)).thenReturn(
TRANSPORT_COMPONENTS);
- mTrampoline.initializeService();
assertEquals(TRANSPORT_COMPONENTS, mTrampoline.listAllTransportComponentsForUser(mUserId));
verify(mBackupManagerServiceMock).listAllTransportComponents(mUserId);
}
@Test
- public void getTransportWhitelist_calledBeforeInitialize_ignored() throws Exception {
- assertNull(mTrampoline.getTransportWhitelist());
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void getTransportWhitelist_forwarded() {
when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS);
- mTrampoline.initializeService();
assertEquals(TRANSPORTS, mTrampoline.getTransportWhitelist());
verify(mBackupManagerServiceMock).getTransportWhitelist();
}
@Test
- public void updateTransportAttributesForUser_calledBeforeInitialize_ignored() {
- mTrampoline.updateTransportAttributesForUser(
- mUserId,
- TRANSPORT_COMPONENT_NAME,
- TRANSPORT_NAME,
- null,
- "Transport Destination",
- null,
- "Data Management");
-
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void updateTransportAttributesForUser_forwarded() {
when(mBackupManagerServiceMock.getTransportWhitelist()).thenReturn(TRANSPORTS);
- mTrampoline.initializeService();
mTrampoline.updateTransportAttributesForUser(
mUserId,
@@ -937,14 +784,7 @@
}
@Test
- public void selectBackupTransport_calledBeforeInitialize_ignored() throws RemoteException {
- mTrampoline.selectBackupTransport(TRANSPORT_NAME);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void selectBackupTransportForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.selectBackupTransportForUser(mUserId, TRANSPORT_NAME);
@@ -954,7 +794,6 @@
@Test
public void selectBackupTransport_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.selectBackupTransport(TRANSPORT_NAME);
@@ -962,75 +801,56 @@
}
@Test
- public void selectBackupTransportAsyncForUser_calledBeforeInitialize_ignored()
+ public void selectBackupTransportAsyncForUser_beforeUserUnlocked_notifiesBackupNotAllowed()
throws Exception {
- LinkedBlockingQueue<Integer> q = new LinkedBlockingQueue();
-
- mTrampoline.selectBackupTransportAsyncForUser(
- mUserId,
- TRANSPORT_COMPONENT_NAME,
- new ISelectBackupTransportCallback() {
+ when(mBackupManagerServiceMock.getUserServices()).thenReturn(new SparseArray<>());
+ CompletableFuture<Integer> future = new CompletableFuture<>();
+ ISelectBackupTransportCallback listener =
+ new ISelectBackupTransportCallback.Stub() {
@Override
- public void onSuccess(String transportName) throws RemoteException {
-
+ public void onSuccess(String transportName) {
+ future.completeExceptionally(new AssertionError());
}
-
@Override
- public void onFailure(int reason) throws RemoteException {
- q.offer(reason);
+ public void onFailure(int reason) {
+ future.complete(reason);
}
+ };
- @Override
- public IBinder asBinder() {
- return null;
- }
- });
+ mTrampoline.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, listener);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- Integer errorCode = q.poll(5, TimeUnit.SECONDS);
- assertNotNull(errorCode);
- assertEquals(BackupManager.ERROR_BACKUP_NOT_ALLOWED, (int) errorCode);
+ assertEquals(BackupManager.ERROR_BACKUP_NOT_ALLOWED, (int) future.get(5, TimeUnit.SECONDS));
}
@Test
- public void selectBackupTransportAsyncForUser_calledBeforeInitialize_ignored_nullListener()
+ public void selectBackupTransportAsyncForUser_beforeUserUnlockedWithNullListener_doesNotThrow()
throws Exception {
mTrampoline.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, null);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
// No crash.
}
@Test
- public void selectBackupTransportAsyncForUser_calledBeforeInitialize_ignored_listenerThrows()
+ public void
+ selectBackupTransportAsyncForUser_beforeUserUnlockedWithThrowingListener_doesNotThrow()
throws Exception {
- mTrampoline.selectBackupTransportAsyncForUser(
- mUserId,
- TRANSPORT_COMPONENT_NAME,
- new ISelectBackupTransportCallback() {
+ ISelectBackupTransportCallback.Stub listener =
+ new ISelectBackupTransportCallback.Stub() {
@Override
- public void onSuccess(String transportName) throws RemoteException {
-
- }
-
+ public void onSuccess(String transportName) {}
@Override
public void onFailure(int reason) throws RemoteException {
- throw new RemoteException("Crash");
+ throw new RemoteException();
}
+ };
- @Override
- public IBinder asBinder() {
- return null;
- }
- });
+ mTrampoline.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, listener);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
// No crash.
}
@Test
public void selectBackupTransportAsyncForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.selectBackupTransportAsyncForUser(mUserId, TRANSPORT_COMPONENT_NAME, null);
@@ -1039,17 +859,10 @@
}
@Test
- public void getConfigurationIntent_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.getConfigurationIntent(TRANSPORT_NAME);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void getConfigurationIntentForUser_forwarded() throws Exception {
Intent configurationIntentStub = new Intent();
when(mBackupManagerServiceMock.getConfigurationIntent(mUserId, TRANSPORT_NAME)).thenReturn(
configurationIntentStub);
- mTrampoline.initializeService();
assertEquals(
configurationIntentStub,
@@ -1063,23 +876,15 @@
Intent configurationIntentStub = new Intent();
when(mBackupManagerServiceMock.getConfigurationIntent(mUserId, TRANSPORT_NAME)).thenReturn(
configurationIntentStub);
- mTrampoline.initializeService();
assertEquals(configurationIntentStub, mTrampoline.getConfigurationIntent(TRANSPORT_NAME));
verify(mBackupManagerServiceMock).getConfigurationIntent(mUserId, TRANSPORT_NAME);
}
@Test
- public void getDestinationString_calledBeforeInitialize_ignored() throws Exception {
- assertNull(mTrampoline.getDestinationString(TRANSPORT_NAME));
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void getDestinationStringForUser_forwarded() throws Exception {
when(mBackupManagerServiceMock.getDestinationString(mUserId, TRANSPORT_NAME)).thenReturn(
DESTINATION_STRING);
- mTrampoline.initializeService();
assertEquals(
DESTINATION_STRING,
@@ -1093,23 +898,15 @@
when(mBackupManagerServiceMock.getDestinationString(mUserId, TRANSPORT_NAME)).thenReturn(
DESTINATION_STRING);
- mTrampoline.initializeService();
assertEquals(DESTINATION_STRING, mTrampoline.getDestinationString(TRANSPORT_NAME));
verify(mBackupManagerServiceMock).getDestinationString(mUserId, TRANSPORT_NAME);
}
@Test
- public void getDataManagementIntent_calledBeforeInitialize_ignored() throws Exception {
- assertNull(mTrampoline.getDataManagementIntent(TRANSPORT_NAME));
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void getDataManagementIntentForUser_forwarded() throws Exception {
Intent dataManagementIntent = new Intent();
when(mBackupManagerServiceMock.getDataManagementIntent(mUserId, TRANSPORT_NAME)).thenReturn(
dataManagementIntent);
- mTrampoline.initializeService();
assertEquals(
dataManagementIntent,
@@ -1123,23 +920,15 @@
Intent dataManagementIntent = new Intent();
when(mBackupManagerServiceMock.getDataManagementIntent(mUserId, TRANSPORT_NAME)).thenReturn(
dataManagementIntent);
- mTrampoline.initializeService();
assertEquals(dataManagementIntent, mTrampoline.getDataManagementIntent(TRANSPORT_NAME));
verify(mBackupManagerServiceMock).getDataManagementIntent(mUserId, TRANSPORT_NAME);
}
@Test
- public void getDataManagementLabelForUser_calledBeforeInitialize_ignored() throws Exception {
- assertNull(mTrampoline.getDataManagementLabelForUser(mUserId, TRANSPORT_NAME));
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void getDataManagementLabelForUser_forwarded() throws Exception {
when(mBackupManagerServiceMock.getDataManagementLabel(mUserId, TRANSPORT_NAME)).thenReturn(
DATA_MANAGEMENT_LABEL);
- mTrampoline.initializeService();
assertEquals(
DATA_MANAGEMENT_LABEL,
@@ -1148,14 +937,7 @@
}
@Test
- public void beginRestoreSession_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.beginRestoreSessionForUser(mUserId, PACKAGE_NAME, TRANSPORT_NAME);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void beginRestoreSessionForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.beginRestoreSessionForUser(mUserId, PACKAGE_NAME, TRANSPORT_NAME);
@@ -1164,15 +946,8 @@
}
@Test
- public void opComplete_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.opComplete(1, 2);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void opComplete_forwarded() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.opComplete(1, 2);
@@ -1180,49 +955,27 @@
}
@Test
- public void getAvailableRestoreTokenForUser_calledBeforeInitialize_ignored() {
- assertEquals(0, mTrampoline.getAvailableRestoreTokenForUser(mUserId, PACKAGE_NAME));
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void getAvailableRestoreTokenForUser_forwarded() {
when(mBackupManagerServiceMock.getAvailableRestoreToken(mUserId, PACKAGE_NAME))
.thenReturn(123L);
- mTrampoline.initializeService();
assertEquals(123, mTrampoline.getAvailableRestoreTokenForUser(mUserId, PACKAGE_NAME));
verify(mBackupManagerServiceMock).getAvailableRestoreToken(mUserId, PACKAGE_NAME);
}
@Test
- public void isAppEligibleForBackupForUser_calledBeforeInitialize_ignored() {
- assertFalse(mTrampoline.isAppEligibleForBackupForUser(mUserId, PACKAGE_NAME));
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void isAppEligibleForBackupForUser_forwarded() {
when(mBackupManagerServiceMock.isAppEligibleForBackup(mUserId, PACKAGE_NAME))
.thenReturn(true);
- mTrampoline.initializeService();
assertTrue(mTrampoline.isAppEligibleForBackupForUser(mUserId, PACKAGE_NAME));
verify(mBackupManagerServiceMock).isAppEligibleForBackup(mUserId, PACKAGE_NAME);
}
@Test
- public void requestBackup_calledBeforeInitialize_ignored() throws RemoteException {
- assertEquals(BackupManager.ERROR_BACKUP_NOT_ALLOWED, mTrampoline.requestBackup(
- PACKAGE_NAMES, mBackupObserverMock, mBackupManagerMonitorMock, 123));
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void requestBackupForUser_forwarded() throws Exception {
when(mBackupManagerServiceMock.requestBackup(mUserId, PACKAGE_NAMES,
mBackupObserverMock, mBackupManagerMonitorMock, 123)).thenReturn(456);
- mTrampoline.initializeService();
assertEquals(456, mTrampoline.requestBackupForUser(mUserId, PACKAGE_NAMES,
mBackupObserverMock, mBackupManagerMonitorMock, 123));
@@ -1235,7 +988,6 @@
TrampolineTestable.sCallingUserId = mUserId;
when(mBackupManagerServiceMock.requestBackup(mUserId, PACKAGE_NAMES,
mBackupObserverMock, mBackupManagerMonitorMock, 123)).thenReturn(456);
- mTrampoline.initializeService();
assertEquals(456, mTrampoline.requestBackup(PACKAGE_NAMES,
mBackupObserverMock, mBackupManagerMonitorMock, 123));
@@ -1244,14 +996,7 @@
}
@Test
- public void cancelBackups_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.cancelBackups();
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void cancelBackupsForUser_forwarded() throws Exception {
- mTrampoline.initializeService();
mTrampoline.cancelBackupsForUser(mUserId);
@@ -1261,7 +1006,6 @@
@Test
public void cancelBackups_forwardedToCallingUserId() throws Exception {
TrampolineTestable.sCallingUserId = mUserId;
- mTrampoline.initializeService();
mTrampoline.cancelBackups();
@@ -1269,30 +1013,16 @@
}
@Test
- public void beginFullBackup_calledBeforeInitialize_ignored() throws Exception {
- mTrampoline.beginFullBackup(mUserId, new FullBackupJob());
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void beginFullBackup_forwarded() throws Exception {
FullBackupJob fullBackupJob = new FullBackupJob();
when(mBackupManagerServiceMock.beginFullBackup(mUserId, fullBackupJob)).thenReturn(true);
- mTrampoline.initializeService();
assertTrue(mTrampoline.beginFullBackup(mUserId, fullBackupJob));
verify(mBackupManagerServiceMock).beginFullBackup(mUserId, fullBackupJob);
}
@Test
- public void endFullBackup_calledBeforeInitialize_ignored() {
- mTrampoline.endFullBackup(mUserId);
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
public void endFullBackup_forwarded() {
- mTrampoline.initializeService();
mTrampoline.endFullBackup(mUserId);
verify(mBackupManagerServiceMock).endFullBackup(mUserId);
}
@@ -1302,18 +1032,6 @@
when(mContextMock.checkCallingOrSelfPermission(
android.Manifest.permission.DUMP)).thenReturn(
PackageManager.PERMISSION_DENIED);
- mTrampoline.initializeService();
-
- mTrampoline.dump(mFileDescriptorStub, mPrintWriterMock, new String[0]);
-
- verifyNoMoreInteractions(mBackupManagerServiceMock);
- }
-
- @Test
- public void dump_calledBeforeInitialize_ignored() {
- when(mContextMock.checkCallingOrSelfPermission(
- android.Manifest.permission.DUMP)).thenReturn(
- PackageManager.PERMISSION_GRANTED);
mTrampoline.dump(mFileDescriptorStub, mPrintWriterMock, new String[0]);
@@ -1325,13 +1043,28 @@
when(mContextMock.checkCallingOrSelfPermission(
android.Manifest.permission.DUMP)).thenReturn(
PackageManager.PERMISSION_GRANTED);
- mTrampoline.initializeService();
mTrampoline.dump(mFileDescriptorStub, mPrintWriterMock, null);
verify(mBackupManagerServiceMock).dump(mFileDescriptorStub, mPrintWriterMock, null);
}
+ public void testGetUserForAncestralSerialNumber() {
+ TrampolineTestable.sBackupDisabled = false;
+ Trampoline trampoline = new TrampolineTestable(mContextMock);
+
+ trampoline.getUserForAncestralSerialNumber(0L);
+ verify(mBackupManagerServiceMock).getUserForAncestralSerialNumber(anyInt());
+ }
+
+ public void testGetUserForAncestralSerialNumber_whenDisabled() {
+ TrampolineTestable.sBackupDisabled = true;
+ Trampoline trampoline = new TrampolineTestable(mContextMock);
+
+ trampoline.getUserForAncestralSerialNumber(0L);
+ verify(mBackupManagerServiceMock, never()).getUserForAncestralSerialNumber(anyInt());
+ }
+
private static class TrampolineTestable extends Trampoline {
static boolean sBackupDisabled = false;
static int sCallingUserId = -1;
@@ -1341,10 +1074,10 @@
static SparseArray<File> sActivatedFiles = new SparseArray<>();
static SparseArray<File> sRememberActivatedFiles = new SparseArray<>();
static UserManager sUserManagerMock = null;
- private int mCreateServiceCallsCount = 0;
TrampolineTestable(Context context) {
super(context);
+ mService = sBackupManagerServiceMock;
}
@Override
@@ -1353,7 +1086,7 @@
}
@Override
- public boolean isBackupDisabled() {
+ protected boolean isBackupDisabled() {
return sBackupDisabled;
}
@@ -1382,18 +1115,8 @@
}
@Override
- protected BackupManagerService createBackupManagerService() {
- mCreateServiceCallsCount++;
- return sBackupManagerServiceMock;
- }
-
- @Override
protected void postToHandler(Runnable runnable) {
runnable.run();
}
-
- int getCreateServiceCallsCount() {
- return mCreateServiceCallsCount;
- }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
index f9e4c34..8e0d7be 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java
@@ -311,8 +311,6 @@
public void testFileLocation_Owner() {
LockSettingsStorage storage = new LockSettingsStorage(getContext());
- assertEquals("/data/system/gesture.key", storage.getLegacyLockPatternFilename(0));
- assertEquals("/data/system/password.key", storage.getLegacyLockPasswordFilename(0));
assertEquals("/data/system/gatekeeper.pattern.key", storage.getLockPatternFilename(0));
assertEquals("/data/system/gatekeeper.password.key", storage.getLockPasswordFilename(0));
}
@@ -436,10 +434,8 @@
PAYLOAD, LockPatternUtils.CREDENTIAL_TYPE_PASSWORD).toBytes();
CredentialHash deserialized = CredentialHash.fromBytes(serialized);
- assertEquals(CredentialHash.VERSION_GATEKEEPER, deserialized.version);
assertEquals(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, deserialized.type);
assertArrayEquals(PAYLOAD, deserialized.hash);
- assertFalse(deserialized.isBaseZeroPattern);
}
public void testCredentialHash_unserialize_versionGatekeeper() {
@@ -453,10 +449,8 @@
};
CredentialHash deserialized = CredentialHash.fromBytes(serialized);
- assertEquals(CredentialHash.VERSION_GATEKEEPER, deserialized.version);
assertEquals(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, deserialized.type);
assertArrayEquals(PAYLOAD, deserialized.hash);
- assertFalse(deserialized.isBaseZeroPattern);
// Make sure the constants we use on the wire do not change.
assertEquals(-1, LockPatternUtils.CREDENTIAL_TYPE_NONE);
diff --git a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
index dd3d8b9..05905d9 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ScanTests.java
@@ -70,6 +70,14 @@
PackageAbiHelper mMockPackageAbiHelper;
@Mock
UserManagerInternal mMockUserManager;
+ @Mock
+ PackageManagerService.Injector mMockInjector;
+
+ @Before
+ public void setupInjector() {
+ when(mMockInjector.getAbiHelper()).thenReturn(mMockPackageAbiHelper);
+ when(mMockInjector.getUserManagerInternal()).thenReturn(mMockUserManager);
+ }
@Before
public void setupDefaultUser() {
@@ -401,7 +409,7 @@
final PackageManagerService.ScanResult scanResult = PackageManagerService.scanPackageOnlyLI(
createBasicScanRequestBuilder(basicPackage).build(),
- new PackageManagerService.Injector(mMockUserManager, mMockPackageAbiHelper),
+ mMockInjector,
true /*isUnderFactoryTest*/,
System.currentTimeMillis());
@@ -448,7 +456,7 @@
PackageManagerService.ScanRequest scanRequest) throws PackageManagerException {
return PackageManagerService.scanPackageOnlyLI(
scanRequest,
- new PackageManagerService.Injector(mMockUserManager, mMockPackageAbiHelper),
+ mMockInjector,
false /*isUnderFactoryTest*/,
System.currentTimeMillis());
}
diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
index 1bda412..88de250 100644
--- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java
@@ -23,7 +23,10 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
@@ -59,6 +62,7 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
+import android.view.Display;
import androidx.test.InstrumentationRegistry;
@@ -157,6 +161,10 @@
mResourcesSpy = spy(mContextSpy.getResources());
when(mContextSpy.getResources()).thenReturn(mResourcesSpy);
+ when(mDisplayManagerInternalMock.requestPowerState(any(), anyBoolean())).thenReturn(true);
+ }
+
+ private PowerManagerService createService() {
mService = new PowerManagerService(mContextSpy, new Injector() {
@Override
Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats,
@@ -166,7 +174,7 @@
@Override
SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) {
- return mock(SuspendBlocker.class);
+ return super.createSuspendBlocker(service, name);
}
@Override
@@ -191,6 +199,7 @@
return mAmbientDisplayConfigurationMock;
}
});
+ return mService;
}
@After
@@ -262,6 +271,7 @@
@Test
public void testUpdatePowerScreenPolicy_UpdateDisplayPowerRequest() {
+ createService();
mService.updatePowerRequestFromBatterySaverPolicy(mDisplayPowerRequest);
assertThat(mDisplayPowerRequest.lowPowerMode).isEqualTo(BATTERY_SAVER_ENABLED);
assertThat(mDisplayPowerRequest.screenLowPowerBrightnessFactor)
@@ -270,6 +280,7 @@
@Test
public void testGetLastShutdownReasonInternal() {
+ createService();
SystemProperties.set(TEST_LAST_REBOOT_PROPERTY, "shutdown,thermal");
int reason = mService.getLastShutdownReasonInternal(TEST_LAST_REBOOT_PROPERTY);
SystemProperties.set(TEST_LAST_REBOOT_PROPERTY, "");
@@ -278,6 +289,7 @@
@Test
public void testGetDesiredScreenPolicy_WithVR() throws Exception {
+ createService();
// Brighten up the screen
mService.setWakefulnessLocked(WAKEFULNESS_AWAKE, PowerManager.WAKE_REASON_UNKNOWN, 0);
assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo(
@@ -307,11 +319,13 @@
@Test
public void testWakefulnessAwake_InitialValue() throws Exception {
+ createService();
assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
}
@Test
public void testWakefulnessSleep_NoDozeSleepFlag() throws Exception {
+ createService();
// Start with AWAKE state
startSystem();
assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
@@ -324,6 +338,7 @@
@Test
public void testWakefulnessAwake_AcquireCausesWakeup() throws Exception {
+ createService();
startSystem();
forceSleep();
@@ -355,6 +370,7 @@
@Test
public void testWakefulnessAwake_IPowerManagerWakeUp() throws Exception {
+ createService();
startSystem();
forceSleep();
mService.getBinderServiceInstance().wakeUp(SystemClock.uptimeMillis(),
@@ -369,6 +385,8 @@
@Test
public void testWakefulnessAwake_ShouldWakeUpWhenPluggedIn() throws Exception {
boolean powerState;
+
+ createService();
startSystem();
forceSleep();
@@ -444,6 +462,7 @@
@Test
public void testWakefulnessDoze_goToSleep() throws Exception {
+ createService();
// Start with AWAKE state
startSystem();
assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
@@ -457,6 +476,7 @@
@Test
public void testWasDeviceIdleFor_true() {
int interval = 1000;
+ createService();
mService.onUserActivity();
SystemClock.sleep(interval + 1 /* just a little more */);
assertThat(mService.wasDeviceIdleForInternal(interval)).isTrue();
@@ -465,12 +485,14 @@
@Test
public void testWasDeviceIdleFor_false() {
int interval = 1000;
+ createService();
mService.onUserActivity();
assertThat(mService.wasDeviceIdleForInternal(interval)).isFalse();
}
@Test
public void testForceSuspend_putsDeviceToSleep() {
+ createService();
mService.systemReady(null);
mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
@@ -497,6 +519,8 @@
final int flags = PowerManager.PARTIAL_WAKE_LOCK;
final String pkg = mContextSpy.getOpPackageName();
+ createService();
+
// Set up the Notification mock to keep track of the wakelocks that are currently
// active or disabled. We'll use this to verify that wakelocks are disabled when
// they should be.
@@ -541,7 +565,54 @@
@Test
public void testForceSuspend_forceSuspendFailurePropogated() {
+ createService();
when(mNativeWrapperMock.nativeForceSuspend()).thenReturn(false);
assertThat(mService.getBinderServiceInstance().forceSuspend()).isFalse();
}
+
+ @Test
+ public void testSetDozeOverrideFromDreamManager_triggersSuspendBlocker() throws Exception {
+ final String suspendBlockerName = "PowerManagerService.Display";
+ final String tag = "acq_causes_wakeup";
+ final String packageName = "pkg.name";
+ final IBinder token = new Binder();
+
+ final boolean[] isAcquired = new boolean[1];
+ doAnswer(inv -> {
+ if (suspendBlockerName.equals(inv.getArguments()[0])) {
+ isAcquired[0] = false;
+ }
+ return null;
+ }).when(mNativeWrapperMock).nativeReleaseSuspendBlocker(any());
+
+ doAnswer(inv -> {
+ if (suspendBlockerName.equals(inv.getArguments()[0])) {
+ isAcquired[0] = true;
+ }
+ return null;
+ }).when(mNativeWrapperMock).nativeAcquireSuspendBlocker(any());
+
+ // Need to create the service after we stub the mocks for this test because some of the
+ // mocks are used during the constructor.
+ createService();
+
+ // Start with AWAKE state
+ startSystem();
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
+ assertTrue(isAcquired[0]);
+
+ // Take a nap and verify we no longer hold the blocker
+ int flags = PowerManager.DOZE_WAKE_LOCK;
+ mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName,
+ null /* workSource */, null /* historyTag */);
+ mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(),
+ PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0);
+ assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_DOZING);
+ assertFalse(isAcquired[0]);
+
+ // Override the display state by DreamManager and verify is reacquires the blocker.
+ mService.getLocalServiceInstance()
+ .setDozeOverrideFromDreamManager(Display.STATE_ON, PowerManager.BRIGHTNESS_DEFAULT);
+ assertTrue(isAcquired[0]);
+ }
}
diff --git a/services/tests/servicestests/test-apps/JobTestApp/Android.bp b/services/tests/servicestests/test-apps/JobTestApp/Android.bp
index ae1eca7..b29e187 100644
--- a/services/tests/servicestests/test-apps/JobTestApp/Android.bp
+++ b/services/tests/servicestests/test-apps/JobTestApp/Android.bp
@@ -17,8 +17,6 @@
sdk_version: "current",
- test_suites: ["device-tests"],
-
srcs: ["**/*.java"],
dex_preopt: {
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index f14e8d2..c1c0a30 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -2005,6 +2005,73 @@
}
@Test
+ public void testSnoozeRunnable_reSnoozeASingleSnoozedNotification() throws Exception {
+ final NotificationRecord notification = generateNotificationRecord(
+ mTestNotificationChannel, 1, null, true);
+ mService.addNotification(notification);
+ when(mSnoozeHelper.getNotification(any())).thenReturn(notification);
+
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =
+ mService.new SnoozeNotificationRunnable(
+ notification.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 =
+ mService.new SnoozeNotificationRunnable(
+ notification.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+
+ // snooze twice
+ verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong());
+ }
+
+ @Test
+ public void testSnoozeRunnable_reSnoozeASnoozedNotificationWithGroupKey() throws Exception {
+ final NotificationRecord notification = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ mService.addNotification(notification);
+ when(mSnoozeHelper.getNotification(any())).thenReturn(notification);
+
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =
+ mService.new SnoozeNotificationRunnable(
+ notification.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 =
+ mService.new SnoozeNotificationRunnable(
+ notification.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+
+ // snooze twice
+ verify(mSnoozeHelper, times(2)).snooze(any(NotificationRecord.class), anyLong());
+ }
+
+ @Test
+ public void testSnoozeRunnable_reSnoozeMultipleNotificationsWithGroupKey() throws Exception {
+ final NotificationRecord notification = generateNotificationRecord(
+ mTestNotificationChannel, 1, "group", true);
+ final NotificationRecord notification2 = generateNotificationRecord(
+ mTestNotificationChannel, 2, "group", true);
+ mService.addNotification(notification);
+ mService.addNotification(notification2);
+ when(mSnoozeHelper.getNotification(any())).thenReturn(notification);
+ when(mSnoozeHelper.getNotifications(
+ anyString(), anyString(), anyInt())).thenReturn(new ArrayList<>());
+
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable =
+ mService.new SnoozeNotificationRunnable(
+ notification.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+ when(mSnoozeHelper.getNotifications(anyString(), anyString(), anyInt()))
+ .thenReturn(new ArrayList<>(Arrays.asList(notification, notification2)));
+ NotificationManagerService.SnoozeNotificationRunnable snoozeNotificationRunnable2 =
+ mService.new SnoozeNotificationRunnable(
+ notification.getKey(), 100, null);
+ snoozeNotificationRunnable.run();
+
+ // snooze twice
+ verify(mSnoozeHelper, times(4)).snooze(any(NotificationRecord.class), anyLong());
+ }
+
+ @Test
public void testSnoozeRunnable_snoozeNonGrouped() throws Exception {
final NotificationRecord nonGrouped = generateNotificationRecord(
mTestNotificationChannel, 1, null, false);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
index 1e64543..2e7277f 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java
@@ -264,6 +264,63 @@
}
@Test
+ public void testGetSnoozedGroupNotifications() throws Exception {
+ IntArray profileIds = new IntArray();
+ profileIds.add(UserHandle.USER_CURRENT);
+ when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds);
+ NotificationRecord r = getNotificationRecord("pkg", 1, "tag",
+ UserHandle.CURRENT, "group", true);
+ NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag",
+ UserHandle.CURRENT, "group", true);
+ NotificationRecord r3 = getNotificationRecord("pkg2", 3, "tag",
+ UserHandle.CURRENT, "group", true);
+ NotificationRecord r4 = getNotificationRecord("pkg2", 4, "tag",
+ UserHandle.CURRENT, "group", true);
+ mSnoozeHelper.snooze(r, 1000);
+ mSnoozeHelper.snooze(r2, 1000);
+ mSnoozeHelper.snooze(r3, 1000);
+ mSnoozeHelper.snooze(r4, 1000);
+
+ assertEquals(2,
+ mSnoozeHelper.getNotifications("pkg", "group", UserHandle.USER_CURRENT).size());
+ }
+
+ @Test
+ public void testGetSnoozedNotificationByKey() throws Exception {
+ IntArray profileIds = new IntArray();
+ profileIds.add(UserHandle.USER_CURRENT);
+ when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds);
+ NotificationRecord r = getNotificationRecord("pkg", 1, "tag",
+ UserHandle.CURRENT, "group", true);
+ NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag",
+ UserHandle.CURRENT, "group", true);
+ NotificationRecord r3 = getNotificationRecord("pkg2", 3, "tag",
+ UserHandle.CURRENT, "group", true);
+ NotificationRecord r4 = getNotificationRecord("pkg2", 4, "tag",
+ UserHandle.CURRENT, "group", true);
+ mSnoozeHelper.snooze(r, 1000);
+ mSnoozeHelper.snooze(r2, 1000);
+ mSnoozeHelper.snooze(r3, 1000);
+ mSnoozeHelper.snooze(r4, 1000);
+
+ assertEquals(r, mSnoozeHelper.getNotification(r.getKey()));
+ }
+
+ @Test
+ public void testGetUnSnoozedNotificationByKey() throws Exception {
+ IntArray profileIds = new IntArray();
+ profileIds.add(UserHandle.USER_CURRENT);
+ when(mUserProfiles.getCurrentProfileIds()).thenReturn(profileIds);
+ NotificationRecord r = getNotificationRecord("pkg", 1, "tag",
+ UserHandle.CURRENT, "group", true);
+ NotificationRecord r2 = getNotificationRecord("pkg", 2, "tag",
+ UserHandle.CURRENT, "group", true);
+ mSnoozeHelper.snooze(r2, 1000);
+
+ assertEquals(null, mSnoozeHelper.getNotification(r.getKey()));
+ }
+
+ @Test
public void repostGroupSummary_onlyFellowGroupChildren() throws Exception {
NotificationRecord r = getNotificationRecord(
"pkg", 1, "one", UserHandle.SYSTEM, "group1", false);
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
index f602418..d1dc382 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionTests.java
@@ -207,7 +207,7 @@
final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter(
runner, 100, 50, true /* changeNeedsSnapshot */);
// RemoteAnimationController will tracking RemoteAnimationAdapter's caller with calling pid.
- adapter.setCallingPid(123);
+ adapter.setCallingPidUid(123, 456);
// Simulate activity finish flows to prepare app transition & set visibility,
// make sure transition is set as expected.
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java
index 7f35dac..d9566a3 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -504,6 +504,21 @@
assertEquals(stackBounds, mToken.getAnimationBounds(STACK_CLIP_BEFORE_ANIM));
}
+ @Test
+ public void testHasStartingWindow() {
+ final WindowManager.LayoutParams attrs =
+ new WindowManager.LayoutParams(TYPE_APPLICATION_STARTING);
+ final WindowTestUtils.TestWindowState startingWindow = createWindowState(attrs, mToken);
+ mToken.startingDisplayed = true;
+ mToken.addWindow(startingWindow);
+ assertTrue("Starting window should be present", mToken.hasStartingWindow());
+ mToken.startingDisplayed = false;
+ assertTrue("Starting window should be present", mToken.hasStartingWindow());
+
+ mToken.removeChild(startingWindow);
+ assertFalse("Starting window should not be present", mToken.hasStartingWindow());
+ }
+
private void assertHasStartingWindow(AppWindowToken atoken) {
assertNotNull(atoken.startingSurface);
assertNotNull(atoken.mStartingData);
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index c5e7c47..388658d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -756,7 +756,8 @@
final ISystemGestureExclusionListener.Stub verifier =
new ISystemGestureExclusionListener.Stub() {
@Override
- public void onSystemGestureExclusionChanged(int displayId, Region actual) {
+ public void onSystemGestureExclusionChanged(int displayId, Region actual,
+ Region unrestricted) {
Region expected = Region.obtain();
expected.set(10, 20, 30, 40);
assertEquals(expected, actual);
@@ -790,7 +791,14 @@
final Region expected = Region.obtain();
expected.set(20, 30, 40, 50);
- assertEquals(expected, dc.calculateSystemGestureExclusion());
+ assertEquals(expected, calculateSystemGestureExclusion(dc));
+ }
+
+ private Region calculateSystemGestureExclusion(DisplayContent dc) {
+ Region out = Region.obtain();
+ Region unrestricted = Region.obtain();
+ dc.calculateSystemGestureExclusion(out, unrestricted);
+ return out;
}
@Test
@@ -814,7 +822,7 @@
win2.setHasSurface(true);
final Region expected = Region.obtain();
- assertEquals(expected, dc.calculateSystemGestureExclusion());
+ assertEquals(expected, calculateSystemGestureExclusion(dc));
}
@Test
@@ -839,7 +847,7 @@
final Region expected = Region.obtain();
expected.set(dc.getBounds());
- assertEquals(expected, dc.calculateSystemGestureExclusion());
+ assertEquals(expected, calculateSystemGestureExclusion(dc));
win.setHasSurface(false);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
index cb74c3e..74791e2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RemoteAnimationControllerTest.java
@@ -79,7 +79,7 @@
when(mMockRunner.asBinder()).thenReturn(new Binder());
mAdapter = new RemoteAnimationAdapter(mMockRunner, 100, 50, true /* changeNeedsSnapshot */);
- mAdapter.setCallingPid(123);
+ mAdapter.setCallingPidUid(123, 456);
mWm.mH.runWithScissors(() -> mHandler = new TestHandler(null, mClock), 0);
mController = new RemoteAnimationController(mWm, mAdapter, mHandler);
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
index a7c84a1..8c56ffa 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java
@@ -23,12 +23,18 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import android.content.pm.ApplicationInfo;
import android.platform.test.annotations.Presubmit;
+import org.junit.Before;
import org.junit.Test;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
/**
* Tests for the {@link WindowProcessController} class.
@@ -39,43 +45,89 @@
@Presubmit
public class WindowProcessControllerTests extends ActivityTestsBase {
+ WindowProcessController mWpc;
+ WindowProcessListener mMockListener;
+
+ @Before
+ public void setUp() {
+ mMockListener = mock(WindowProcessListener.class);
+ mWpc = new WindowProcessController(
+ mService, mock(ApplicationInfo.class), null, 0, -1, null, mMockListener);
+ }
+
@Test
public void testDisplayConfigurationListener() {
- final WindowProcessController wpc = new WindowProcessController(
- mService, mock(ApplicationInfo.class), null, 0, -1, null, null);
+
//By default, the process should not listen to any display.
- assertEquals(INVALID_DISPLAY, wpc.getDisplayId());
+ assertEquals(INVALID_DISPLAY, mWpc.getDisplayId());
// Register to display 1 as a listener.
TestActivityDisplay testActivityDisplay1 = createTestActivityDisplayInContainer();
- wpc.registerDisplayConfigurationListenerLocked(testActivityDisplay1);
- assertTrue(testActivityDisplay1.containsListener(wpc));
- assertEquals(testActivityDisplay1.mDisplayId, wpc.getDisplayId());
+ mWpc.registerDisplayConfigurationListenerLocked(testActivityDisplay1);
+ assertTrue(testActivityDisplay1.containsListener(mWpc));
+ assertEquals(testActivityDisplay1.mDisplayId, mWpc.getDisplayId());
// Move to display 2.
TestActivityDisplay testActivityDisplay2 = createTestActivityDisplayInContainer();
- wpc.registerDisplayConfigurationListenerLocked(testActivityDisplay2);
- assertFalse(testActivityDisplay1.containsListener(wpc));
- assertTrue(testActivityDisplay2.containsListener(wpc));
- assertEquals(testActivityDisplay2.mDisplayId, wpc.getDisplayId());
+ mWpc.registerDisplayConfigurationListenerLocked(testActivityDisplay2);
+ assertFalse(testActivityDisplay1.containsListener(mWpc));
+ assertTrue(testActivityDisplay2.containsListener(mWpc));
+ assertEquals(testActivityDisplay2.mDisplayId, mWpc.getDisplayId());
// Null ActivityDisplay will not change anything.
- wpc.registerDisplayConfigurationListenerLocked(null);
- assertTrue(testActivityDisplay2.containsListener(wpc));
- assertEquals(testActivityDisplay2.mDisplayId, wpc.getDisplayId());
+ mWpc.registerDisplayConfigurationListenerLocked(null);
+ assertTrue(testActivityDisplay2.containsListener(mWpc));
+ assertEquals(testActivityDisplay2.mDisplayId, mWpc.getDisplayId());
// Unregister listener will remove the wpc from registered displays.
- wpc.unregisterDisplayConfigurationListenerLocked();
- assertFalse(testActivityDisplay1.containsListener(wpc));
- assertFalse(testActivityDisplay2.containsListener(wpc));
- assertEquals(INVALID_DISPLAY, wpc.getDisplayId());
+ mWpc.unregisterDisplayConfigurationListenerLocked();
+ assertFalse(testActivityDisplay1.containsListener(mWpc));
+ assertFalse(testActivityDisplay2.containsListener(mWpc));
+ assertEquals(INVALID_DISPLAY, mWpc.getDisplayId());
// Unregistration still work even if the display was removed.
- wpc.registerDisplayConfigurationListenerLocked(testActivityDisplay1);
- assertEquals(testActivityDisplay1.mDisplayId, wpc.getDisplayId());
+ mWpc.registerDisplayConfigurationListenerLocked(testActivityDisplay1);
+ assertEquals(testActivityDisplay1.mDisplayId, mWpc.getDisplayId());
mRootActivityContainer.removeChild(testActivityDisplay1);
- wpc.unregisterDisplayConfigurationListenerLocked();
- assertEquals(INVALID_DISPLAY, wpc.getDisplayId());
+ mWpc.unregisterDisplayConfigurationListenerLocked();
+ assertEquals(INVALID_DISPLAY, mWpc.getDisplayId());
+ }
+
+ @Test
+ public void testSetRunningRecentsAnimation() {
+ mWpc.setRunningRecentsAnimation(true);
+ mWpc.setRunningRecentsAnimation(false);
+ mService.mH.runWithScissors(() -> {}, 0);
+
+ InOrder orderVerifier = Mockito.inOrder(mMockListener);
+ orderVerifier.verify(mMockListener).setRunningRemoteAnimation(eq(true));
+ orderVerifier.verify(mMockListener).setRunningRemoteAnimation(eq(false));
+ }
+
+ @Test
+ public void testSetRunningRemoteAnimation() {
+ mWpc.setRunningRemoteAnimation(true);
+ mWpc.setRunningRemoteAnimation(false);
+ mService.mH.runWithScissors(() -> {}, 0);
+
+ InOrder orderVerifier = Mockito.inOrder(mMockListener);
+ orderVerifier.verify(mMockListener).setRunningRemoteAnimation(eq(true));
+ orderVerifier.verify(mMockListener).setRunningRemoteAnimation(eq(false));
+ }
+
+ @Test
+ public void testSetRunningBothAnimations() {
+ mWpc.setRunningRemoteAnimation(true);
+ mWpc.setRunningRecentsAnimation(true);
+
+ mWpc.setRunningRecentsAnimation(false);
+ mWpc.setRunningRemoteAnimation(false);
+ mService.mH.runWithScissors(() -> {}, 0);
+
+ InOrder orderVerifier = Mockito.inOrder(mMockListener);
+ orderVerifier.verify(mMockListener, times(3)).setRunningRemoteAnimation(eq(true));
+ orderVerifier.verify(mMockListener, times(1)).setRunningRemoteAnimation(eq(false));
+ orderVerifier.verifyNoMoreInteractions();
}
private TestActivityDisplay createTestActivityDisplayInContainer() {
diff --git a/startop/view_compiler/Android.bp b/startop/view_compiler/Android.bp
index 92ea872..4f6524e 100644
--- a/startop/view_compiler/Android.bp
+++ b/startop/view_compiler/Android.bp
@@ -77,7 +77,6 @@
name: "view-compiler-tests",
defaults: ["viewcompiler_defaults"],
srcs: [
- "dex_builder_test.cc",
"layout_validation_test.cc",
"util_test.cc",
],
diff --git a/startop/view_compiler/dex_builder_test.cc b/startop/view_compiler/dex_builder_test.cc
deleted file mode 100644
index 90c256f..0000000
--- a/startop/view_compiler/dex_builder_test.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2018 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.
- */
-
-#include "dex_builder.h"
-
-#include "dex/art_dex_file_loader.h"
-#include "dex/dex_file.h"
-#include "gtest/gtest.h"
-
-using namespace startop::dex;
-
-// Takes a DexBuilder, encodes it into an in-memory DEX file, verifies the resulting DEX file and
-// returns whether the verification was successful.
-bool EncodeAndVerify(DexBuilder* dex_file) {
- slicer::MemView image{dex_file->CreateImage()};
-
- art::ArtDexFileLoader loader;
- std::string error_msg;
- std::unique_ptr<const art::DexFile> loaded_dex_file{loader.Open(image.ptr<const uint8_t>(),
- image.size(),
- /*location=*/"",
- /*location_checksum=*/0,
- /*oat_dex_file=*/nullptr,
- /*verify=*/true,
- /*verify_checksum=*/false,
- &error_msg)};
- return loaded_dex_file != nullptr;
-}
-
-// Write out and verify a DEX file that corresponds to:
-//
-// package dextest;
-// public class DexTest {
-// public static void foo() {}
-// }
-TEST(DexBuilderTest, VerifyDexWithClassMethod) {
- DexBuilder dex_file;
-
- auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
-
- auto method{cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Void()})};
- method.BuildReturn();
- method.Encode();
-
- EXPECT_TRUE(EncodeAndVerify(&dex_file));
-}
-
-// Makes sure a bad DEX class fails to verify.
-TEST(DexBuilderTest, VerifyBadDexWithClassMethod) {
- DexBuilder dex_file;
-
- auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
-
- // This method has the error, because methods cannot take Void() as a parameter.
- auto method{
- cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Void(), TypeDescriptor::Void()})};
- method.BuildReturn();
- method.Encode();
-
- EXPECT_FALSE(EncodeAndVerify(&dex_file));
-}
-
-// Write out and verify a DEX file that corresponds to:
-//
-// package dextest;
-// public class DexTest {
-// public static int foo() { return 5; }
-// }
-TEST(DexBuilderTest, VerifyDexReturn5) {
- DexBuilder dex_file;
-
- auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
-
- auto method{cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Int()})};
- auto r = method.MakeRegister();
- method.BuildConst4(r, 5);
- method.BuildReturn(r);
- method.Encode();
-
- EXPECT_TRUE(EncodeAndVerify(&dex_file));
-}
-
-// Write out and verify a DEX file that corresponds to:
-//
-// package dextest;
-// public class DexTest {
-// public static int foo(int x) { return x; }
-// }
-TEST(DexBuilderTest, VerifyDexReturnIntParam) {
- DexBuilder dex_file;
-
- auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
-
- auto method{
- cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Int(), TypeDescriptor::Int()})};
- method.BuildReturn(Value::Parameter(0));
- method.Encode();
-
- EXPECT_TRUE(EncodeAndVerify(&dex_file));
-}
-
-// Write out and verify a DEX file that corresponds to:
-//
-// package dextest;
-// public class DexTest {
-// public static int foo(String s) { return s.length(); }
-// }
-TEST(DexBuilderTest, VerifyDexCallStringLength) {
- DexBuilder dex_file;
-
- auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
-
- MethodBuilder method{cbuilder.CreateMethod(
- "foo", Prototype{TypeDescriptor::Int(), TypeDescriptor::FromClassname("java.lang.String")})};
-
- Value result = method.MakeRegister();
-
- MethodDeclData string_length =
- dex_file.GetOrDeclareMethod(TypeDescriptor::FromClassname("java.lang.String"),
- "length",
- Prototype{TypeDescriptor::Int()});
-
- method.AddInstruction(Instruction::InvokeVirtual(string_length.id, result, Value::Parameter(0)));
- method.BuildReturn(result);
-
- method.Encode();
-
- EXPECT_TRUE(EncodeAndVerify(&dex_file));
-}
-
-// Write out and verify a DEX file that corresponds to:
-//
-// package dextest;
-// public class DexTest {
-// public static int foo(String s) { return s.length(); }
-// }
-TEST(DexBuilderTest, VerifyDexCallManyRegisters) {
- DexBuilder dex_file;
-
- auto cbuilder{dex_file.MakeClass("dextest.DexTest")};
-
- MethodBuilder method{cbuilder.CreateMethod(
- "foo", Prototype{TypeDescriptor::Int()})};
-
- Value result = method.MakeRegister();
-
- // Make a bunch of registers
- for (size_t i = 0; i < 25; ++i) {
- method.MakeRegister();
- }
-
- // Now load a string literal into a register
- Value string_val = method.MakeRegister();
- method.BuildConstString(string_val, "foo");
-
- MethodDeclData string_length =
- dex_file.GetOrDeclareMethod(TypeDescriptor::FromClassname("java.lang.String"),
- "length",
- Prototype{TypeDescriptor::Int()});
-
- method.AddInstruction(Instruction::InvokeVirtual(string_length.id, result, string_val));
- method.BuildReturn(result);
-
- method.Encode();
-
- EXPECT_TRUE(EncodeAndVerify(&dex_file));
-}
diff --git a/startop/view_compiler/dex_layout_compiler.cc b/startop/view_compiler/dex_layout_compiler.cc
index c68793d..8febfb7 100644
--- a/startop/view_compiler/dex_layout_compiler.cc
+++ b/startop/view_compiler/dex_layout_compiler.cc
@@ -23,25 +23,6 @@
using android::base::StringPrintf;
-void LayoutValidationVisitor::VisitStartTag(const std::u16string& name) {
- if (0 == name.compare(u"merge")) {
- message_ = "Merge tags are not supported";
- can_compile_ = false;
- }
- if (0 == name.compare(u"include")) {
- message_ = "Include tags are not supported";
- can_compile_ = false;
- }
- if (0 == name.compare(u"view")) {
- message_ = "View tags are not supported";
- can_compile_ = false;
- }
- if (0 == name.compare(u"fragment")) {
- message_ = "Fragment tags are not supported";
- can_compile_ = false;
- }
-}
-
DexViewBuilder::DexViewBuilder(dex::MethodBuilder* method)
: method_{method},
context_{dex::Value::Parameter(0)},
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index cd79f37..fb2c87a 100755
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -2328,6 +2328,13 @@
public static final String KEY_RTT_DOWNGRADE_SUPPORTED_BOOL = "rtt_downgrade_supported_bool";
/**
+ * Indicates if the TTY HCO and VCO options should be hidden in the accessibility menu
+ * if the device is capable of RTT.
+ * @hide
+ */
+ public static final String KEY_HIDE_TTY_HCO_VCO_WITH_RTT_BOOL = "hide_tty_hco_vco_with_rtt";
+
+ /**
* The flag to disable the popup dialog which warns the user of data charges.
* @hide
*/
@@ -2407,6 +2414,14 @@
public static final String KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL =
"check_pricing_with_carrier_data_roaming_bool";
+ /**
+ * Determines whether we should show a notification when the phone established a data
+ * connection in roaming network, to warn users about possible roaming charges.
+ * @hide
+ */
+ public static final String KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL =
+ "show_data_connected_roaming_notification";
+
/**
* A list of 4 LTE RSRP thresholds above which a signal level is considered POOR,
* MODERATE, GOOD, or EXCELLENT, to be used in SignalStrength reporting.
@@ -2703,12 +2718,20 @@
/**
* Controls hysteresis time in milli seconds for which OpportunisticNetworkService
- * will wait before switching data to a network.
+ * will wait before switching data to an opportunistic network.
*/
public static final String KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG =
"opportunistic_network_data_switch_hysteresis_time_long";
/**
+ * Controls hysteresis time in milli seconds for which OpportunisticNetworkService
+ * will wait before switching data from opportunistic network to primary network.
+ * @hide
+ */
+ public static final String KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_EXIT_HYSTERESIS_TIME_LONG =
+ "opportunistic_network_data_switch_exit_hysteresis_time_long";
+
+ /**
* Indicates zero or more emergency number prefix(es), because some carrier requires
* if users dial an emergency number address with a specific prefix, the combination of the
* prefix and the address is also a valid emergency number to dial. For example, an emergency
@@ -2894,7 +2917,7 @@
defaults.putString(KEY_SUPL_VER_STRING, "0x20000");
defaults.putString(KEY_SUPL_MODE_STRING, "1");
defaults.putString(KEY_SUPL_ES_STRING, "1");
- defaults.putString(KEY_LPP_PROFILE_STRING, "0");
+ defaults.putString(KEY_LPP_PROFILE_STRING, "2");
defaults.putString(KEY_USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_STRING, "1");
defaults.putString(KEY_A_GLONASS_POS_PROTOCOL_SELECT_STRING, "0");
defaults.putString(KEY_GPS_LOCK_STRING, "3");
@@ -3406,6 +3429,7 @@
sDefaults.putBoolean(KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, false);
sDefaults.putBoolean(KEY_RTT_SUPPORTED_BOOL, false);
sDefaults.putBoolean(KEY_TTY_SUPPORTED_BOOL, true);
+ sDefaults.putBoolean(KEY_HIDE_TTY_HCO_VCO_WITH_RTT_BOOL, false);
sDefaults.putBoolean(KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
sDefaults.putBoolean(KEY_SUPPORT_NO_REPLY_TIMER_FOR_CFNRY_BOOL, true);
sDefaults.putStringArray(KEY_FEATURE_ACCESS_CODES_STRING_ARRAY, null);
@@ -3424,6 +3448,7 @@
sDefaults.putString(KEY_CARRIER_SETTINGS_ACTIVITY_COMPONENT_NAME_STRING, "");
sDefaults.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
sDefaults.putBoolean(KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL, false);
+ sDefaults.putBoolean(KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL, false);
sDefaults.putIntArray(KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY,
new int[] {
-128, /* SIGNAL_STRENGTH_POOR */
@@ -3467,6 +3492,8 @@
sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_ENTRY_OR_EXIT_HYSTERESIS_TIME_LONG, 10000);
/* Default value is 10 seconds. */
sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG, 10000);
+ /* Default value is 3 seconds. */
+ sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_EXIT_HYSTERESIS_TIME_LONG, 3000);
sDefaults.putAll(Gps.getDefaults());
sDefaults.putAll(Wifi.getDefaults());
sDefaults.putIntArray(KEY_CDMA_ENHANCED_ROAMING_INDICATOR_FOR_HOME_NETWORK_INT_ARRAY,
diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java
index cdf4c93..aa7e21a 100644
--- a/telephony/java/android/telephony/DisconnectCause.java
+++ b/telephony/java/android/telephony/DisconnectCause.java
@@ -340,6 +340,19 @@
*/
public static final int MEDIA_TIMEOUT = 77;
+ /**
+ * Indicates that an emergency call cannot be placed over WFC because the service is not
+ * available in the current location.
+ * @hide
+ */
+ public static final int EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE = 78;
+
+ /**
+ * Indicates that WiFi calling service is not available in the current location.
+ * @hide
+ */
+ public static final int WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION = 79;
+
//*********************************************************************************************
// When adding a disconnect type:
// 1) Update toString() with the newly added disconnect type.
@@ -510,6 +523,10 @@
return "OTASP_PROVISIONING_IN_PROCESS";
case MEDIA_TIMEOUT:
return "MEDIA_TIMEOUT";
+ case EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE:
+ return "EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE";
+ case WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION:
+ return "WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION";
default:
return "INVALID: " + cause;
}
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index b75e515..f03a9dc 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -22,9 +22,11 @@
import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
import android.annotation.IntDef;
+import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
import android.database.Cursor;
import android.location.CountryDetector;
import android.net.Uri;
@@ -164,6 +166,33 @@
return c == 'w'||c == 'W';
}
+ private static int sMinMatch = 0;
+
+ private static int getMinMatch() {
+ if (sMinMatch == 0) {
+ sMinMatch = Resources.getSystem().getInteger(
+ com.android.internal.R.integer.config_phonenumber_compare_min_match);
+ }
+ return sMinMatch;
+ }
+
+ /**
+ * A Test API to get current sMinMatch.
+ * @hide
+ */
+ @TestApi
+ public static int getMinMatchForTest() {
+ return getMinMatch();
+ }
+
+ /**
+ * A Test API to set sMinMatch.
+ * @hide
+ */
+ @TestApi
+ public static void setMinMatchForTest(int minMatch) {
+ sMinMatch = minMatch;
+ }
/** Returns true if ch is not dialable or alpha char */
private static boolean isSeparator(char ch) {
@@ -475,7 +504,7 @@
* enough for caller ID purposes.
*
* - Compares from right to left
- * - requires MIN_MATCH (7) characters to match
+ * - requires minimum characters to match
* - handles common trunk prefixes and international prefixes
* (basically, everything except the Russian trunk prefix)
*
@@ -491,6 +520,7 @@
int matched;
int numNonDialableCharsInA = 0;
int numNonDialableCharsInB = 0;
+ int minMatch = getMinMatch();
if (a == null || b == null) return a == b;
@@ -530,12 +560,12 @@
}
}
- if (matched < MIN_MATCH) {
+ if (matched < minMatch) {
int effectiveALen = a.length() - numNonDialableCharsInA;
int effectiveBLen = b.length() - numNonDialableCharsInB;
- // if the number of dialable chars in a and b match, but the matched chars < MIN_MATCH,
+ // if the number of dialable chars in a and b match, but the matched chars < minMatch,
// treat them as equal (i.e. 404-04 and 40404)
if (effectiveALen == effectiveBLen && effectiveALen == matched) {
return true;
@@ -545,7 +575,7 @@
}
// At least one string has matched completely;
- if (matched >= MIN_MATCH && (ia < 0 || ib < 0)) {
+ if (matched >= minMatch && (ia < 0 || ib < 0)) {
return true;
}
@@ -736,7 +766,7 @@
}
/**
- * Returns the rightmost MIN_MATCH (5) characters in the network portion
+ * Returns the rightmost minimum matched characters in the network portion
* in *reversed* order
*
* This can be used to do a database lookup against the column
@@ -747,7 +777,7 @@
public static String
toCallerIDMinMatch(String phoneNumber) {
String np = extractNetworkPortionAlt(phoneNumber);
- return internalGetStrippedReversed(np, MIN_MATCH);
+ return internalGetStrippedReversed(np, getMinMatch());
}
/**
@@ -1709,26 +1739,6 @@
return normalizedDigits.toString();
}
- // Three and four digit phone numbers for either special services,
- // or 3-6 digit addresses from the network (eg carrier-originated SMS messages) should
- // not match.
- //
- // This constant used to be 5, but SMS short codes has increased in length and
- // can be easily 6 digits now days. Most countries have SMS short code length between
- // 3 to 6 digits. The exceptions are
- //
- // Australia: Short codes are six or eight digits in length, starting with the prefix "19"
- // followed by an additional four or six digits and two.
- // Czechia: Codes are seven digits in length for MO and five (not billed) or
- // eight (billed) for MT direction
- //
- // see http://en.wikipedia.org/wiki/Short_code#Regional_differences for reference
- //
- // However, in order to loose match 650-555-1212 and 555-1212, we need to set the min match
- // to 7.
- @UnsupportedAppUsage
- static final int MIN_MATCH = 7;
-
/**
* Checks a given number against the list of
* emergency numbers provided by the RIL and SIM card.
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index fd47561..35b435d 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -2418,6 +2418,10 @@
* <p>
* The ISO-3166 country code is provided in lowercase 2 character format.
* <p>
+ * Note: In multi-sim, this returns a shared emergency network country iso from other
+ * subscription if the subscription used to create the TelephonyManager doesn't camp on
+ * a network due to some reason (e.g. pin/puk locked), or sim is absent in the corresponding
+ * slot.
* Note: Result may be unreliable on CDMA networks (use {@link #getPhoneType()} to determine
* if on a CDMA network).
* <p>
diff --git a/telephony/java/android/telephony/emergency/EmergencyNumber.java b/telephony/java/android/telephony/emergency/EmergencyNumber.java
index 511adf6..19d0724 100644
--- a/telephony/java/android/telephony/emergency/EmergencyNumber.java
+++ b/telephony/java/android/telephony/emergency/EmergencyNumber.java
@@ -22,6 +22,7 @@
import android.hardware.radio.V1_4.EmergencyServiceCategory;
import android.os.Parcel;
import android.os.Parcelable;
+import android.telephony.CarrierConfigManager;
import android.telephony.PhoneNumberUtils;
import android.telephony.Rlog;
@@ -301,6 +302,9 @@
* The character in the number string is only the dial pad
* character('0'-'9', '*', '+', or '#'). For example: 911.
*
+ * If the number starts with carrier prefix, the carrier prefix is configured in
+ * {@link CarrierConfigManager#KEY_EMERGENCY_NUMBER_PREFIX_STRING_ARRAY}.
+ *
* @return the dialing number.
*/
public @NonNull String getNumber() {
diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java
index a478606..20aba4d 100644
--- a/telephony/java/android/telephony/ims/ImsReasonInfo.java
+++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java
@@ -871,6 +871,19 @@
*/
public static final int CODE_REJECT_ONGOING_CS_CALL = 1621;
+ /**
+ * An attempt was made to place an emergency call over WFC when emergency services is not
+ * currently available in the current location.
+ * @hide
+ */
+ public static final int CODE_EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE = 1622;
+
+ /**
+ * Indicates that WiFi calling service is not available in the current location.
+ * @hide
+ */
+ public static final int CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION = 1623;
+
/*
* OEM specific error codes. To be used by OEMs when they don't want to reveal error code which
* would be replaced by ERROR_UNSPECIFIED.
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index dcfd193..a65acac 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -319,6 +319,7 @@
/**
* Replaced by getDataActivityForSubId.
*/
+ @UnsupportedAppUsage(maxTargetSdk = 28)
int getDataActivity();
/**
@@ -336,6 +337,7 @@
/**
* Replaced by getDataStateForSubId.
*/
+ @UnsupportedAppUsage(maxTargetSdk = 28)
int getDataState();
/**
diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index dc026d4..98fee83 100644
--- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -49,8 +49,10 @@
void notifySignalStrengthForPhoneId(in int phoneId, in int subId,
in SignalStrength signalStrength);
void notifyMessageWaitingChangedForPhoneId(in int phoneId, in int subId, in boolean mwi);
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void notifyCallForwardingChanged(boolean cfi);
void notifyCallForwardingChangedForSubscriber(in int subId, boolean cfi);
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void notifyDataActivity(int state);
void notifyDataActivityForSubscriber(in int subId, int state);
void notifyDataConnection(int state, boolean isDataConnectivityPossible,
@@ -63,8 +65,10 @@
@UnsupportedAppUsage
void notifyDataConnectionFailed(String apnType);
void notifyDataConnectionFailedForSubscriber(int phoneId, int subId, String apnType);
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void notifyCellLocation(in Bundle cellLocation);
void notifyCellLocationForSubscriber(in int subId, in Bundle cellLocation);
+ @UnsupportedAppUsage(maxTargetSdk = 28)
void notifyOtaspChanged(in int subId, in int otaspMode);
@UnsupportedAppUsage
void notifyCellInfo(in List<CellInfo> cellInfo);
diff --git a/telephony/java/com/android/internal/telephony/SmsApplication.java b/telephony/java/com/android/internal/telephony/SmsApplication.java
index 6df5457..90e2c1f 100644
--- a/telephony/java/com/android/internal/telephony/SmsApplication.java
+++ b/telephony/java/com/android/internal/telephony/SmsApplication.java
@@ -300,7 +300,7 @@
Uri.fromParts(SCHEME_SMSTO, "", null));
List<ResolveInfo> respondServices = packageManager.queryIntentServicesAsUser(intent,
PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
- UserHandle.getUserHandleForUid(userId));
+ UserHandle.of(userId));
for (ResolveInfo resolveInfo : respondServices) {
final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
if (serviceInfo == null) {
diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp
index 54f0816..31aa249 100644
--- a/tools/aapt2/dump/DumpManifest.cpp
+++ b/tools/aapt2/dump/DumpManifest.cpp
@@ -468,14 +468,12 @@
}
if (platformVersionName) {
printer->Print(StringPrintf(" platformBuildVersionName='%s'", platformVersionName->data()));
- }
- if (platformVersionNameInt) {
+ } else if (platformVersionNameInt) {
printer->Print(StringPrintf(" platformBuildVersionName='%d'", *platformVersionNameInt));
}
if (platformVersionCode) {
printer->Print(StringPrintf(" platformBuildVersionCode='%s'", platformVersionCode->data()));
- }
- if (platformVersionCodeInt) {
+ } else if (platformVersionCodeInt) {
printer->Print(StringPrintf(" platformBuildVersionCode='%d'", *platformVersionCodeInt));
}
if (compilesdkVersion) {
diff --git a/tools/preload-check/Android.bp b/tools/preload-check/Android.bp
index 2488341..87b31d2 100644
--- a/tools/preload-check/Android.bp
+++ b/tools/preload-check/Android.bp
@@ -19,4 +19,5 @@
libs: ["tradefed"],
test_suites: ["general-tests"],
required: ["preload-check-device"],
+ data: [":preload-check-device"],
}
diff --git a/tools/preload-check/device/Android.bp b/tools/preload-check/device/Android.bp
index 7782b0d..f40d8ba 100644
--- a/tools/preload-check/device/Android.bp
+++ b/tools/preload-check/device/Android.bp
@@ -20,7 +20,6 @@
sdk_version: "current",
srcs: ["src/**/*.java"],
- test_suites: ["general-tests"],
dex_preopt: {
enabled: false,
},
diff --git a/wifi/tests/runtests.sh b/wifi/tests/runtests.sh
index 219a45e..7a0dfb0 100755
--- a/wifi/tests/runtests.sh
+++ b/wifi/tests/runtests.sh
@@ -12,7 +12,7 @@
echo "+ mmma -j32 $ANDROID_BUILD_TOP/frameworks/base/wifi/tests"
# NOTE Don't actually run the command above since this shell doesn't inherit functions from the
# caller.
-make -j32 -C $ANDROID_BUILD_TOP -f build/core/main.mk MODULES-IN-frameworks-base-wifi-tests
+$ANDROID_BUILD_TOP/build/soong/soong_ui.bash --make-mode MODULES-IN-frameworks-base-wifi-tests
set -x # print commands